Nemerle

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску
Nemerle
Файл:Nemerle Logo.png
Семантика:

мультипарадигменный, объектно-ориентированный, функциональный, императивный

Тип исполнения:

компилируемый

Появился в:

0.9.3 - 16 мая 2006 г.

Автор(ы):

Вроцлавский университет; Михаль Москаль, Камил Скальски, Павел Олшта и др. [1]

Типизация данных:

статическая

Испытал влияние:

C#, ML, OCaml, Haskell, Лисп

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

История

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

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

Язык изначально проектировался под платформу .NET. В настоящее время последней версией транслятора является версия 0.9.4.8198, выпущенная в декабре 2008 года. Последние версии, начиная с 0.9, работают под управлением .NET 2.0. Язык, его реализация и документация выпускаются под свободной BSD-подобной лицензией, допускающей свободное использование их в любых целях.

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

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

  • Типо-безопасные «гигиеничные» макросы и квази-цитирование 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 выдает предупреждение, если результат вычисления не используется в дальнейшем. Приведенный прием позволяет указать компилятору, что игнорирование результата сделано не случайно.
  • Все языковые конструкции определены как имеющие значение и могут быть использованы в качестве элементов выражений. Однако выражение может иметь тип void, что соответствует statement в C#.
  • В языке поддерживается функциональный тип (обычный для функциональных языков). С его помощью можно по месту описать ссылку на функцию. В C# для передачи ссылок на функции используются делегаты. Nemerle также поддерживает их, но функциональный тип является более удобным, гибким и быстрым решением. Он не требует объявления отдельного типа (как делегат) и не может быть множественным (multicast).
  • В языке поддерживается частичное применение функций (карринг) и операторов, что позволяет создавать функции "на лету". Например, если в некоторую функцию требуется передать другую функцию (например функцию сложения), то можно частично применить оператор сложения. Следующий пример «_ + 2», возвращает функцию с одним целочисленным аргументом прибавляющую к нему значение 2.

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

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

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

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

См. также

Ссылки

de:Nemerle en:Nemerle ja:Nemerle pl:Nemerle tg:Nemerle uk:Nemerle zh:Nemerle

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....