Jump to content

Элм (язык программирования)

Вяз
Танграм Вяза
Парадигма функциональный
Семья Хаскелл
Разработано Эван Чаплицки
Впервые появился 30 марта 2012 г .; 12 лет назад ( 30 марта 2012 ) [1]
Стабильная версия
0.19.1 / 21 октября 2019 г .; 4 года назад ( 21.10.2019 ) [2]
Дисциплина набора текста статический , сильный , предполагаемый
Платформа х86-64
ТЫ macOS , Windows
Лицензия Разрешительный ( пересмотренный BSD ) [3]
Расширения имен файлов .вяз
Веб-сайт длинный вяз .org Отредактируйте это в Викиданных
Под влиянием
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 для хранения локальных значений и выражения case для сопоставления с образцом . [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] при этом почти идентичные фрагменты повторяются в функциях обновления, просмотра, подписок, анализа маршрутов и построения.

Пример кода [ править ]

-- This is a single line comment.

{-
This is a multi-line comment.
It is {- nestable. -}
-}

-- Here we define a value named `greeting`. The type is inferred as a `String`.
greeting =
    "Hello World!"

 -- It is best to add type annotations to top-level declarations.
hello : String
hello =
    "Hi there."

-- Functions are declared the same way, with arguments following the function name.
add x y =
    x + y

-- Again, it is best to add type annotations.
hypotenuse : Float -> Float -> Float
hypotenuse a b =
    sqrt (a^2 + b^2)

-- We can create lambda functions with the `\[arg] -> [expression]` syntax.
hello : String -> String
hello = \s -> "Hi, " ++ s

-- Function declarations may have the anonymous parameter names denoted by `_`, 
-- which are matched but not used in the body. 
const : a -> b -> a
const k _ = k

-- Functions are also curried; here we've curried the multiplication 
-- infix operator with a `2`
multiplyBy2 : number -> number
multiplyBy2 =
    (*) 2

-- If-expressions are used to branch on `Bool` values
absoluteValue : number -> number
absoluteValue number =
    if number < 0 then negate number else number

 -- Records are used to hold values with named fields
book : { title : String, author : String, pages : Int }
book =
    { title = "Steppenwolf"
    , author = "Hesse"
    , pages = 237 
    }

-- Record access is done with `.`
title : String
title =
    book.title

-- Record access `.` can also be used as a function
author : String
author =
    .author book

-- We can create tagged unions with the `type` keyword.
-- The following value represents a binary tree.
type Tree a
    = Empty
    | Node a (Tree a) (Tree a)

-- It is possible to inspect these types with case-expressions.
depth : Tree a -> Int
depth tree =
    case tree of
        Empty ->  0
        Node _ left right ->
            1 + max (depth left) (depth right)

См. также [ править ]

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

Ссылки [ править ]

  1. ^ Чаплицки, Эван (30 марта 2012 г.). «Моя диссертация наконец завершена!» Elm: Параллельный FRP для функциональных графических интерфейсов» « . Реддит .
  2. ^ «Релизы: elm/Компилятор» . Гитхаб .
  3. ^ "вяз/компилятор" . Гитхаб . 16 октября 2021 г.
  4. ^ «Предшествующий уровень техники — Redux» . redux.js.org .
  5. ^ «Типы уникальности» . Ржавый блог . Проверено 8 октября 2016 г. Те из вас, кто знаком со стилем Elm, возможно, поймут, что обновленные сообщения --explain во многом вдохновлены подходом Elm.
  6. ^ «Сравнение с другими фреймворками — Vue.js» .
  7. ^ "roc/roc-for-elm-programmers.md в main · roc-lang/roc" . Гитхаб . Проверено 17 февраля 2024 г. Roc — прямой потомок языка программирования Elm. Эти два языка похожи, но не одинаковы!
  8. ^ «Почему Derw: язык, похожий на Elm, который компилируется в TypeScript?» .
  9. ^ «Выпущен Грен 0.1.0» .
  10. ^ «Домашняя страница Вяза» .
  11. ^ «Elm: параллельный FRP для функциональных графических интерфейсов» (PDF) .
  12. ^ «Попробуй Вяз» . elm-lang.org . Архивировано из оригинала 21 мая 2017 г. Проверено 24 июля 2019 г.
  13. ^ «вяз и прези» . elm-lang.org .
  14. ^ «Новые приключения вяза» . elm-lang.org .
  15. ^ "вяз/компилятор" . Гитхаб . 16 октября 2021 г.
  16. ^ "репл" . elm-lang.org .
  17. ^ «Менеджер пакетов» . elm-lang.org .
  18. ^ "Дом" . elm-lang.org .
  19. ^ "Установить" . guide.elm-lang.org .
  20. ^ «Вязовые пакеты» . Elm-lang.org .
  21. ^ «Элли» . Ellie-app.com .
  22. ^ «синтаксис» . elm-lang.org . Архивировано из оригинала 13 марта 2016 г. Проверено 31 мая 2013 г.
  23. ^ «вяз/ядро» . package.elm-lang.org .
  24. ^ «Моделируйте проблему» . Вяз . Проверено 4 мая 2016 г.
  25. ^ «Взаимодействие с JavaScript» . elm-lang.org .
  26. ^ "вяз/html" . package.elm-lang.org .
  27. ^ «Сверхбыстрый HTML» . elm-lang.org .
  28. ^ «Кофигумбс/Вяз-балка» . Гитхаб . 24 сентября 2021 г.
  29. ^ "Что это такое?" . Гитхаб . 24 сентября 2021 г.
  30. ^ "Доска" . Гитхаб . 18 сентября 2021 г.
  31. ^ «Кнопки · Введение в Elm» . guide.elm-lang.org . Проверено 15 октября 2020 г.
  32. ^ «Типы высшего рода невыразимы? #396» . github.com/elm-lang/elm-compiler . Проверено 6 марта 2015 г.
  33. ^ «Типы высшего рода, невыразимые № 396» . github.com/elm-lang/elm-compiler . Проверено 19 ноября 2019 г.
  34. ^ "Майн.вяз" . github.com/rtfeldman/elm-spa-example . Проверено 30 июня 2020 г.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 73891f895bcf585bbd66a576879611ab__1718037780
URL1:https://arc.ask3.ru/arc/aa/73/ab/73891f895bcf585bbd66a576879611ab.html
Заголовок, (Title) документа по адресу, URL1:
Elm (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)