Элм (язык программирования)
![]() Танграм Вяза | |
Парадигма | функциональный |
---|---|
Семья | Хаскелл |
Разработано | Эван Чаплицки |
Впервые появился | 30 марта 2012 г [1] |
Стабильная версия | 0.19.1
/ 21 октября 2019 г [2] |
Дисциплина набора текста | статический , сильный , предполагаемый |
Платформа | х86-64 |
ТЫ | macOS , Windows |
Лицензия | Разрешительный ( пересмотренный BSD ) [3] |
Расширения имен файлов | .вяз |
Веб-сайт | длинный вяз |
Под влиянием | |
Haskell , стандартный ML , OCaml , F# | |
Под влиянием | |
Редукс , [4] Ржавчина , [5] Вид , [6] Рок, [7] Дуб, [8] Ветвь [9] |
Elm — это предметно-ориентированный язык программирования для декларативного создания веб-браузера на основе графических пользовательских интерфейсов . Elm является чисто функциональным продуктом , при разработке которого особое внимание уделяется удобству использования , производительности и надежности . Он рекламирует « во время выполнения », никаких исключений на практике [10] компилятора Elm стало возможным благодаря статической проверке типов .
История [ править ]
Первоначально Вяз был разработан Эваном Чаплицки в качестве его диссертации в 2012 году. [11] В первый выпуск Elm входило множество примеров и онлайн-редактор, который позволял легко опробовать его в веб-браузере . [12] Г-н Чаплицки присоединился к Prezi в 2013 году, чтобы работать над Elm. [13] а в 2016 году перешёл в NoRedInk в качестве инженера по открытому коду, а также основал Elm Software Foundation. [14]
Первоначальная реализация компилятора Elm ориентирована на язык гипертекстовой разметки ( HTML ), каскадные таблицы стилей (CSS) и JavaScript . [15] Набор основных инструментов продолжает расширяться и теперь включает в себя цикл чтения-оценки-печати (REPL), [16] менеджер пакетов , [17] путешествующий во времени отладчик, [18] и установщики для macOS и Windows . [19] В Elm также есть экосистема библиотек , созданных сообществом . [20] и Ellie, продвинутый онлайн-редактор, позволяющий сохранять работу и включающий общественные библиотеки. [21]
Особенности [ править ]
В Elm имеется небольшой набор языковых конструкций, включая традиционные if-выражения, let-выражения для хранения локальных значений и регистровые выражения для сопоставления с образцом . [22] Как функциональный язык, он поддерживает анонимные функции , функции в качестве аргументов, а функции могут возвращать функции, причем последние часто за счет частичного применения каррированных функций. Функции вызываются по значению. Его семантика включает неизменяемые значения, функции без сохранения состояния и статическую типизацию с выводом типа. Программы Elm отображают HTML через виртуальный DOM и могут взаимодействовать с другим кодом, используя «JavaScript как услугу».
Неизменяемость [ править ]
Все значения в Elm неизменяемы , что означает, что значение не может быть изменено после его создания. Elm использует постоянные структуры данных для реализации своих массивов, наборов и словарей в стандартной библиотеке. [23]
Статические типы [ править ]
Elm статически типизирован. Аннотации типов не являются обязательными (из-за вывода типа), но настоятельно приветствуются. Аннотации располагаются на строке над определением (в отличие от языков семейства C, где типы и имена перемежаются). Elm использует одно двоеточие для обозначения «имеет тип».
Типы включают примитивы, такие как целые числа и строки, а также базовые структуры данных, такие как списки, кортежи и записи. Функции имеют типы, записанные стрелками, например round : Float -> Int
. Пользовательские типы позволяют программисту создавать собственные типы для представления данных в соответствии с проблемной областью. [24]
Типы могут ссылаться на другие типы, например List Int
. Типы всегда пишутся с заглавной буквы; Имена в нижнем регистре являются переменными типа. Например, List a
представляет собой список значений неизвестного типа. Это тип пустого списка и аргумента List.length
, который не зависит от элементов списка. Существует несколько специальных типов, которые программисты создают для взаимодействия со средой выполнения Elm. Например, Html Msg
представляет (виртуальное) дерево DOM, все обработчики событий которого создают сообщения типа Msg
.
Вместо того, чтобы позволять любому значению быть неявно обнуляемым (например, в JavaScript undefined
или нулевой указатель ), стандартная библиотека Elm определяет Maybe a
тип. Код, который создает или обрабатывает необязательное значение, делает это явно, используя этот тип, а для всего остального кода гарантируется фактическое присутствие значения заявленного типа.
Elm предоставляет ограниченное количество встроенных классов типов : number
которая включает в себя Int
и Float
для облегчения использования числовых операторов, таких как (+)
или (*)
, comparable
который включает числа, символы, строки, списки сравниваемых объектов и кортежи сопоставимых объектов для облегчения использования операторов сравнения, и appendable
который включает строки и списки для облегчения конкатенации с (++)
. Elm не предоставляет механизма для включения пользовательских типов в эти классы типов или создания новых классов типов (см. Ограничения ).
Система модулей [ править ]
В Elm есть система модулей , которая позволяет пользователям разбивать свой код на более мелкие части, называемые модулями. Модули могут скрывать детали реализации, такие как вспомогательные функции, и группировать связанный код. Модули служат пространством имен для импортируемого кода, например Bitwise.and
. Сторонние библиотеки (или пакеты) состоят из одного или нескольких модулей и доступны в публичной библиотеке Elm . Все библиотеки имеют версии в соответствии с semver , который обеспечивается компилятором и другими инструментами. То есть удалить функцию или изменить ее тип можно только в мажорном релизе.
Совместимость с HTML, CSS и JavaScript [ править ]
Elm использует абстракцию, называемую портами, для взаимодействия с JavaScript . [25] Он позволяет значениям входить и выходить из программ Elm, что позволяет взаимодействовать между Elm и JavaScript.
В Elm есть библиотека elm/html, которую программист может использовать для написания HTML и CSS внутри Elm. [26] Он использует подход виртуального DOM для повышения эффективности обновлений. [27]
Бэкэнд [ править ]
Elm официально не поддерживает разработку на стороне сервера. Основная команда разработчиков не считает это своей основной целью и предпочитает сосредоточить разработку на улучшении опыта фронтенд-разработки. Тем не менее, существует несколько независимых проектов, которые пытаются изучить возможности использования Elm в качестве серверной части. Проекты в основном привязаны к версии Elm 0.18.0, поскольку более новые не поддерживают «родной» код и некоторые другие используемые функции. Есть две попытки использовать Elm с BEAM (виртуальной машиной Erlang). Один из проектов выполняет Elm непосредственно в среде. [28] а другой компилирует его в Elixir. [29] Также была попытка создать серверную структуру для Elm на базе инфраструктуры Node.js. [30] Ни один из проектов не готов к производству.
Архитектура Вяза [ править ]
Архитектура Elm — это шаблон проектирования программного обеспечения для создания интерактивных веб-приложений. Приложения Elm естественным образом создаются таким образом, но эта концепция может оказаться полезной и для других проектов.
Программа Elm всегда делится на три части:
- Модель — состояние приложения
- Просмотр — функция, преобразующая модель в HTML.
- Update — функция, обновляющая модель на основе сообщений.
Это ядро архитектуры Elm.
Например, представьте себе приложение, отображающее число, и кнопку, которая увеличивает это число при нажатии. [31] В этом случае все, что нам нужно сохранить, это одно число, поэтому наша модель может быть такой простой, как type alias Model = Int
. view
функция будет определена с помощью Html
библиотеку и отобразите номер и кнопку. Чтобы номер обновлялся, нам нужно иметь возможность отправить сообщение на update
функция, которая выполняется с помощью пользовательского типа, такого как type Msg = Increase
. Increase
значение прикрепляется к кнопке, определенной в view
функция такова, что при нажатии кнопки пользователем, Increase
передается в update
функция, которая может обновлять модель, увеличивая число.
В архитектуре Elm отправка сообщений update
это единственный способ изменить состояние. В более сложных приложениях сообщения могут поступать из разных источников: взаимодействие с пользователем, инициализация модели, внутренние вызовы из update
, подписки на внешние события (изменение размера окна, системные часы, взаимодействие с JavaScript...), а также изменения и запросы URL-адресов.
Ограничения [ править ]
Elm не поддерживает полиморфизм высшего рода . [32] которые предлагают родственные языки Haskell и PureScript , а также Elm не поддерживает создание классов типов .
Это означает, что, например, в Elm нет универсального map
функция, которая работает с несколькими структурами данных, такими как List
и Set
. В Elm такие функции обычно вызываются по имени их модуля, например, вызывая List.map
и Set.map
. В Haskell или PureScript будет только одна функция. map
. Это известный запрос на добавление функции, который включен в план действий г-на Чаплицкого как минимум с 2015 года. [33]
Другим результатом является большое количество шаблонного кода в проектах среднего и большого размера, как показано автором книги «Elm в действии» в примере одностраничного приложения. [34] при этом почти идентичные фрагменты повторяются в функциях обновления, просмотра, подписок, анализа маршрутов и построения.
Пример кода [ править ]
-- Это однострочный комментарий.
{-
Это многострочный комментарий.
Это {- вложенно. -}
-}
-- Здесь мы определяем значение с именем `приветствие`. Тип определяется как String.
приветствие =
«Привет, мир!»
-- Лучше всего добавлять аннотации типов к объявлениям верхнего уровня.
hello : String
hello =
«Привет».
-- Функции объявляются одинаково, с аргументами после имени функции.
add x y =
x + y
— Опять же, лучше всего добавлять аннотации типов.
гипотенуза : Float -> Float -> Float
гипотенуза a b =
sqrt ( a ^ 2 + b ^ 2 )
— мы можем создавать лямбда-функции с синтаксисом `\[arg] -> [expression]`.
hello : String -> String
hello = \ s -> "Привет," ++ s
-- Объявления функций могут иметь анонимные имена параметров, обозначаемые `_`,
-- которые совпадают, но не используются в теле.
const : a -> b -> a
const k _ = k
— Функции также каррируются; здесь мы каррировали инфиксный
оператор умножения с `2`
MultipleBy2 : Number -> Number
MultipleBy2 =
(*) 2
-- If-выражения используются для ветвления по значениям `Bool`
AbsoluteValue : Number -> Number
AbsoluteValue Number =
если число < 0 , то отрицать число else число
— записи используются для хранения значений с именованными полями
book : { title : String , author : String , pages : Int }
book =
{ title = "Steppenwolf"
, author = "Hesse"
, pages = 237
}
— Запись доступ осуществляется с помощью `.`
title : String
title =
book . title
к записи. `.` также может использоваться как
функцияauthor : Stringauthor
— Доступ =
. автора книга
. Мы можем создавать тегированные объединения с помощью ключевого слова `type`.
-- Следующее значение представляет двоичное дерево.
тип Дерево a
= Пусто
| Узел a ( Дерево a ) ( Дерево a )
— эти типы можно проверить с помощью регистровых выражений.
глубина : Дерево a -> Int
глубины дерево =
случаев дерево Empty
- - 0
Node_ справа left right >
1 + max ( глубина слева ) ( глубина > )
См. также [ править ]
- PureScript — строго типизированный чисто функциональный язык программирования, который компилируется в JavaScript.
- Причина – расширение синтаксиса и набор инструментов для OCaml, которые также можно перенести в JavaScript.
Ссылки [ править ]
- ^ Чаплицки, Эван (30 марта 2012 г.). «Моя диссертация наконец завершена!» Elm: Параллельный FRP для функциональных графических интерфейсов» « . Реддит .
- ^ «Релизы: elm/Компилятор» . Гитхаб .
- ^ "вяз/компилятор" . Гитхаб . 16 октября 2021 г.
- ^ «Предшествующий уровень техники — Redux» . redux.js.org .
- ^ «Типы уникальности» . Ржавый блог . Проверено 8 октября 2016 г.
Те из вас, кто знаком со стилем Elm, возможно, поймут, что обновленные сообщения --explain во многом вдохновлены подходом Elm.
- ^ «Сравнение с другими фреймворками — Vue.js» .
- ^ "roc/roc-for-elm-programmers.md в main · roc-lang/roc" . Гитхаб . Проверено 17 февраля 2024 г.
Roc — прямой потомок языка программирования Elm. Эти два языка похожи, но не одинаковы!
- ^ «Почему Derw: язык, похожий на Elm, который компилируется в TypeScript?» .
- ^ «Выпущен Грен 0.1.0» .
- ^ «Домашняя страница Вяза» .
- ^ «Elm: параллельный FRP для функциональных графических интерфейсов» (PDF) .
- ^ «Попробуй Вяз» . elm-lang.org . Архивировано из оригинала 21 мая 2017 г. Проверено 24 июля 2019 г.
- ^ «вяз и прези» . elm-lang.org .
- ^ «Новые приключения вяза» . elm-lang.org .
- ^ "вяз/компилятор" . Гитхаб . 16 октября 2021 г.
- ^ "репл" . elm-lang.org .
- ^ «Менеджер пакетов» . elm-lang.org .
- ^ "Дом" . elm-lang.org .
- ^ "Установить" . guide.elm-lang.org .
- ^ «Вязовые пакеты» . Elm-lang.org .
- ^ «Элли» . Ellie-app.com .
- ^ «синтаксис» . elm-lang.org . Архивировано из оригинала 13 марта 2016 г. Проверено 31 мая 2013 г.
- ^ «вяз/ядро» . package.elm-lang.org .
- ^ «Моделируйте задачу» . Вяз . Проверено 4 мая 2016 г.
- ^ «Взаимодействие с JavaScript» . elm-lang.org .
- ^ "вяз/html" . package.elm-lang.org .
- ^ «Сверхбыстрый HTML» . elm-lang.org .
- ^ «Кофигумбс/Вяз-балка» . Гитхаб . 24 сентября 2021 г.
- ^ "Что это такое?" . Гитхаб . 24 сентября 2021 г.
- ^ "Доска" . Гитхаб . 18 сентября 2021 г.
- ^ «Кнопки · Введение в Elm» . guide.elm-lang.org . Проверено 15 октября 2020 г.
- ^ «Типы высшего рода невыразимы? #396» . github.com/elm-lang/elm-compiler . Проверено 6 марта 2015 г.
- ^ «Типы высшего рода, невыразимые № 396» . github.com/elm-lang/elm-compiler . Проверено 19 ноября 2019 г.
- ^ "Майн.вяз" . github.com/rtfeldman/elm-spa-example . Проверено 30 июня 2020 г.
Внешние ссылки [ править ]
- программное обеспечение 2012 года
- Специализированные языки программирования
- Функциональные языки
- Семейство языков программирования Haskell
- Языки программирования сопоставления шаблонов
- Языки программирования, созданные в 2012 году.
- Компиляторы исходного кода
- Статически типизированные языки программирования
- Веб-фреймворки
- Бесплатное программное обеспечение с открытым исходным кодом
- Программное обеспечение, использующее лицензию MIT