воскресенье, 28 марта 2010 г.

Code Contracts в .NET и монополия C#

В последней (четвертой) версии .NET и, соответственно, в VS2010, появились средства спецификации параметров, пред- и постусловий, инвариантов классов и всего того, что с подачи Бертрана Майера называется Code Contracts или Design by Contract.

Вот пара ссылок:
- Объява из Микрософта;
- Список статей по теме.

Неутомимый и вездесущий Дино Эспозито уже, конечно, отозвался на это новшество несколькими постами:

- Assert/Assume
- Invariants
- Preconditions
- Postconditions

Документ с полным описанием новых средств .NET, помеченный этим январем, лежит у Микрософта здесь.

Многие интересующиеся об этом уже знают, но вот что интересно заметить. Возникает ощущение (и чем дальше, тем больше это ощущение крепнет), что Микрософт стремится втиснуть в .NET поддержку всего, что вообще есть в программировании. Начав с введения в виртуальную машину и MSIL нормальной системы типов и стековой модели выполнения, адекватной императивным языкам (и, естественно, отразив все это в базовом языке C#), они постепенно начали добавлять - и в систему, и в язык - все новые и новые возможности, иногда даже приниципиально отличающиеся от императивной парадигмы. Типовая параметризация, технология LINQ, динамическая типизация, теперь вот - контрактное программирование.

Каждое отдельное нововведение объясняется вполне понятными причинами: и обобщенное программирование нужно и полезно (кто спорит?), и работа с БД непосредственно из программ, и поддержка функциональной парадигмы ("функциональная мафия" из Кембриджского отделения Microsoft Research активность не снижает :-)), и динамическая типизация нужна, чтобы поддерживать скриптовые языки...

Принципиально важно в контексте моих рассуждений то, что все эти новшества получают свою поддержку в базовом языке. И вот в один прекрасный день обнаружится, что программировать под .NET имеет смысл только в этом базовом языке - в C# есть все, и это "все" адекватно поддерживается платформой .NET!

Наверное, я несколько сгущаю краски, и всегда останутся энтузиасты, предпочитающие и в .NET программировать на F#, Nemerle, Хаскелле, Питоне. Просто ниша для использования этих языков в рамках .NET сузится до совершенно микроскопических размеров.

Но вот как быть с такими промышленными языками, как Eiffel и Scala? С введением поддержки контрактного программирования C# практически полностью "покроет" почти все преимущества Эйфеля, а то немногое особенное, что еще есть в этом языке, вряд ли окажется причиной выбора этого языка для реальных проектов. И сейчас не очень понятно, какова популярность Эйфеля как такового (в индексе TIOBE он сильно ниже первых пятидесяти языков), а его присутствие в мире .NET кажется совершенно эфемерным...

Проект портирования Скалы на .NET все еще, вроде бы, имеет некоторый смысл (уж больно мощный и привлекательный язык, и даже после появления в C# "функциональных" черт в Скале все еще остаются вполне уникальные и очень удобные для программирования свойства), но все равно, потенциальная пользовательская база для этого языка наверняка существенно сократится...

Повторяю: я не говорю, что происходит катастрофа,- видна тенденция: мы все дальше и дальше отодвигаемся от идиллической картины, десять лет назад нарисованной нам маркетологами из Микрософта: мол, неважно, на каком языке программировать, выбирай любой, лишь бы компилятор генерировал CIL-совместимый код.

"Пусть расцветает тысяча цветов" (или как это китайцы говорили)...