воскресенье, 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-совместимый код.

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

12 комментариев:

legolegs комментирует...

И что, в майкрософте надеются приделывать фичи к синтаксису си-шарпа до бесконечности? Боюсь, однажды они не смогут найти способ прикрутить ещё одну возможность. Закорючки кончатся. Или лисп получится :)

zouev комментирует...

Для legolegs:
Ну, когда кончатся закорючки, начнутся дополнительные служебные слова. Собсно, они уже появились: var, dynamic, from, where...

Хм, вообще-то можно ведь оценить "емкость" алфавита и примерно предсказать, когда возможности расширения синтаксиса закончатся. :-))

Анонимный комментирует...

Вообще-то уже лет 5 хохме о том, что "В .NET Вы можете писать на любом языке программирования, если этот язык - C#".

valexey комментирует...

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

Ну, хаскеля под .net таки нет. .net'овы языки это F#, Nemerle. F# как бы в студию 2010 входит. Изкаропки.

Питон в .нете постольку поскольку.

Scala раньше была под .net, теперь актуальной скалы вроде как и нету.

Собственно скала всё больше ориентируется на java. Оно и понятно -- java больше распространена и используется, нежели тот же .нет :-) Да и конкуренции там меньше.

А вот ценность например Ады (GNAT) под .net таки да, сомнительна. Хотя она есть. Но не полноценная.

Вообще, такое ощущение что C# уверенно превращается в PL/I :-)

Вообще, следует заметить, что на .net свет клином не сошелся. По кр. мере мне лично с ним приходится сталкиваться не шибко часто, а там где и приходится можно было б обойтись в принципе и без него.

Маленькая иллюстрация: toplevel (aka repl, интерпретатор короче) haskell'я (ghci) в загруженном состояни кушает 1.5 Мб ОЗУ. Рантайм erlang'a -- 2 мегабайта. toplevel F# -- 50 Мегабайт (грузится он соответственно долго). toplevel ocaml'a (по сути подмножеством которого является F#) -- около мегабайта.

Евгений Гребенников комментирует...

А что в этом плохого? Стандарт CLI открыт и никто не мешает энтузиастам потировать их любимые зыки под .net. С другой стороны разработчики на C#, как мейнстримового языка в .net, получают дополнительные возможности мощных языков программирования. К тому же все таки не программирвание для языков, а языки для программирования, или я ошибаюсь?

valexey комментирует...

Да... Не стоит всё же писать комментарии на ночь глядя -- какой-то хаотично-сумбурный комментарий вышел.

valexey комментирует...

> Стандарт CLI открыт и никто не
> мешает энтузиастам потировать их
> любимые зыки под .net.
А не получается. Шаг влево, шаг вправо -- расстрел.

CLI слишком высокоуровнев чтобы туда нормально ложились произвольные языки. См реализацию той же Ады под .net например.

C java та же проблема, кстати.

NikSoft комментирует...

Алексей Веселовский писал
"См реализацию той же Ады под .net например."
А где можно посмотреть(url)?
Заранее спасибо

Анонимный комментирует...

Да, такое ощущение, что C# перекрывает другие языки, есть. Но я не вижу в этом катастрофы. Мне кажется, это - нормальное развитие современного языка. Новый PL не получится - языком C# будут пользоваться и дальше. Тем более, что новые возможности вполне отделены от старых. А если Eiffel так легко убить, введя Contracts, то это - не в пользу Eiffel. Языки должны развиваться.

Меня удивляет какая-то ненависть к .NET и Микрософт заодно потому что они сделали богатый язык. Доходящая до полного отказа использовать .NET "из религиозных соображений" - сродни поведению полных линуксоидов. Странно, но никто не говорит почему-то, что в мире Java пишут в основном на Java.

Мне кажется, что ситуация с развитием C# вполне понятная - никто не знает, как надо развивать большой язык, а Microsoft предлагает некоторый путь, может, не очень четкий, но - путь. Просто помещает в C# всё, что используется в современном програмировании. Что не есть плохо. Тем более, если благодаря этому тот, ктопрограммирует на C#, получает конкурентные преимущества.

Поскольку .NET - открытая среда, то языки под .NET будут так или иначе писаться. Даже если они и не будут широко использоваться, то будут использоваться локально - их высокая совместимость с другим .NET-кодом обеспечит и им конкурентное преимущество.

Мне кажется, что возникла просто другая реальность - возможность писать новые языки для .NET есть, но она - другая: надо предложить что-то принципиально новое нежели предлагает C#. Я думаю, что здесь большая ниша у DSL-языков, на которые C# не претендует. Просто эта ниша еще не осознана.

valexey комментирует...

> А где можно посмотреть(url)?
> Заранее спасибо
Там же где весь остальной GNAT, т.е. на сайте Ada Core. Т.е. это не какой-то там левосторонний (ака третьесторонний) эксперимент, это вполне себе разработка официальная.

http://libre.adacore.com/libre/download2/?config=dotnet-windows&version=2009#

Анонимный комментирует...

> Мне кажется,
> что возникла просто
> другая реальность
А, насколько она НЕ виртуальна?...

Многие годы я писал и предпочитал паскалеподобные языки и оброн-подходы. На Си(++) делал проекты, но - как-то "через силу". Получал за них деньги и за язык - сертификаты.
Пока не встретил человеков, которые показали всю мощь и прелесть Си++. Читать Александреску или ещё какого-то фокусника - одно, а участвовать в проекте с творческими людьми - совершенно другое!
Спасибо Страуструпу и Степанову!

Peter Nikouline комментирует...

Рекомендую стать по теме
Code Contracts(CLR Inside Out)
http://msdn.microsoft.com/en-us/magazine/ee236408.aspx