Болезнь, Nemerle

imageNemerle — язык под .NET, который поддерживает три парадигмы программирования: та, которую большинство программистов считает за ООП парадигму, функциональную парадигму (алгебраические типы данных, pattern-matching) и метапрограммирование (АОП, квазицитирование, расширение синтаксиса самого nemerle через макросы a-la lisp ). Все это положено на рельсы строгой статической типизации и приправлено мощной системой вывода типов.


В единое целое это объединено следующим образом: структуру программы задают классы, то есть внешне код похож на старый добрый C#, но за жизнь внутри метода отвечает ФП. Метапрограммирование заметить сложно — оно может быть замаскировано под атрибут у класса или «стандартную» конструкцию while, которая на самом деле является макросом, который при компиляции макроса разворачивается в хвостовую рекурсию, которая уже в свою очередь преобразуется в цикл на IL компилятором «чистого» nemerle. Говорю чистого, так как почти все управляющие команды в nemerle, такие как if, when, unless, while, for реализованы в виде макросов. Таким образом можно писать код на nemerle, не знать ничего про метапрограммирование, но во всю его использовать и не подозревать об этом. Кратко, если вы ничего не слышали о нем, то это не помешает вам кодить на nemerle. Это так же касается и ФП — вам никто не мешает использовать функции с side effects. Но даже если начать писать код на nemerle, как будто это C# и забить на мету, ФП, то можно приятно удивиться — nemerle поддерживает кортежи, параметры по умолчанию и заменяет делегаты на функциональные типы, то есть решает проблему совместимости делегатов с одинаковой сигнатурой — вместо Func<int,int> достаточно писать только сигнатуру, например, int->int.

Это я узнал из статей на RSDN, блогов и документации, но всегда сам хотел попробовать пописать на nemerle. К сожалению я не сделал этого раньше по разным причинам — либо работал с людьми, которые не разделяли моей точки зрения, на то, каким должен быть удобный язык программирования, либо боялся начать большой проект на новом языке; но честно говоря было просто лень. Пару дней назад меня подкосил грипп и я решил осуществить мечту — писать на nemerle. Подопытным кроликом стал мой долгоиграющий проект на шарпе, который является моим хобби уже на протяжении нескольких месяцев. Может когда-нибудь я напишу о нем на хабре, но пока без подробностей: одна из основных функций разбор выражений и работа с деревьями, представляющих эти выражения. Эту часть было легко покрыть тестами, поэтому я придерживался TDD при разработке, в итоге на 71 файл у меня был 73 теста. Такое полное покрытие тестами придало мне уверенности и я решился на такой рефакторинг, как смена языка. За три дня я полностью переписал код на nemerle это расширило мои представление о нем.

Мне язык показался очень удобным, так как там, где я не хотел переписывать код в стиле nemerle я выключал мозг и занимался механическим переносом кода с шарпа на nemerle, но там, где я считал разумным использовать ФП стиль я его использовал, и это помогло сократить размер проекта до 38 файлов. Такого результата я смог достичь благодаря тому, что использовал ФП там, где его место, а именно разбор выражений и работа с деревьями: дерево в функциональных языка естественно представлять как алгебраический тип данных, что значительно упрощает работу с ним. После моего знакомства с nemerle, я пересмотрел список своих любимых универсальных языков программирования, теперь первое место занимает nemerle как представитель статической типизации и xotcl, который представляет динамический отряд.

Этой статьей я хотел лишний раз напомнить о том, что тестирование это круто, и обратить внимание хабрасообщества на nemerle.

Ниже небольшой коллаж, который отражает уровень интеграции nemerle и MS VS 2008, а так же синтаксис языка.

image
+45
15 декабря 2008, 20:35
18
shai_xylyd 38,0

комментарии (49)

0
alex_blank #
стоит упомянуть, что для Nemerle есть довольно качественная интеграция с MS Visual Studio — благодаря людям с RSDN

потому что никто не променяет удобство MSVC# IDE на язык красивый, но с «голой задницей» :)
+4
shai_xylyd #
Да, Влад проделал гигантскую работу. Эта интеграция входит в дистрибутив, который можно скачать с официального сайта.
+4
Vass #
Мне кажется, что, если бы не Влад, который помимо огромной работы по компилятору, написал кучу статей и двинул Nemerle в массы (во всяком случае в России), язык вообще мог так и остаться лишь диссертацией парочки польских аспирантов.
0
XaocCPS #
Кто такой Влад? Можно для непосвященных подробности?
–5
gaki #
Вам не надо знать подробностей про Влада — Влад сам знает все подробности про вас!
(я чисто потроллить, я тоже ни фига не знаю, кто он такой)
+6
krasin #
+5
XaocCPS #
Автор, а где примеры кода, синтаксиса, отличий от C#?
У меня лично по материалам статьи не получилось составить никакого мнение о языке. Прочитал только ваши впечатления.
0
ulfurinn #
+1
Vass #
Здесь можно почитать по-русски, собственно сборник статей Влада
www.rsdn.ru/summary/4022.xml
0
shai_xylyd #
Если поверхностно, то тип, при объявлении переменной, указывается после имени самой переменной через двоеточие (как в паскале?). Но зачастую это можно опускать, так как компилятор сам догадается. Другая особенность — все внутри метода является выражением. Более приятные отличия я уже указал в статье — кортежи, функциональные типы вместо делегатов; забыл правда про то, что внутри метода можно объявлять локальные функции. Удобно мыслить, что внутри метода весь код функциональный или процедурный, а масштабом выше ООП.
+1
shai_xylyd #
Спасибо, что заметили, я специально пытался писать так, что бы описание языка свести к необходимому минимуму, а именно, что он обладает строгой статической типизацией и является .net языком. Этого достаточно, что бы определить его как кандидата на замену C#. Во второй части я написал, что использование nemerle помогло сократить мне код в два раза и портирование заняло 3 дня, при условии что на nemerle я раньше не писал. Думаю этой информации достаточно, что бы решить изучать nemerle или нет.
0
alex_blank #
автор, перенеси топик в habrahabr.ru/blogs/nemerle
0
flomop #
shai_xylyd — как всегда на острие ножа!
–1
kosiakk #
чем отличается от Scala? Там реализованы те же идеи, но на JVM.

Плюс, уже давно существует, большая коммьюнити и отличная двунаправленная совместимость с Java.
+2
alex_blank #
>> чем отличается от Scala?

хотя бы тем, что оно для CLR

совсем разные инфраструктуры вокруг языка

сами языки отличаются существенно — в Nemerle всё построено вокруг макросов (как в Lisp), можно легко делать embedded DSL'и

Nemerle — язык экстремально плагинообразный (даже такие конструкции как while, for — это макросы из стандартной библиотеки)

Scala — монолитный
+1
shai_xylyd #
Русскоговорящее сообщество nemerle живет здесь. Возможно, оно самое активное сообщество пользователей nemerle в мире, по-крайней мере статьи на английском по метапрограммированию являются переводом русских статьей.
0
yelbota #
F#?
+2
shai_xylyd #
Да, но с человеческим лицом и макросами.
0
VlK #
Сразу вопросы:
1) Хотелось бы увидеть сравнение с Haskell, и понять, насколько он лучше и лучше ли;
2) Есть ли реализации подо что-либо, кроме CLR;
3) Технология лиценизированная или открытая;
4) Может ли язык работать в интерпретируемом режиме.
+1
shai_xylyd #
На Haskell я написал всего одну прогу, поэтому я не могу сравнивать, но nemerle это в первую очередь улучшенный C#, возможностями из haskell и LISP, поэтому функции и методы не обязаны быть чистыми.

Реализация nemerle распространяется под BSD и существует только под .net/mono, является ли само слово nemerle trademark я не знаю.

Да — nemerlish.
0
skiedr #
Я не хочу сказать ничего плохого про Nemerle, хотя его сриптовость и строгая типизация — это большой плюс. Но Nemerle никогда не будет mainstream.
А вот F#, рожденный в результате брака между Ocaml и .Net, иммет все шансы им стать.
Уже известно что он будет включен в поставку VS.2010
Это тоже язык со строгой типизацией, и у на нем тоже можно писать скрипты.
+1
shai_xylyd #
Что значит mainstream?
0
drbugy #
Очень популярный, иногда попсовый.
НЛО прилетело и опубликовало эту надпись здесь
0
chiaroscuro #
А чего в нем такого?

Судя по скрину — что-то нечистое, строго и статически типизированное, со странным синтаксисом. :) В общем, ничем не лучше SML или OCaml.

Прозреваю, что match() позволяет делать сравнение с образцом (наподобие case… of из Хаскеля), потом идут клозы, а внутри одного из них находится guard. :)
0
shai_xylyd #
Точно, те же яйца, только в профиль и под .net. Этот язык стоит рассматривать как улученный C#, возможностями из OCaml, lisp. То есть, кто пишет на nemerle, скорее всего раньше писали на C#, а те, кто использует F#, опять же скорее всего, перешли на него с Ocaml.
+1
alex_blank #
>> В общем, ничем не лучше SML или OCaml.

странное заявление…

Nemerle — для .NET

а вот попробуй на SML написать что-нибудь для ASP.NET, к примеру

или GUI на WPF к caml-коду привязать

тут можно сесть и решать конкретные задачи, а не заниматься сравнением сферических языков в вакууме
0
VlK #
Решать конкретные и популярные задачи на экспериментальном языке? Смутно представляю контору, которая сейчас на это может решиться. Эту часть все и без меня понимают…

Любой язык, фреймворк, API должны пообтесаться в каком-нибудь бурном открытом сообщесте с годика три-четыре; потом энтузиасты на нем должны суметь реализовать какой-нибудь прикладной проект, который будет сделан лучше, быстрее или проще аналогичных проектов на других инструментах…

И только потом кто-то из коммерческой тусовки задумается о такой технологии.

Думается, что заморачиваться на еще один полуспециализированный язык — дело дохлое и неблагодарное. Надо писать на каком-нибудь универсальном mainstream-языке — получится быстрее и эффективней; ну или маргинальном, но хотя бы испытанном временем. Скажем, тот же Haskell(да-да-да), OCaml, LISP…
0
alex_blank #
в одной из контор, где я работал, мы использовали пару раз Nemerle в качестве скриптового языка для внутренних нужд (tool chain)

т.к. Nemerle это еще один язык для .NET, его можно бесшовно присунуть в любой .NET-проект
0
VlK #
Ничего плохого не хочу сказать о ваших архитекторах, но… почему такой раритетный язык?… разве не лучше вшить в проект и, тем более, инструментарий что-то, что хотя бы отчасти знакомо большому число программистов? IronPython? JavaScript? что-нибудь-там-еще-из-популярных-и-полезных?

И, если говорить лично обо мне, то «привсунуть в любой .NET проект» означает то же самое, что «можно привсунуть ТОЛЬКО в .NET проект», причем код нельзя будет потом использовать нигде. А Маки? А *nix? А...?
+1
shai_xylyd #
nemerle доступен под mono.
0
VlK #
умные люди мне говорили, что Моно — это такая штука, от которой все начинает работать неторопливо :-)
НЛО прилетело и опубликовало эту надпись здесь
–1
VlK #
Вот для веба как раз таки и играет, в отличие от домашних систем. Большинство серверов сейчас, и последние полтора десятилетия — Apache на базе все тех же *nix. А если использовать что-то другое, то сразу приходится упираться в стоимость софта из нашего любимого комплекта.

Ну их в болото…

А ведь большая часть работы сейчас — это именно веб-приложения, не так ли?

НЛО прилетело и опубликовало эту надпись здесь
–1
VlK #
Стоимость хоста — одно, построение какой-то инфраструктуры на этом всем добре — совсем другое, вы же понимаете.

Пользователю все равно, что там в бэкэнде системы, если, конечно, мы говорим о действительно больших системах с собственной технической базой; ему важно, сколько она стоит. Ему б получать свою статическую или аяксовую страничку со стороны браузера, и как можно дешевле.

Представляете, во сколько обойдется коммерческая лицензия IIS + MsSQL( :-) так же база называется) + что-то-что-должно-быть-в-наборе?

Ой, флеймим :)))
НЛО прилетело и опубликовало эту надпись здесь
0
VlK #
Давайте обойдемся без «оказаться». Чем сложнее система, тем больше стоит лицензионный софт. Я недавно сравнивал стоимости лицензий Oracle, Ms SQL Server, DB2. Там вообще начинается разговор в стиле«за одно ядро», «за рабочее место», тра-та-та… Уже и на десятки тысяч идет учет… А то и сотни… Вы же видели такие прайслисты, не так ли? :)

>Если речь идёт не об обычном хостинге, а об инфраструктуре, то ситуация >становится гораздо интереснее. Вкратце — стоимость всех этих лецензий по >сравнению со стоимостью железа, зарплат, налогов и прочего начинает >составлять проценты. Где-то 5. :)

Раз уж мы заговорили об инфраструктуре, то 4Гб — очень немного, так что тут дешевой маркетинговой уловкой не обойтись. В моей фирме средней руки уже не раз и не два заканчивалось место на винтах, коих не мало. И это ведь были небольшие станции для пробных проектов, где даже толком база-то не использовалась.

А PostgreSQL будет стоить бесплатно в любых масштабах, и любом масштабировании.

>И даже здесь есть варианты, например, Server Web Edition, он дешевле. >Кстати, недавно раздавался бесплатно. :)

Опять же, в лицензиях тех версий обычно написано… Ну вы знаете, что там говорят о широком коммерческом применении. Никто и ничего в корпоративном мире просто так не раздает. Разве только дома у себя побаловаться на небольшом стартапе, и таким образом коммьюнити раззадорить, и собственных спецов научить.

>В целом, для любого бюджета решение на базе продуктов Microsoft >оказывается по стоимости соизмеримым. А учитывая преимущества для >разработчиков, могут оказаться и дешевле. :)

Не знаю. Работаю сейчас параллельно с PostgreSQL на Apache; и MsSQL. Никак не увижу преимуществ последнего в моих проектах.

И, наконец, разработчикам ведь надо еще со Студией работать для всей этой прелести. А это тоже бабки.

Давайте подведем итоги…

По мне так… Соль всех этих дешевых уловок заключается в том, чтобы урвать кусочек вашей-нашей прибыли, как только она появится, и надо будет развиваться.

«Легче-лучше» — это такая легенда. Это недавно начались разговоры о том, что, мол, «в конечном итоге окажется дешевле», когда стало ясно, что публика почему-то делает выбор в пользу LAMP.
НЛО прилетело и опубликовало эту надпись здесь
0
VlK #
Вот вы что-то начинаете давить авторитетом. Обиделись?

Смотрю прайслист Майкрософта на
www.microsoft.com/sqlserver/2005/en/us/Pricing.aspx

От бесплатных, но ограниченных Express и Compact до платных и со сложной схемой лицензирования Enterprise Edition за 25000 зеленых за процессор. Чего я здесь неправильно понимаю?

Дальше стоимости IIS:
www.microsoft.com/windowsserver2008/en/us/pricing.aspx

Дифференциируется от 200 до 8000 зеленых за всякие непонятные замуты, и отключенные фишки.

У нас же спор получается скучный, вы слышали все мои аргументы; я же десять раз слышал все ваши — они как из маркетинговых кампаний.
НЛО прилетело и опубликовало эту надпись здесь
–1
chiaroscuro #
> а вот попробуй на SML написать что-нибудь для ASP.NET, к примеру

А зачем? На SML пишут интерпретаторы, компиляторы и проверку теорем :)

> или GUI на WPF к caml-коду привязать

Это тоже незачем. Тем более, что мне не нравится WPF. :)

> тут можно сесть и решать конкретные задачи, а не заниматься сравнением сферических языков в вакууме

Это OCaml что ли «сферический язык в вакууме»? O_O
+1
alex_blank #
для моих задач — абсолютно сферический, т.к. нет нужной мне инфраструктуры
0
chiaroscuro #
Про твои задачи разговора не было. Умерь свое ЧСВ.
0
shai_xylyd #
Про задачи не было упоминания в вашем замечание про то, что nemerle ничем не лучше, чем ocaml. Следовательно можно считать, что это утверждение касается всех предметных областей, но alex_blank привел предметной области, где преимущество nemerle перед ocaml налицо, и вам не стыдно за свою реакцию на это?
0
chiaroscuro #
> Следовательно можно считать, что это утверждение касается всех предметных областей

Нет, можно считать, что Nemerle как язык ничем не лучше OCaml. Я об этом. Кстати, я не против Nemerle, используйте его, если Вам нравится. :)

У OCaml есть сильное сообщество и OCamlForge, а у Nemerle нету. Это гораздо больший минус для Nemerle, чем поддержка этого вашего WPF.

> но alex_blank привел предметной области, где преимущество nemerle перед ocaml налицо, и вам не стыдно за свою реакцию на это?

Нет, не стыдно. Есть там WPF, нету WPF, как-то все равно. Если там можно писать GUI-приложения в функционально-реактивном стиле, то такую интеграцию можно только привествовать, а если нет — то хрен редьки не слаще.
+3
ilya_ost #
Автор же в топике написал чем он лучше. Берем проект на C# и переписываем или дописываем куски в которых это удобно на Nemerle.
–6
blink #
Ещё один мёртворожденный язык…
+2
AndreyTS #
В Nemerle совершенно бесподобно совмещены эти три мира (ООП, ФП, макросы), и при этом язык весьма и весьма интуитивен (после C# и ознакомления с ФП всё вообще выглядит родным).

Я использовал его для небольших внутренних проектов, в части обработки данных, и полностью согласен с автором:
— в сферах, естественных для ФП использования ФП-возможностей Nemerle ускоряет разработку в разы,
— в других же можно спокойно писать в ООП-стиле, пользуясь удобными функциями по выводу типов и сопоставлению с образцом, также ускоряющими разработку.

Дорого бы дал, чтобы в VS 2010 увидеть родную поддержку не F#, а Nemerle. Но это скорее мечты :(

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.