Nemerle

Материал из Википедии — свободной энциклопедии
Текущая версия страницы покане проверялась опытными участниками и может значительно отличаться отверсии, проверенной 23 января 2016 года; проверки требуют11 правок.
Перейти к навигацииПерейти к поиску
Nemerle
Изображение логотипа
Семантикамультипарадигменный,объектно-ориентированный,функциональный,императивный
Класс языкаязык программирования, процедурный, объектно-ориентированный, функциональный, мультипарадигмальный и язык, использующий отступы[вд]
Тип исполнениякомпилируемый
Появился в0.9.3 —16 мая2006
АвторВроцлавский университет;Михал Москаль,Камиль Скальски, Павел Ольшта и др.[1]
РазработчикJetBrains
Расширение файлов.n
Выпуск1.2.547.0 (01.09.2017)
Система типовстатическая,строгая,с автовыводом,номинальная
Испытал влияниеC#,ML,OCaml,Haskell,Лисп
Лицензиямодифицированная лицензия BSD
Сайтnemerle.org
ПлатформаCLI (.NET / Mono)

Nemerle —гибридный языквысокого уровня состатической типизацией, сочетающий в себе возможностифункционального иобъектно-ориентированного программирования, для платформ.NET иMono (язык компилируется вCIL и являетсяCLS-совместимым). Главная особенность языка — развитая системаметапрограммирования.

Содержание

История

[править |править код]

Разработка языка Nemerle началась в 2003 году в университетеВроцлава (Польша). Команда разработчиков состояла всего из трёх человек, все они на момент начала разработки были аспирантами Вроцлавского университета. Михал Москаль — лидер команды и автор системы вывода типов, Камиль Скальски — разработчик системы макросов и расширяемого парсера, и Павел Ольшта — автор кодогенератора и реализации механизма сопоставления с образцом.

Название языка происходит от имени мага Nemmerle из «Волшебника Земноморья»Урсулы Ле Гуин.

Язык изначально проектировался под платформу .NET. 12 марта 2010 года была выпущена первая бета-версия компилятора языка, поддерживающая работу приложений под управлением .NET 3.5. Язык, его реализация и документация выпускаются под свободной BSD-подобной лицензией, допускающей свободное использование их в любых целях.

Первый релиз (версия 1.0) комплекта ПО для программирования на Nemerle выпущен 13 мая 2011 года, на текущий момент самой свежей является версия 1.2, работающая на платформе .NET 4.0. В комплект, доступный для свободного скачивания, входит инсталлируемый компилятор языка и набор библиотек для встраивания в Microsoft Visual Studio 2008, отдельный компилятор (для работы без Visual Studio), экспериментальная версия ПО, интегрируемого с Visual Studio 2010, а также исходные коды. Текущая версия компилятора поддерживает включение в проект кода на C# 6.0, при условии неиспользования небезопасного кода.

С июня2012 года команда разработчиков Nemerle стала частью компанииJetBrains, которая займётся дальнейшей разработкой и поддержкой языка.[1]

Характеристика языка

[править |править код]

Nemerle позиционируется как язык общего назначения. Он сочетает в себе несколькопарадигм программирования:объектно-ориентированное программирование,императивное программирование,функциональное программирование иметапрограммирование. Из-за такого сочетания концепций, написание программ на Nemerle возможно используя разные стили: в императивном подходе код будет аналогичен коду программ C# (за исключением некоторых нюансов напр. указания типа), в функциональном подходе исходный код будет родственен языкам семейства ML (ML, OCaml, F#, Haskell), включая их особенности:

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

Особенности

[править |править код]

Характерной особенностью Nemerle, как и всех языков,типизированных по Хиндли — Милнеру является мощная системавывода типов.

Вывод типов

[править |править код]
defx=1;// intdefmyList=List();// generic List[T], T должен выводиться из дальнейшего использованияmyList.Add(x);// благодаря этой строке компилятор определяет тип myList как List[int]

Все является выражением

[править |править код]
defx={// эквивалент x = 3defy=1;defz=2;y+z// последнее выражение в блоке является значением блока}defx=if(DateTime.Now.DayOfWeek==DayOfWeek.Monday)// if, using, try  - тоже являются выражениями"Monday"else"other day";defx=try{Int32.Parse(someString)}catch{|FormatException()=>0;}

Кортежи

[править |править код]
defk=(1,"one");// k : (int * string)def(a,b)=k;// a = 1, b = "one"

Сопоставление с образцом

[править |править код]
defresult=match(number){|0=>"zero"|1=>"one"|xwhenx<0=>"negative"|_=>"more than one"}
Другие примеры сопоставления с образцом

Сопоставление с привязкой к переменным:

defcheck(o:object){match(o){|iisint=>$"An int: $i"|sisstring=>$"A string: $(s.ToUpper())"|_=>"Object of another type"}}

Сопоставление у кортежей:

match(tuple){|(42,_)=>"42 on first position"|(_,42)=>"42 on second position"|(x,y)=>$"( $x, $y )"}

Сопоставление поRegexp:

usingNemerle.Text;regexpmatch(str){|"a+.*"=>printf("a\n");|@"(?<num : int>\d+)-\w+"=>printf("%d\n",num+3);|"(?<name>(Ala|Kasia))? ma kota"=>match(name){|Some(n)=>printf("%s\n",n)|None=>printf("noname?\n")}|_=>printf("default\n");}


Функциональные типы и локальные функции

[править |править код]
defnext(x){x+1};defmult(x,y){x*y}deffibbonacci(_){|0=>0|1=>1|i=>fibbonacci(i-1)+fibbonacci(i-2)}Console.WriteLine(next(9));// 10Console.WriteLine(mult(2,2));// 4Console.WriteLine(fibbonacci(10));// 55

Метапрограммирование

[править |править код]

Nemerle позволяет создавать, анализировать и модифицировать код программы во время компиляции с помощью макросов. Макросы могут быть использованы в виде вызова метода либо в виде новых конструкций языка. Большая часть конструкций в языке реализована с помощью макросов (if, for, foreach, while, using и т. д.).

Пример макроса «if»:

macro@if(cond,e1,e2)syntax("if","(",cond,")",e1,Optional(";"),"else",e2){/*    <[ ]> // <[ ]> определяет области квазицитирования, код внутри них преобразуется в AST Немерле,          аналогично преобразованию кода в Expression компилятором C#  */<[match($cond:bool){|true=>$e1|_=>$e2}]>}// Вышеприведённый макрос вводит в язык конструкцию if,defmax=if(a>b)aelseb;// которая при компиляции раскрывается вdefmax=match(a>b){|true=>a|_=>b}

Основные концепции

[править |править код]
  • Типобезопасные «гигиеничные»макросы и квазицитирование c возможностью расширения синтаксиса.
  • Наличие локальных функций (лексическихзамыканий). Функция являетсяобъектом первого класса.
  • Гарантированная оптимизацияхвостовой рекурсии, то есть хвостовая рекурсия всегда заменяется циклом при компиляции.
  • Выведение типов. В частности, возможно выведение типов локальных переменных и выведение сигнатуры локальных функций.
  • Отсутствие четкой границы между инструкцией (statement) и выражением (expression). «Everything is expression». Например, условный оператор может находиться внутри арифметического выражения. Нет необходимости в инструкции return.
  • Блоки кода, упраздняющие необходимость в таких инструкциях, как break или continue.
  • Алгебраические типы данных, кортежи и сопоставление с образцом.
  • Упрощенный синтаксис работы сосписками. Списочные литералы.
  • Частичное применение операторов и функций — простая генерация обёртки некоторой функции, в которой часть параметров подставлена заранее, а часть передаётся непосредственно при вызове функции.

Особенности синтаксиса

[править |править код]

Синтаксис Nemerle очень близок к C#, но имеет ряд характерных отличий, в том числе позаимствованных из функциональных и скриптовых языков. Вот некоторые из них:

  • Наряду с обычным порядком заключения элементов программы (классов, составных операторов, тел методов) в фигурные скобки, поддерживается альтернативный вариант описания структуры программы, базирующийся на отступах, как в Python.
  • В описании переменных и методов тип указывается в стиле OCaml (похоже на Pascal, но без возможности задать несколько имен переменных) в виде «переменная : тип».
  • Имена могут, помимо букв, цифр и знака подчёркивания, содержать знак апострофа «'».
  • Объявления локальных функций и констант начинаются с def.
  • Наряду с унаследованным от C# объявлением главной функции программы в виде статического метода Main головного класса программы поддерживается прямое размещение кода в файле без помещения его в какой-либо класс или метод.
  • Переменные объявляются с помощью модификатора mutable (а не def). Таким образом, синтаксис поощряет использование неизменяемых объектов, что соответствует идеологии функционального программирования.
  • Создание экземпляра класса выполняется вызовом его конструктора — «ИмяКласса(параметры конструктора)» без необходимости указывать ключевое слово new (как это принято в C#).
  • Команда подключения пространства имён using подключает все вложенные пространства имён, а также позволяет прямо подключить конкретный тип, что даёт возможность использования его статических членов (например, методов классов или констант перечислений) без квалификации имени.
  • Статические классы (классы, имеющие только статические методы и поля) описываются с ключевым словом module вместо class и не требуют указания модификатора static перед каждым членом класса.
  • Введены две отдельные конструкции для статического уточнения и динамического приведения типов (: и:> соответственно).
  • В стандартной библиотеке имеется тип «список» (list), являющийся однонаправленным связанным списком. Списки являются неизменяемыми и ведут себя во многом аналогично строкам C#. Для этого типа в языке предусмотрен специализированный синтаксис, значительно упрощающий работу с ним (литералы, возможность использования списка в сопоставлении с образцом).
  • Введён тип «вариант» (variant) — аналог алгебраических типов в функциональных языках.
  • Введён тип «кортеж» (tuple) — безымянная, незменяемая структура данных, содержащая несколько (возможно разнотипных) элементов. Для кортежей поддерживается структурное соответствие. Кортежи удобны, когда требуется вернуть несколько значений из функции, свойства или просто организовать любое выражение.
  • Конструкцию переключения switch заменила конструкция сопоставления с образцом match, обладающая большими возможностями (позаимствовано из ML-подобных языков).
  • Гарантировано преобразование компилятором хвостовой рекурсии в цикл. Это позволяет описывать повторяющиеся вычисления рекурсивно, не опасаясь, что применение рекурсии приведёт к исчерпанию памяти. Поддерживается только для одной функции. Поддержка взаимно-рекурсивных функций пока что не реализована.
  • Отсутствует специальный синтаксис (используемый в C#) дляфинализатора (конструкция «~ИмяКласса()»), как провоцирующий ошибочное понимание у программистов, знакомых с C++. Финализатор описывается как обычный виртуальный метод Finalize(), причём компилятор не обеспечивает автоматический вызов финализатора класса-родителя.
  • Имеется возможность объявления значений используемых по умолчанию в параметрах и синтаксис вызова с явным указанием имён параметров в произвольном порядке.
  • В стандартной библиотеке языка есть три макроса, реализующих условные операторы: if, отличающийся тем, что в нём обязательна ветвь else, when, представляющий собой «if без else», и unless, представляющий собой отрицание when, то есть «when (! условие) выражение». Все условные операторы переписываются соответствующими макросами в оператор match.
  • В параметрах, аргументах и именах переменных допускается использование специального подстановочного символа-заместителя «_». Будучи указанным в начале имени переменной или вместо него (то есть если указан только знак подчеркивания), этот символ подавляет предупреждение компилятора о неиспользованной переменной. Использование подчеркивания вместо имени локальной переменной (например, «_ = f(a, b)») позволяет игнорировать значение вычисления (в тех же целях можно использовать стандартный макрос ignore следующим образом: «ignore(f(a, b))»). C# игнорирует их автоматически, что иногда приводит к ошибкам. Nemerle выдает предупреждение, если результат вычисления не используется в дальнейшем. Приведенный прием позволяет указать компилятору, что игнорирование результата сделано не случайно.
  • Почти все языковые конструкции (кроме using, class и т. д.) определены как имеющие значение и могут быть использованы в качестве элементов выражений. Однако, выражение может иметь тип void, что соответствует statement в C#.
  • В языке поддерживается функциональный тип (обычный для функциональных языков). С его помощью можно по месту описать ссылку на функцию. В C# для передачи ссылок на функции используются делегаты. Nemerle также поддерживает их, но функциональный тип является более удобным, гибким и быстрым решением. Он не требует объявления отдельного типа (как делегат) и не может быть множественным (multicast).
  • В языке поддерживаетсячастичное применение функций и операторов, что позволяет создавать функции «на лету». Например, если в некоторую функцию требуется передать другую функцию (например, функцию сложения), то можно частично применить оператор сложения. Выражение «_ + 2» возвращает функцию с одним целочисленным аргументом, прибавляющую к нему значение 2.

Средства метапрограммирования

[править |править код]

Ряд языковых средств кардинальным образом отличает Nemerle от C#, Java, C++. Это макросы и замыкания, причём в виде, более характерном для Lisp или других функциональных языков, нежели для C++. Система макросов позволяет описывать на Nemerle новые синтаксические конструкции и использовать их наравне со встроенными. В действительности, большинство директивных управляющих конструкций, в том числе операторы if, when, циклы всех видов, реализованы в виде макросов стандартной библиотеки Nemerle.

Среда разработки

[править |править код]

Кроме большого количества поддерживаемых редакторов типа emacs, vi, итд. Nemerle имеет бесплатную полноценнуюIDE, основанную наVisual Studio 2008 Shell, а такжеможет интегрироваться с полноценнойVisual Studio 2008,Visual Studio 2010,Visual Studio 2015. Основные механизмы интеграции с VS вынесены в отдельную сборку, не зависящую от VS, так что желающие могут добавить поддержку Nemerle в другие IDE.

См. также

[править |править код]

Примечания

[править |править код]
  1. Твиттер / orangy: We’ve decided to bring Nem . Дата обращения: 23 июня 2012. Архивировано 4 марта 2014 года.

Ссылки

[править |править код]
  • Main Page (англ.). — домашняя страница проекта. Дата обращения: 10 октября 2006. Архивировано изоригинала 11 февраля 2012 года.
  • Project Hosting on Google Code (англ.). — исходные коды проекта. Дата обращения: 5 февраля 2010. Архивировано изоригинала 11 февраля 2012 года.
  • Nemerle . — форум по Nemerle на русском языке. Дата обращения: 10 октября 2006. Архивировано изоригинала 11 февраля 2012 года.
  • Nemerle . — конференция по Nemerle на английском языке. Дата обращения: 10 октября 2006. Архивировано изоригинала 11 февраля 2012 года.
  • Nemerle . — конференция по Nemerle на английском языке. Архивировано изоригинала 11 февраля 2012 года.
  • Nemerle . — Краткий обзор языка и ссылки. Дата обращения: 10 октября 2006. Архивировано изоригинала 11 февраля 2012 года.
  • Quick Guide по-русски  (рус.). — Перевод "Nemerle. Quick Guide". Дата обращения: 1 мая 2009. Архивировано изоригинала 11 февраля 2012 года.
  • Цикл статей о Nemerle для начинающих
Перейти к шаблону «.NET»
.NET
Реализации
Архитектура
Инфраструктура
Языки Microsoft
Другие языки
Windows Foundations
Компоненты
Сравнения
Будущие технологии
Информационные ресурсы
Источник —https://ru.wikipedia.org/w/index.php?title=Nemerle&oldid=150421744
Категории:
Скрытые категории: