Pull to refresh

Comments 15

На нашем проекте, не так чтобы сильно крупном, после года разработки было решено их выпилить к чертям, т.к. билды и автоматизация тестирования (что требует постоянных билдов на тачке) жутко замедлялись. Крайне не советуем -) Прямо на текущем спринте к нам придет счастье =)
У меня в текущем проекте (200К строк где-то) контракты используются сверх активно. Да, билд тормозится сильно. Но теперь есть планы и возможности по устранению этих проблем.

Так что я все еще советую;)
UFO just landed and posted this here
Да, rewriting имеет сложность O(N) от количества зависимостей переписываемой сборки (нужно получить полное транзитивное замыкание всех зависимостей прежде чем можно будет вычислить контракты класса). Это одна из причин существенного замедления ccrewrite при увеличении числа проектов (поскольку обычно при том растет и число зависимостей каждого из них).
UFO just landed and posted this here
Да, исходники открыты с начала года. Но там довольно высокий порог вхождения, ИМХО. В статическом анализаторе вообще без бутылки и PhD не раобраться. В rewriter-е разобраться можно, но тоже довольно трудоемко.

По теме: контракты вообще по своей природе не очень хорошо дружат с многопоточностью. В Eiffel-е есть SCOOP, но даже там дружба контрактов и многопоточности далека от идеала. Я бы посоветовал вот что (чем пользуюсь активно): постараться избегать мутабельного состояния, переходя к чистым функциям и таскам. В этом случае число инвариантов сведется к минимуму (формально, у неизменяемого объекта они не нужны: предусловий конструктора достаточно), что уменьшит проблемы от использования в многопоточном окружении.

З.Ы. У rewriter-а есть очень нехорошее поведение. Когда есть анонимный метод, проверяющий постусловие и захватывающий только Contract.Result, то в этом случае ccrewrite генерирует некорректный с точки зрения многопоточности код, протаскивая результат через статическое свойство.
Можно ли заставить rewriter поддерживать гигантские assemblies состоящие из множества .netmodule и насколько просто сделать это?
Там нужно вначале выяснить, что именно тормозит. Есть все шансы, что проблемы не в самом rewriter-е, а в CCI — туле, который используется для анализа и генерации IL-а. Если это так, то решать глобальную проблему с производительностью нужно будет глобальным образом — переходом на CCI2 (есть и такое) или на Розлиновские потроха для чтения/генерации IL-а. Но такие радикальные шаги будет довольно сложно реализовать.
Спасибо.
Насколько я знаю, проблема вообще в неподдержке многофайловых assembly в принципе, а не в тормозах. Но сам в это не погружался.
Я не совсем понял мысль. О какой «неподдержке» идет речь? Тул этот асболютно standalone, тут нет разницы между MS и non-MS assemblies.
Понял. Да, вполне возможно, что так и есть.
А чтобы юзать CodeContracts обязательно нужно соглашаться на перепись бинарки? Просто, ну, не нравится мне идея, что нечто (кто-то) будет переписывать то, что команда написала, ну, вот прям совсем не нравится.
Сейчас это — by design. Ну и с альтернативами ведь довольно плохо все. Ведь основная фишка контрактов (ладно, одна из основных) — это возможность включать/отключать некоторые утверждения по требованию. Вот одна сборка, там нужно все — включая инварианты, а вот эта — тут оставляем только предусловия. А вот здесь мы вообще хотим положить контракты рядом, чтобы они никак не влияли на эффективность нашего кода, но использовались нашими клиантами, если они захотят. В общем, вменяемая альтернатива — это впиливать это на уровне компилятора. И недавно даже proposal появился, хотя ХЗ, что из него выйдет и выйдет ли вообще что-то.
Спасибо за статью! Особенно порадовало упоминание Midori. Я-то думал, что проект давно загнулся, и мы обречены сидеть под виндами до скончания веков…
Sign up to leave a comment.

Articles