Вяз (язык программирования) - Elm (programming language)

Вяз
Вяз танграм
ПарадигмаФункциональный
РазработаноЭван Чаплики
Впервые появился30 марта 2012 г.; 8 лет назад (2012-03-30)[1]
Стабильный выпуск
0.19.1 / 21 октября 2019 г.; 13 месяцев назад (2019-10-21)[2]
Печатная дисциплинаСтатический, Сильный, Предполагаемый
ЛицензияРазрешительный (Пересмотренный BSD )[3]
Расширения имени файла.elm
Интернет сайтвяз.org Отредактируйте это в Викиданных
Под влиянием
Haskell, Стандартный ML, OCaml, F #
Под влиянием
Redux,[4] Vuex[5]

Вяз это предметно-ориентированный язык программирования для декларативно создание веб-браузер -на основании графический пользовательский интерфейс. Вяз чисто функциональный, и разработан с упором на юзабилити, производительность и надежность. Он рекламирует "нет" время выполнения исключения на практике",[6] стало возможным благодаря компилятору Elm проверка статического типа.

История

Вяз был первоначально разработан Эваном Чаплицки в качестве диссертации в 2012 году.[7] Первый выпуск Elm сопровождался множеством примеров и онлайн-редактором, который упрощал опробование в веб-браузер.[8] Эван присоединился Prezi в 2013 году работать над Elm,[9] и в 2016 году переехал в NoRedInk как инженер с открытым исходным кодом, а также основал Elm Software Foundation.[10]

Первоначальная реализация компилятора Elm нацелена HTML, CSS, и JavaScript.[11] Набор основных инструментов продолжал расширяться, теперь он включает REPL,[12] менеджер пакетов,[13] путешествующий во времени отладчик,[14] и установщики для macOS и Windows.[15] У Elm также есть экосистема библиотек, созданных сообществом.[16] и продвинутый онлайн-редактор, который позволяет сохранять работу и включать библиотеки сообщества.[17]

особенности

Elm имеет небольшой набор языковых конструкций, включая традиционные if-выражения, let-выражения для локального состояния и case-выражения для сопоставление с образцом.[18] В качестве функционального языка он поддерживает анонимные функции, функции как аргументы и частичное приложение по умолчанию. Его семантика включает неизменяемые значения, функции без состояния и статическая типизация с выводом типа. Программы Elm визуализируют HTML через виртуальную модель DOM и могут взаимодействовать с другим кодом, используя «JavaScript как услугу».

Неизменность

Все значения в Elm неизменный, что означает, что значение не может быть изменено после его создания. Вяз использует постоянные структуры данных реализовать свой Массив, Диктовать, и Набор библиотеки.[19]

Статические типы

Вяз статически типизирован. Аннотации типов необязательны (из-за вывода типов), но настоятельно рекомендуется. Аннотации существуют в строке над определением (в отличие от языков семейства C, где типы и имена перемежаются). Elm использует единственное двоеточие для обозначения «имеет тип».

Типы включают примитивы, такие как целые числа и строки, и базовые структуры данных, такие как списки, кортежи и записи. Функции имеют типы, написанные стрелками, например раунд: Float -> Int. Пользовательские типы позволяют программисту создавать собственные типы для представления данных в соответствии с предметной областью.[20]

Типы могут относиться к другим типам, например к Список Int. Типы всегда пишутся с заглавной буквы; Имена в нижнем регистре - это переменные типа. Например, Перечислите список значений неизвестного типа. Это тип пустого списка и аргумента для List.length, который не зависит от элементов списка. Есть несколько специальных типов, которые программисты создают для взаимодействия со средой выполнения Elm. Например, Сообщение в формате HTML представляет (виртуальное) дерево DOM, все обработчики событий которого создают сообщения типа Msg.

Вместо того чтобы допускать неявное обнуление любого значения (например, JavaScript неопределенный или нулевой указатель ) Стандартная библиотека Elm определяет Может быть тип. Код, который создает или обрабатывает необязательное значение, делает это явно с использованием этого типа, а для всего остального кода гарантируется, что значение заявленного типа действительно присутствует.

Elm предоставляет ограниченное количество встроенных типовые классы: количество который включает в себя Int и Плавать для облегчения использования числовых операторов, таких как (+) или (*), сопоставимый который включает числа, символы, строки, списки сопоставимых объектов и кортежи сопоставимых объектов для облегчения использования операторов сравнения, и добавляемый который включает строки и списки для облегчения конкатенации с (++). Elm не предоставляет механизма для включения пользовательских типов в эти классы типов или создания новых классов типов (см. Раздел «Ограничения»).

Модульная система

Вяз имеет модульная система это позволяет пользователям разбивать свой код на более мелкие части, называемые модулями. Модули могут скрывать детали реализации, такие как вспомогательные функции, и группировать связанный код вместе. Модули служат пространством имен для импортированного кода, например Побитовое. И. Сторонние библиотеки (или пакеты) состоят из одного или нескольких модулей и доступны из Публичная библиотека Эльма. Все библиотеки версируются в соответствии с Семвер, который обеспечивается компилятором и другими инструментами. То есть удалить функцию или изменить ее тип можно только в основной версии.

Совместимость с HTML, CSS и JavaScript

Elm использует абстракцию, называемую портами, для связи с JavaScript.[21] Он позволяет значениям поступать в программы Elm и исходить из них, что делает возможным взаимодействие между Elm и JavaScript.

У Elm есть библиотека elm / html, которую программист может использовать для написания HTML и CSS в Elm.[22] Он использует виртуальный ДОМ подход, чтобы сделать обновления эффективными.[23]

Бэкэнд

Elm официально не поддерживает разработку на стороне сервера. Основная команда разработчиков не считает это своей основной целью и предпочитает сосредоточить разработку на улучшении опыта фронтенд-разработки. Тем не менее, есть несколько независимых проектов, которые пытаются изучить возможности использования Elm в качестве серверной части. Проекты в основном застряли на Elm версии 0.18.0, поскольку более новые не поддерживают "собственный" код и некоторые другие используемые функции. Есть две попытки использовать Elm с BEAM (виртуальная машина Erlang). Один из проектов Elm выполняет непосредственно на окружающей среде[24] пока другой компилирует его в Эликсир.[25] Также была попытка создать back-end фреймворк для Elm на базе инфраструктуры Node.js.[26] Ни один из проектов не готов к производству.

Вяз Архитектура

Elm Architecture - это шаблон для создания интерактивных веб-приложений. Приложения Elm естественно создаются таким образом, но другие проекты могут найти эту концепцию полезной.

Программа Elm всегда делится на три части:

  • Модель - состояние приложения
  • Просмотр - функция, которая превращает модель в HTML
  • Обновление - функция, обновляющая модель на основе сообщений

Это ядро ​​Elm Architecture.

Например, представьте себе приложение, которое отображает число и кнопку, увеличивающую число при нажатии.[27] В этом случае все, что нам нужно сохранить, - это одно число, поэтому наша модель может быть такой же простой, как псевдоним типа Model = Int. В Посмотреть функция будет определена с помощью HTML библиотеки и отобразить номер и кнопку. Чтобы номер был обновлен, нам необходимо отправить сообщение на Обновить функция, которая выполняется через настраиваемый тип, например введите Msg = Увеличить. В Увеличение значение прикрепляется к кнопке, определенной в Посмотреть функция такова, что когда пользователь нажимает кнопку, Увеличение передается в Обновить функция, которая может обновлять модель, увеличивая число.

В Elm Architecture отправка сообщений на Обновить это единственный способ изменить состояние. В более сложных приложениях сообщения могут поступать из различных источников: взаимодействие с пользователем, инициализация модели, внутренние вызовы из Обновить, подписки на внешние события (изменение размера окна, системные часы, взаимодействие JavaScript ...), а также изменения и запросы URL.

Ограничения

Вяз не поддерживает высокодородный полиморфизм,[28] какие родственные языки Haskell и PureScript предложение, и Elm не поддерживает создание типовые классы.

Это означает, что, например, Elm не имеет общего карта функция, которая работает с несколькими структурами данных, такими как Список и Набор. В Elm такие функции обычно вызываются с указанием имени модуля, например, вызов List.map и Set.map. В Haskell или PureScript была бы только одна функция карта. Это известный запрос функции, который находится в приблизительной дорожной карте Чаплицки как минимум с 2015 года.[29]

Другой результат - большое количество шаблонный код в проектах среднего и большого размера, как показано автором «Вяза в действии» в их примере одностраничного приложения.[30] с почти идентичными фрагментами, повторяющимися в функциях обновления, просмотра, подписок, синтаксического анализа маршрута и построения.

Пример кода

- Это однострочный комментарий{- это многострочный комментарий.   Он может охватывать несколько строк.-}{- Можно {- вложить -} многострочные комментарии -}- Здесь мы определяем значение с именем «приветствие». Тип выводится как String.приветствие =    "Привет мир!" - Лучше всего добавлять аннотации типов к объявлениям верхнего уровня.Здравствуйте : СтрокаЗдравствуйте =    "Всем привет."- Функции объявляются таким же образом, с аргументами, следующими за именем функции.Добавить Икс у =    Икс + у- Опять же, лучше всего добавлять аннотации типов.гипотенуза : Плавать -> Плавать -> Плаватьгипотенуза а б =    sqrt (а^2 + б^2)- Функции также каррированы; здесь мы карризовали умножение - инфиксный оператор с `2`multiplyBy2 : количество -> количествоmultiplyBy2 =    (*) 2- If-выражения используются для перехода по значениямабсолютная величина : количество -> количествоабсолютная величина количество =    если количество < 0 тогда отрицать количество еще количество - Записи используются для хранения значений с именованными полямикнига : { заглавие : Строка, автор : Строка, страницы : Int }книга =    { заглавие = «Степной волк»    , автор = "Гессе"    , страницы = 237     }- Доступ к записи осуществляется с помощью `.`заглавие : Строказаглавие =    книга.заглавие- Доступ к записи `.` также может использоваться как функцияавтор : Строкаавтор =    .автор книга- Мы можем создавать совершенно новые типы с помощью ключевого слова `type`.- Следующее значение представляет двоичное дерево.тип Дерево а    = Пустой    | Узел а (Дерево а) (Дерево а)- Эти типы можно проверять с помощью case-выражений.глубина : Дерево а -> Intглубина дерево =    кейс дерево из        Пустой ->            0        Узел ценность осталось правильно ->            1 + Максимум (глубина осталось) (глубина правильно)

Смотрите также

  • PureScript: строго типизированный, чисто функциональный язык программирования, который компилируется в JavaScript.
  • Причина: Расширение синтаксиса и набор инструментов для OCaml который также может быть преобразован в JavaScript

использованная литература

  1. ^ Чаплицкий, Эван. «Моя диссертация наконец-то завершена!» Вяз: параллельный FRP для функциональных графических интерфейсов"". Reddit.
  2. ^ https://github.com/elm/compiler/releases
  3. ^ "вяз / компилятор". GitHub.
  4. ^ "Prior Art - Redux". redux.js.org.
  5. ^ «Сравнение с другими фреймворками - Vue.js».
  6. ^ "Домашняя страница Elm".
  7. ^ «Вяз: параллельный FRP для функциональных графических интерфейсов» (PDF).
  8. ^ "Попробуй вяз". elm-lang.org. Архивировано из оригинал на 2017-05-21. Получено 2019-07-24.
  9. ^ "вяз и прези". elm-lang.org.
  10. ^ "новые приключения вяза". elm-lang.org.
  11. ^ "вяз / компилятор". GitHub.
  12. ^ "ответ". elm-lang.org.
  13. ^ "менеджер пакетов". elm-lang.org.
  14. ^ "Главная". elm-lang.org.
  15. ^ "Установить". guide.elm-lang.org.
  16. ^ "Вяз Пакджес". package.elm-lang.org. Архивировано из оригинал на 2015-02-11. Получено 2019-07-24.
  17. ^ "Элли, редактор Elm Live".
  18. ^ "синтаксис". elm-lang.org. Архивировано из оригинал на 2016-03-13. Получено 2013-05-31.
  19. ^ "вяз / ядро". package.elm-lang.org.
  20. ^ "Модель проблемы". Вяз. Получено 4 мая 2016.
  21. ^ «Взаимодействие с JavaScript». elm-lang.org.
  22. ^ "вяз / html". package.elm-lang.org.
  23. ^ «Молниеносно быстрый HTML». elm-lang.org.
  24. ^ https://github.com/hkgumbs/elm-beam
  25. ^ https://github.com/wende/elchemy
  26. ^ https://github.com/AIRTucha/board
  27. ^ «Кнопки · Знакомство с вязом». guide.elm-lang.org. Получено 2020-10-15.
  28. ^ "Высшие типы не выразимы? # 396". github.com/elm-lang/elm-compiler. Получено 6 марта 2015.
  29. ^ "Высшие типы не экспрессируемы # 396". github.com/elm-lang/elm-compiler. Получено 19 ноября 2019.
  30. ^ "Main.elm". github.com/rtfeldman/elm-spa-example. Получено 30 июн 2020.

внешние ссылки