Elm (мова програмування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Elm
Парадигма функційне реактивне програмування, функційне програмування
Дата появи 2012
Творці Еван Чапліцькі
Останній реліз 0.19.1 (21 жовтня 2019)
Система типізації статична, сильна, вивідна
Під впливом від Haskell, Standard ML, OCaml, F#
Вплинула на Redux (архітектура)[1]
Мова реалізації Haskell[2]
Ліцензія Дозвільна (Переглянута BSD)[3]
Звичайні розширення файлів .elm
Репозиторій вихідного коду github.com/elm/compiler
Вебсайт elm-lang.org

Elm (з англ. В'яз) — функційна мова програмування, для декларативного створення браузерних застосунків з графічним інтерфейсом користувача. Elm використовує стиль функційного реактивного програмування та чисто функційне програмування для того щоб сконструювати інтерфейс користувача унеможливлюючи деструктивні зміни. Синтаксис схожий на Haskell, але значно спрощений і спеціалізований. Вихідний код на Elm компілюється в нативний JavaScript. Скомпільований JavaScript містить код додатка, яке керують піддерево DOM.

Історія[ред. | ред. код]

Elm спроектував Еван Чапліцькі в своїй дипломній роботі 2012 року.[4] Перший випуск Elm містив приклади та онлайн-редактор, який дозволяв досить просто спробувати мову у браузері.[5] Еван Чапліцькі приєднався до Prezi в 2013 аби продовжити роботу над Elm,[6] а в 2016 перейшов до NoRedInk як Open Source Engineer, також заснувавши «Elm Software Foundation».[7]

Початкова реалізація компілятора Elm націлена на генерацію HTML, CSS, та JavaScript коду.[8] Набір інструментів мови продовжив розширюватись, і тепер включає REPL,[9] менеджер пакунків,[10] зневадник який подорожує в часі,[11] та інсталятори для Mac та Windows.[12] Elm також має екосистему бібліотек створених спільнотою.[13]

Особливості[ред. | ред. код]

Elm містить невеликий, але виразний набір конструкцій мови, який включає if-вирази, let-вирази, case-вирази, анонімні функції та інтерполяцію списків.[14][15]

Незмінність[ред. | ред. код]

Всі значення в Elm незмінні, що означає, що значення не може модифікуватись, після того як воно було створеним. Elm використовує персистентні структури даних щоб реалізувати свої бібліотеки Array, Dict, та Set.[16]

Статична типізація[ред. | ред. код]

Elm статично типізований. Кожному визначенню в Elm можна дати анотацію типу, яка опише точний формат значення. Типи включають:

  • примітивні типи, такі як числа та рядки
  • базові структури даних, такі як списки, кортежі та асоціативні масиви
  • позначені об'єднання[en], які дозволяють створювати нові типи[17]

Elm також підтримує повне виведення типів, тому компілятор може перевірити що програма типо-безпечна, не читаючи жодних анотацій типів.

Система модулів[ред. | ред. код]

Elm має систему модулів яка дозволяє користувачам розбити свій код на менші частини, які називаються модулями. Користувачі можуть імпортувати та експортувати значення, дозволяючи приховувати деталі реалізації, щоб іншим програмістам не було потреби про них думати. Модулі складають основу сайту бібліотеки спільноти Elm: Elm Public Library[18].

Взаємодія з HTML, CSS, та JavaScript[ред. | ред. код]

Elm для спілкування з JavaScript використовує абстракцію, яка називається «порти».[19]

Elm також має бібліотеку, яка називається elm-html і дозволяє користувачам використовувати HTML в Elm та стилізувати його з CSS.[20] Для того щоб зміни в HTML були ефективними, використовується віртуальний DOM.[21]

Обмеження[ред. | ред. код]

На відміну від Haskell, Elm не має підтримки класів типів[en], і тому не може надавати загальну абстракцію для багатьох типових операцій.[22] Наприклад, нема загальної функції map, apply, fold, чи filter. Замість цього, такі імена містять свій модуль як префікс, як в List.map та Dict.map.

Інструменти[ред. | ред. код]

Приклад коду[ред. | ред. код]

-- Це однорядковий коментар

{- А це багаторядковий.
   Він може розтягуватись на багато рядків.
-}

{- Можна вкладати багаторядкові коментарі {- один в одного -} -}

-- Тут ми описуємо значення, яке назвемо `greeting`. Його тип виведеться як String.
greeting =
    "Привіт, світе!"

 -- Але краще додавати анотації типів до декларацій верхнього рівня:
hello : String
hello =
    "Привіт вам!"

-- Функції описуються аналогічно до значень, аргументи йдуть за іменем функції
add x y =
    x + y

-- Знову ж таки, краще додавати анотації типів.
hypotenuse : Float -> Float -> Float
hypotenuse a b =
    sqrt (a^2 + b^2)

-- If-вирази використовуються щоб відгалужувати значення
absoluteValue : Int -> Int
absoluteValue number =
    if number < 0 then -number else number

 -- Записи використовуються щоб містити значення з іменованими полями
book : { title:String, author:String, pages:Int }
book =
    { title = "Кобзар"
    , author = "Шевченко"
    , pages = 237 
    }

-- Можна створювати цілком нові типи, використовуючи ключове слово `type`.
-- Наступне значення задає бінарне дерево.
type Tree a
    = Empty
    | Node a (Tree a) (Tree a)

-- Такі типи можна опрацьовувати за допомогою case-виразів.
depth : Tree a -> Int
depth tree =
    case tree of
      Empty -> 0
      Node value left right ->
          1 + max (depth left) (depth right)

Зноски[ред. | ред. код]

  1. Redux Prior Art. Архів оригіналу за 24 серпня 2016. Процитовано 24 серпня 2016.
  2. https://github.com/elm/compiler
  3. https://github.com/evancz/Elm/blob/master/LICENSE
  4. Evan Czaplicki's thesis on Elm (PDF). Архів оригіналу (PDF) за 20 листопада 2016. Процитовано 24 серпня 2016.
  5. Elm's Online Editor. Архів оригіналу за 21 травня 2017. Процитовано 24 серпня 2016.
  6. Elm joins Prezi. Архів оригіналу за 24 травня 2015. Процитовано 24 серпня 2016.
  7. New Adventures for Elm. Архів оригіналу за 5 вересня 2016. Процитовано 24 серпня 2016.
  8. Elm compiler source code
  9. Elm REPL announcement. Архів оригіналу за 31 травня 2015. Процитовано 24 серпня 2016.
  10. Elm Package Manager announcement. Архів оригіналу за 13 березня 2016. Процитовано 24 серпня 2016.
  11. Elm's Time-Traveling Debugger. Архів оригіналу за 3 травня 2017. Процитовано 24 серпня 2016.
  12. Elm Platform. Архів оригіналу за 28 лютого 2017. Процитовано 24 серпня 2016.
  13. Elm Public Libraries. Архів оригіналу за 11 лютого 2015. Процитовано 24 серпня 2016.
  14. The Syntax of Elm. Архів оригіналу за 13 березня 2016. Процитовано 24 серпня 2016.
  15. About Elm [Архівовано 30 серпня 2017 у Wayback Machine.] Elm features
  16. Elm Standard Libraries. Архів оригіналу за 11 лютого 2015. Процитовано 24 серпня 2016.
  17. Model The Problem. Elm. Архів оригіналу за 9 травня 2016. Процитовано 4 травня 2016.
  18. Архівована копія. Архів оригіналу за 11 лютого 2015. Процитовано 24 серпня 2016.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  19. Ports. Архів оригіналу за 13 березня 2016. Процитовано 24 серпня 2016.
  20. elm-html documentation. Архів оригіналу за 4 вересня 2016. Процитовано 24 серпня 2016.
  21. Blazing Fast Html. Архів оригіналу за 13 березня 2016. Процитовано 24 серпня 2016.
  22. Higher-Kinded types Not Expressible? #396. github.com/elm-lang/elm-compiler. Процитовано 6 березня 2015.

Посилання[ред. | ред. код]