Болезнь, 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
    Поделиться публикацией

    Комментарии 49

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

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

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

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

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

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

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

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

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

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

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

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

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

                                      Nemerle — для .NET

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                                              Смотрю прайслист Майкрософта на
                                                              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
                                            > а вот попробуй на SML написать что-нибудь для ASP.NET, к примеру

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

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

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

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

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

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

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

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

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

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

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

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

                                              Самое читаемое