Erlang (Ерла́нґ /ˈɜːrlæŋ/ UR-lang) — мова функційного програмування з динамічною типізацією, призначена для розробки програм для різного роду розподілених і багатониткових систем. Розроблена і підтримується компанією Ericsson. Мова містить в собі засоби породження паралельних процесів та їхньої взаємодії за допомогою посилання асинхронних повідомлень, без використання блокувань.
Erlang | |
---|---|
Парадигма | мультипарадигмальна: паралельна, функціональна |
Дата появи | 1987 |
Творці | Джо Армстронг (програміст) |
Розробник | Ericsson |
Останній реліз | 25 (18 червня, 2022 ) |
Система типізації | динамічна типізація,[[сильна типізація]] |
Під впливом від | Prolog, SmallTalk Lisp, |
Вплинула на | F#, Clojure, Rust, Scala, Opa, ,Akka, Dart, Elixir, Oz,Go |
Мова реалізації | Erlang[1] |
Операційна система | Багатоплатформова |
Ліцензія | Apache 2.0 |
Звичайні розширення файлів | .erl, .hrl |
Репозиторій вихідного коду | github.com/erlang/otp |
Вебсайт | www.erlang.org |
|
Мова орієнтована на розробку розподілених відмовостійких застосунків, які забезпечують паралельну обробку запитів в режимі реального часу. Мова набула поширення в таких областях, як телекомунікації, банківські системи, електронна комерція, комп'ютерна телефонія і організація миттєвого обміну повідомленнями.
Програма транслюється в байт-код, який виконується віртуальною машиною, що забезпечує переносність. Одночасно розробниками випускається OTP (Open Telecom Platform) — супутній набір бібліотек і компонентів для розробки розподілених систем на мові Erlang. Код проєкту поширюється під модифікованою вільною ліцензією MPL.
Свій синтаксис і деякі концепції, мова Erlang успадкувала від мови логічного програмування Пролог. Мова підтримує зіставляння зі взірцем, обробку виключень, спискові та бінарні генератори, анонімні функції, функції вищого порядку, обмін повідомленнями між процесами. Препроцесор підтримує роботу з макросами і включення заголовкових файлів.
Популярність мови Erlang зросла у зв'язку з розширенням області використання (телекомунікаційні системи) на паралельні розподілені системи з високим навантаженням, які обслуговують мільйони користувачів WWW, такі як чати, системи керування веб-контентом, веб-сервери і розподілені бази даних, що вимагають масштабування. Erlang використовуються в деяких NoSQL-базах даних .
Назва та історія
Серед малообізнаних з історією мови Erlang людей поширена думка, що назва «Erlang» розшифровується як ERicsson LANGuage. Насправді мова отримала свою назву на честь [en], данського математика, який працював у галузі телекомунікацій. Існує одиниця вимірювання телекомунікаційного трафіку, яка також називається [en].
На створення Erlang вплинули ML, [en], Ada, [en], CHILL, Пролог. Окрім того, на спосіб оновлення програмного забезпечення вплинули Smalltalk і пропрієтарні мови EriPascal та PLEX, якими послуговувались в Ericson.
Мова Erlang була створена в 1986 році в лабораторії компанії Ericsson спільно Джо Армстронгом (Joe Armstrong), (Robert Virding) і (Mike Williams), і в 1998 році переведена в розряд відкритих проєктів. Завдяки початковій орієнтації на створення застосунків для паралельної обробки запитів в режимі реального часу мова набула поширення в таких областях як телекомунікації, банківські системи, електронна комерція, комп'ютерна телефонія і організація миттєвого обміну повідомленнями.
У 1998 році топ-менеджмент Ericsson вирішив не брати на себе зобов'язань з розробки та підтримки власної мови програмування, натомість зосередившись на Java. Використання Erlang було заборонено у нових проєктах Ericsson Radio AB у зв'язку з реалізацією плану аутсорсингу програмної технології компанії Rational Inc.
Це рішення дуже сильно вплинуло на майбутнє Erlang: воно призвело до відкриття коду Erlang під відкритою ліцензією EPL (аналог Mozilla Public License), а також послужило головною причиною початку поширення мови за межами компанії, що його створила. Основним запереченням проти відкриття вихідного коду було вирішення питань щодо патентів, але ці труднощі були подолані. Незабаром багато хто з основних розробників покинув Ericsson, щоб організувати власний бізнес — Bluetail AB.
На початку 2000-х років наукові кола стали виявляти інтерес до Erlang. З 2002 року став проводитись щорічний Erlang Workshop. Ericsson продовжував спонсорувати проєкт HiPE (від англ. High-Performance Erlang — високопродуктивний Erlang). Проєкт HiPE займався ефективною реалізацією мови та інструментами для перевірки типів, і створений у групі проєкту компілятор в машинний код, який входить у постачання версії Erlang/OTP, вільно розповсюджується з 2001 року. Роботи, пов'язані з Erlang, ведуть інші заклади вищої освіти. Інструменти для рефакторингу створені в Кентському університеті у Великій Британії та університеті Лоранда Етвеша в Угорщині, інструменти для різних видів тестування — у Мадридському політехнічному університеті, технічному університеті Чалмерса та Гетеборгському університеті.
Коли системи з симетричною багатопроцесорністю тільки починали завойовувати ринок серверів і настільних комп'ютерів, кидаючи виклик розробникам програмного забезпечення, вже в 2006 перша версія Erlang з підтримкою SMP була випущена спільними зусиллями команди OTP з Ericsson і команди HiPE. Незабаром після цього вийшла перша майже за десятиліття велика монографія з Erlang: «Programming Erlang» Джо Армстронга, після чого багато розробників «відкрили» для себе Erlang/OTP, і мова стала набирати популярності.
Процес розвитку мови включає в себе розгляд пропозицій з розвитку EEP (Erlang Enhancement Proposal). За допомогою цих пропозицій Erlang-спільнота вносить зміни у стандартну подачу Erlang. З внесеними пропозиціями можна ознайомитися на веб-сторінці erlang.org/eeps.
Філософія
За свідченнями Майка Вільямса, Erlang створювався для вирішення трьох проблем розробки розподілених систем м'якого реального часу з високим ступенем паралелізму:
- можливості швидкої та ефективної розробки ПЗ;
- отримання системи, стійкої до програмних та апаратних збоїв;
- можливості оновлення системи «на льоту», без простою обладнання.
За словами Вільямса, філософія, якої дотримувались розробники Erlang, пасує і для написання програмного забезпечення цією мовою:
Оригінальний текст (англ.)
|
Більшість мов, створених раніше за Erlang, були розроблені без попереднього знаходження застосування, тоді як Erlang був розроблений спеціально на основі вимог до розподілених, стійких до відмов, паралельних систем реального часу. З розвитком Інтернету виявилося, що багато програм мають аналогічні вимоги, що пояснює зростання інтересу до мови.
Секрет високої стійкості до відмов полягає у використанні ізольованих один від одного легких процесів, пов'язаних лише механізмом обміну повідомленнями та сигналами виходу. Принципи розробників на Erlang стосовно обробки помилкових ситуацій у процесах, можна виразити у вигляді висловлювання: «Let it crash». Пов'язано це з тим, що в Erlang-системі легко стежити за завершенням процесу, завершувати процеси, пов'язані зі збоями, і запускати нові процеси.
Особливості
Синтаксис успадкований від мови Prolog. Підтримує модулі, поліморфні функції, зіставлення за шаблоном, анонімні функції, умовні конструкції, структури, обробку винятків, оптимізацію хвостової рекурсії.
Головна риса Erlang — модель легких процесів. Процеси є дешевими, їхнє створення вимагає таку кількість ресурсів, що їх можна порівняти з викликом функції. Єдиним способом взаємодії процесів є асинхронний обмін повідомленнями. Процес може встановити зв'язок (link) з іншими процесами і за вибором або отримувати повідомлення про їхнє дострокове завершення з вказанням причини або розділити їхню долю. Процес має свою «поштову скриню», звідки може вибірково читати повідомлення. Мова програмування Erlang сприяє створенню великої кількості конкурентних процесів. Процеси ізольовані та не мають спільного стану.
Процес проєктування полягає в ітеративному розбитті системи на ієрархії підсистем, які конкурентно взаємодіють, доки складові не стануть достатньо простими для реалізації.
Сув'язь «Процеси + повідомлення» на відміну від сув'язі «Об'єкти + Інтерфейси + Успадкування» часто дає компактніші рішення. Відсутність потреби блокування доступу до стану процесу для синхронізації їхньої взаємодії суттєво спрощує програмування. Для конкурентного ресурсу зазвичай створюється процес-монітор, через який здійснюється взаємодія з ресурсом.
Також важливий момент полягає у формулі «let it crash» («нехай процес впаде»). Замість перехоплювати помилки і намагатися продовжувати роботу, частина програми, що містить ризикований код, відокремлюється у незалежний процес-камікадзе, який система вбиває у випадку виникнення помилки, при цьому батьківський процес отримує повідомлення про смерть нащадків і, за потреби, може перезапускати ці процеси. Такий підхід позбавляє код численних перевірок.
Високорівневі конструкції
Erlang є декларативною мовою програмування, яка використовується більше для опису того, що має бути обчислено, ніж як. Наприклад, визначення функції, яке використовує зіставлення зі зразком для вибору одного з варіантів обчислення або вилучення елемента даних зі складової структури нагадує рівняння. Зіставлення зі взірцем поширене навіть на бітові рядки, що спрощує реалізацію телекомунікаційних протоколів.
Функції є об'єктами першого класу Erlang. У мові також широко застосовуються характерні для функціональної парадигми програмування спискові включення (генератори списків).
Паралельні обчислення
Особливістю мови Erlang є застосування легковагих процесів відповідно до моделі акторів. Такий підхід дозволяє виконувати одночасно сотні тисяч і навіть мільйони таких процесів, кожен з яких може мати скромні вимоги до пам'яті. Процеси ізольовані один від одного і не мають загального стану, але між ними можна встановити зв'язок та отримувати повідомлення про їхній стан.
Для взаємодії процесів використовують асинхронний обмін повідомленнями. Кожен процес має свою чергу повідомлень, обробка якої використовує зіставлення із взірцем. Процес, що надіслав повідомлення, не отримує повідомлення про доставку, навіть якщо ідентифікатор процесу одержувача недійсний або одержувач ігнорує повідомлення. Таким чином, відповідальність за правильно організовану взаємодію між процесами лежить на розробникові.
Наприклад, при реалізації на Erlang мережевого чату, структура програми може безпосередньо відображати одночасність дій користувачів щодо обміну повідомленнями шляхом запуску нових процесів. Ефективність передачі повідомлень зберігається зі збільшенням кількості процесів, а вимоги до пам'яті мінімізуються за рахунок того, що легковагими процесами керує віртуальна машина, а не засоби операційної системи.
Розподілені обчислення
Erlang з самого початку проєктувався для розподілених обчислень та масштабованості. Підтримка паралелізму вбудована в синтаксис та семантику мови, тому побудову системи можна вести, абстрагуючись від конкретного місця обчислень. У стандартній поставці Erlang може налагодити зв'язок процесів протоколу (TCP/IP) незалежно від підтримуваних ним платформ (операційних систем).
Запущений екземпляр емулятора Erlang називається вузлом (node). Вузол має ім'я і «знає» про існування інших вузлів на цій машині або у мережі. Створення та взаємодія процесів різних вузлів не відрізняється від взаємодії процесів всередині вузла. Програми, написані на Erlang, здатні працювати на кількох вузлах. Вузлами можуть бути процесори, багато ядер одного процесора, і навіть цілий кластер машин. Для створення процесу на іншому вузлі процесу достатньо знати його ім'я і, без особливих підстав, він може не цікавитися фізичним розташуванням процесу, що з ним взаємодіє. Синтаксис відправки повідомлення процесу на своєму вузлі та віддаленому однаковий.
Завдяки вбудованим у мову можливостям розподілених обчислень об'єднання в кластер, балансування навантаження, додавання вузлів та серверів, підвищення надійності викликають лише невеликі витрати на додатковий код. За замовчуванням, вузли спроєктовані для роботи всередині відокремленого сегмента мережі (DMZ), але, якщо необхідно, комунікація між вузлами може відбуватися із застосуванням протоколу SSL, захищеного криптографічними методами.
М'який реальний час
Програми високорівневою мовою Erlang можуть бути використані в системах м'якого реального часу (який іноді перекладають як «псевдореальний» або «квазіреальний»). Автоматизоване керування пам'яттю та збирання сміття діють у рамках одного процесу, що дає можливість створювати системи з мілісекундним (навіть незважаючи на необхідність збирання сміття), що не відчувають погіршення пропускної здатності при високому навантаженні.
Гаряча заміна коду
Для систем, які не можуть бути зупинені для , Erlang пропонує гарячу заміну коду (англ. hot code upgrade). При цьому в додатку можуть одночасно працювати старі і нові версії коду. У такий спосіб програмне забезпечення на Erlang може бути модернізовано без простоїв, а виявлені помилки виправлені.
Опис мови
Типи даних
Типізація в Erlang є сильною та динамічною. Динамічна типізація була обрана для мови Erlang через те, що перші розробники були більше з нею знайомі. На думку Джо Армстронга, статична типізація вимагала б дуже великих трудовитрат, зокрема, реалізувати систему гарячого дозавантаження коду було б дуже важко. Така типізація, коли можливі помилки типів виявляються лише під час виконання, не завадила можливості створювати системи з дуже . Дані Erlang є незмінними: операції не переписують старі значення, що знаходяться в пам'яті. Якщо необхідно, модулі на Erlang можна забезпечити описами та визначеннями нових типів (що не впливають на компіляцію програми) для автоматичної перевірки типів за допомогою утиліти Dialyzer.
Числа
У Erlang є два типи числових літералів: цілі і з рухомою комою, наприклад: 125
,4.5e-20
. Крім звичайної нотації, числа можна задавати через символ ASCII (наприклад, $B
означає 66
) або разом із зазначенням системи числення з основою від 2 до 36 (у старих версіях — до 16), наприклад: 16#3f
, 2#1010
. У Erlang застосовуються цілі числа довільної точності та дійсні числа подвійної точності (64 біти), у стандарті . Для роботи з числами можна використовувати модуль math
, який містить звичайний набір математичних функцій та функцію math:pi/0
, що повертає число . Приклад обчислень в інтерактивній оболонці:
Erlang/OTP 23 [erts-11.2.2.4] [source] [64-bit] [smp:20:20] [ds:20:20:10] [async-threads:1] [hipe] Eshell V11.2.2.4 (abort with ^G) 1> 123 / 23 + 12 * (2 + 3). 65.34782608695652 2> math:cos(math:pi()). -1.0 3> random:uniform(10). 5
Атоми
Атом — константа з ім'ям, що має бути взята в одинарні лапки, якщо не починається з малої літери або містить знаки, окрім літер, цифр, підкреслення, крапки та символу@
. Поняття атома запозичене з Prolog та його можна вважати аналогом перерахувань (enum) в інших мовах програмування (без необхідності попередньої декларації). Атоми використовуються майже виключно в порівняннях (та в зіставленні зі взірцем (en: Pattern matching)), та мають Erlang дуже ефективну реалізацію. Крім того, деякі атоми мають певний сенс у значеннях, що повертаються, і описі винятків. До них відносяться, наприклад: error
, ignore
, noreply
, ok
, reply
, stop
, undefined
.
Бітові рядки та бінарні дані
Бітовий рядок використовується для зберігання пам'яті нетипізованих даних. Рядки, що складаються з цілої кількості октетів, називаються бінарними (або двійковими) даними (англ. binaries). Синтаксис опису бітового рядка досить гнучкий, оскільки визначає значення бітів окремих діапазонів і може бути забезпечений модифікатором типу. Декілька прикладів в інтерактивній командній оболонці:
1> <<23,89,120>>. <<23,89,120>> 2> <<"ABC">>. <<65,66,67>> 3> <<10,17,42:16>>. <<10,17,0,42>> 4> <<$a, $b, $c>>. <<"abc">> 5> <<1024/utf8>>. <<208,128>>
Конструктори бітових рядків (англ. bitstring comprehension) аналогічні списковим генераторам, але працюють над бітовими рядками:
1> << <<bnot(X):1>> || <<X:1>> <= <<2#111011:6>> >>. <<4:6>>
У цьому прикладі змінна X послідовно отримує біти числа 2#111011
, які потім інвертуються операцією бітового заперечення bnot
(від англ. binary NOT), внаслідок чого виходить число 4.
Кортеж
Кортеж (англ. tuple) — складений тип даних з фіксованою кількістю елементів. При доступі до елементів кортежу за допомогою вбудованих функцій, нумерація елементів починається з одиниці, а не з нуля. Перший елемент кортежу (атом) можуть використовувати для опису ролі кортежу у програмі — його називають тегом (англ. tag — «мітка»). В Erlang прийнято будувати різні типи даних на основі кортежів з тегами, це полегшує зневадження програми та вважається гарним стилем програмування.
Для роботи з кортежами є декілька вбудованих функцій, наприклад:
1> tuple_size({a, 1, "777"}). 3 2> element(1, {b, 2, 3, 4}). b 3> setelement(1, {c, 5}, d). {d,5}
Список
Список (англ. list) — складений тип даних зі змінною кількістю елементів. Для маніпуляції зі списками можна використовувати функції модуля lists
стандартної бібліотеки. Формально список визначається як структура, яка має голову (англ. head) та хвіст (англ. tail), що виражається синтаксично у вигляді [HEAD|TAIL]
, де хвіст зазвичай є списком (можливо порожнім). Порожній список позначається []
Списки можна записувати і більш звичним способом. Наступні записи еквівалентні:
1> [a|[b|[c|[]]]]. [a,b,c]
Для роботи зі списками можна використовувати конструктори списків(генератори списків — en: List Comprehensions), наприклад:
1> [X / 2 || X <- [1,2,3,4]]. [0.5,1.0,1.5,2.0]
Модуль lists
стандартної бібліотеки містить функції для роботи зі списками (та рядками, оскільки рядок виду «test» в Erlang є списком кодів символів), такі як знаходження найбільшого значення, сортування, зміни порядку елементів на протилежний, отримання суми елементів тощо. У наступному прикладі «склеюємо» два списки в один за допомогою конкатенації, і далі розбиваємо на два списки функцією lists:split/2
:
1> lists:split(2, [l,2,3] ++ [4,5,6]). {[l,2],[3,4,5,6]}
А це приклад того, що рядок виду «test» в Erlang є списком кодів символів:
1> "test" =:= [$t, $e, $s, $t]. true 2> "test" =:= [116, 101, 115, 116]. true 3> $t. 116
У модулі lists
є також набір функцій вищого порядку, таких як lists:all/2
, lists:any/2
, lists:dropwhile/2
, lists:filter/2
, lists:foldl/3
, lists:foldr/3
, lists:map/2
, lists:foreach/2
.
lists:map/2
— функція вищого порядку, яка дає можливість застосувати визначену нами функцію до кожного елемента списку, в результаті отримаємо новий список:
third_degree(R) -> lists:map(fun(X) -> math:pow(X, 3) end, R).
В даному прикладі функція math: pow(X, 3) підносить до степеня 3 кожен елемент списку R.
lists:filter/2
— дана функція вищого порядку приймає два параметри: функцію (предикат), за допомогою якої ми відфільтровуємо наш список — другий параметр. Повертає новий список — результат обробки фільтром вхідного списку.
multiple_three(List) -> lists:filter(fun(X) -> X rem 3 =:= 0 end, List).
В даному прикладі з вхідного списку List у новий — вихідний список попадуть лише елементи, кратні трьом.lists:foldl/3
— функція лівої згортки (англ. fold — згорнути, «l» від англ. left — лівий) приймає 3 аргументи:
- функцію згортання
- початкове значення акумулятора
- перелік
Функція згортання приймає два аргументи: поточний елемент списку та поточне значення акумулятора. І повертає нове значення акумулятора.
Класичні приклади — обчислення суми та добутку елементів масиву:
1> Numberlist = [11, 12, 13, 14, 15]. [11, 12, 13, 14, 15] 2> lists:foldl(fun(Item, Acc) -> Acc + Item end, 0, Numberlist). 65 3> lists:foldl(fun(Item, Acc) -> Acc * Item end, 1, Numberlist). 360360
Наступний приклад ілюструє роботу функції правої згортки lists: foldr (англ. fold — згорнути, «r» від англ. right — правий), першим параметром якої має бути функція:
1> D = fun(V, A) -> V / A end. % функція D - ділення V на A #Fun<erl_eval.12.82930912> 2> lists:foldr(D, 1, [1, 2, 4, 8]). 0.25 3> 1/(2/(4/(8/1))). 0.25
Результат виконання згортки справа наліво (у рядку 2) тотожний ланцюжковому поділу (рядок 3). Другий параметр foldr
— початкове значення так званого акумулятора. Для кожного елемента списку (справа ліворуч) до елемента та акумулятора застосовується функція, задана першим аргументом foldr
, а значення записується в акумулятор. За вичерпанням списку, функція повертає значення акумулятора. Функція є досить потужним засобом, якщо врахувати, що акумулятор може бути списком або кортежем.
Зазвичай користуються foldl — тому, що операція отримання елементу-голови списку виконується за константний час, а для отримання елементу з кінця списку потрібно пройтись через весь список.
Рядок
У Erlang немає самостійного типу для рядків — внутрішньо рядки є списками кодів символів. Рядок "Привіт!"
рівносильний (у відповідному кодуванні) списку [1055,1088,1080,1074,1077,1090,33]
. Для правильної інтерпретації списків кодів символів як рядків в інтерактивній консолі — запускайте з відповідним параметром: $ erl +pc unicode
. Erlang підтримує Unicode як у рядку, так і запису окремого символу ($X
, де X — деякий символ).
Бінарні послідовності записуються та відображаються, як послідовності цілих чисел або рядків, поміщені між подвійними символами <
та >
. Для прикладу:
1> <<5,10,20>>. <<5,10,20>> 2> <<"hello">>. <<"hello">>
term_to_binary(Term) -> Bin
— Конвертує будь-який терм Erlang у бінарну послідовність.
Бінарна послідовність, вироблена за допомогою term_to_binary, зберігається в так званому зовнішньому форматі терму. Терми, які були конвертовані в бінарні послідовності з використанням term_to_binary, можуть бути збережені в файли, передані в повідомленнях по мережі тощо, а початковий терм, з якого вони були зроблені, може бути відновлений пізніше. Це надзвичайно корисно для збереження складних структур даних у файли або надсилання складних структур даних на віддалені машини.
1> B = term_to_binary("useful"). <<131,107,0,6,117,115,101,102,117,108>> 2> binary_to_term(B). "useful"
Атоми і рядки зовні досить схожі, але мають різні реалізації. Тоді як атоми можна лише порівнювати, рядки підтримують багато інших операцій, їм є безліч функцій в модулях lists
і string
. Рядок може виконувати функції атома, але пам'ять, яку займає рядок, пропорційна його довжині, тоді як атоми зберігаються в системній таблиці і на кожне зберігання/пересилання атома в програмі припадає лише декілька байтів, незалежно від довжини атома. Порівняння двох атомів — це порівняння двох внутрішніх ідентифікаторів, яке виконується за одну операцію, тоді як порівняння рядків передбачає поелементний прохід, тобто порівняння кодів символів — елементів списків.
Логічні значення
Для значень булевої логіки істинне та хибне в Erlang застосовуються атоми true
(істинне) і false
(хибне), які використовуються операціями порівняння, логічними операціями, вбудованими функціями. Приклад:
1> 2 < 3. true 2> is_boolean(125). false
Функціональний об'єкт (Fun)
Fun-вираз
дозволяє створити анонімну функцію (лямбда-функцію), яка використовується, наприклад, для передачі аргументом в іншу функцію. За допомогою fun
можна також отримати функціональний об'єкт для функції модуля. Приклади:
1> lists:map(fun(X) -> X + 1 end, [1, 2, 3]). [2,3,4] 2> Belongs = fun lists:member/2. #Fun<lists.member.2> 3> Belongs(a, [a, b]). true
Запис
Щоб позначати окремі елементи кортежів (полегшити роботу з великими кортежами) і уникнути помилок при написанні програми, в Erlang було додано синтаксичний цукор — синтаксис записів (англ. record). Записів не існує в час виконання — на етапі компіляції записи перетворюються (транслюються) в кортежі — ключі губляться, відповідно, в час виконання існують лише значення записів. Для роботи з записами, необхідно спочатку дати опис запису директивою -record
, наприклад, для запису user
опис може бути наступним
-record(user, {login = "anonymous", email, password}).
З цього опису компілятор дізнається, що маються на увазі кортежі з чотирьох елементів, в яких елементи з другого по четвертий відповідають полям login
, nick
, password
запису з ім'ям user
(визначається атомом в першому елементі кортежу). Значенням за замовчуванням для поля login
є рядок "anon"
. Якщо значення за замовчуванням не вказано явно, таким є атом undefined
.
Створення записів та вилучення елементів запису завжди вимагає явної вказівки імені запису:
R0 = #user{}, % всі поля отримують значення за замовчуванням R1 = #user{login = "user1", email = "user@mail.com", password = "secret"}, % Задаємо значення для всіх полів
Оновлення одного значення в наявному записі: R2 = R1#user{login = "user2"},
оновлення двох значень в наявному записі: R2 = R1#user{login = "user2", email = "neo@matrix.org"},
отримати значення по ключу з запису Nick2 = R2#user.nick.
.
Карта
Асоціативний масив (словник) (en: map) зберігає пари виду «(ключ, значення)». І ключем, і значенням може бути будь-який терм Erlang.
Map = #{a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "hi" => 42}, Key = "hi", maps:find(Key,Map). {ok,42}
Інші типи
У мові Erlang є інші типи даних. Тип посилання (англ. reference) є унікальним у межах вузла/кластера з'єднаних вузлів в середовищі часу виконання Erlang. Посилання створюється викликом функції make_ref/0
і може повторитися через 282 викликів цієї функції. Посилання можна порівнювати на рівність, а застосовуються вони для одноразових позначок або
Ідентифікатор порту (англ. port identifier) визначає порт для зв'язку із зовнішнім по відношенню до Erlang-системи світом. Порт дозволяє процесу, що його створив-власнику (так званому приєднаному процесу) обмінюватися бінарними повідомленнями зі сторонніми програмами і ОС способом, прийнятим в даній операційній системі.
Ідентифікатор процесу (англ. Pid), як і випливає з його назви, ідентифікує процес, що породжується різними функціями spawn
. Ідентифікатор можна вважати унікальним під час роботи Erlang-системи, але в системах, що довго працюють, можуть все-таки бути використані повторно, що зазвичай не є проблемою на практиці.
Вбудовані функції для роботи з типами
Для перетворення типів використовуються вбудовані функції (BIF,англ. builtin function) виду x_to_y («з x в y»), а для перевірки належності значення того чи іншого типу — функції виду is_x («є_x»):
1> atom_to_list(hello). "hello" 2> list_to_binary("world"). <<"world">> 3> tuple_to_list({1,2,3,4}). [1,2,3,4] 1> is_integer(3). true 2> is_tuple("abc"). false 3> is_integer(3.0). false
Операції
Арифметичні операції
Erlang надає найбільш поширені арифметичні операції для цілих чисел і чисел з плаваючою комою:
Позначення | Операція, що виконується | приклад | Результат прикладу |
---|---|---|---|
+ | Унарний плюс | +3 | 3 |
- | Унарний мінус | -3 | -3 |
+ | Додавання | 2+3 | 5 |
- | Віднімання | 7-3 | 4 |
* | множення | 1.2*0.4 | 0.48 |
/ | Ділення | 5 / 3 | 1.6666666666666667 |
div | Цілочисельне ділення | 5 div 3 | 1 |
rem | Залишок від ділення | 5 rem 3 | 2 |
Всі ці операції . Унарні операції мають найвищий пріоритет, потім слідує множення і ділення, найменший пріоритет у складання та віднімання. При необхідності ціле може приводитися до типу з рухомою комою.
Бітові операції
Бітові операції працюють над цілими числами і дають в результаті ціле число.
Позначення | Операція, що виконується | приклад | Результат прикладу |
---|---|---|---|
bnot | Побітове заперечення | bnot (2#1000) | -9 |
band | Побітове І | 2 band 3 | 2 |
bor | Побітове АБО | 1 bor 2 | 3 |
bxor | Побітове виключне АБО | 5 bxor 3 | 6 |
bsr | Побітовий зсув вправо | 32 bsr 2 | 8 |
bsl | Побітовий зсув вліво | 1 bsl 5 | 32 |
Логічні операції
Логічні операції працюють над логічними значеннями true
(істинне) і false
(хибне), одержуваними в результаті порівнянь та застосування функцій перевірки типу:
Позначення | Операція, що виконується | приклад | Результат прикладу |
---|---|---|---|
not | Заперечення (НЕ) | not true | false |
and | Кон'юнкція (І) | true and (1 < 5) | true |
andalso | Аналогічно and , але не обчислює другий операнд, якщо перший false | false andalso (1 < 5) | false |
or | Диз'юнкція (АБО) | is_atom("1") or is_atom(1) | false |
orelse | Аналогічно or але не обчислює другий операнд, якщо перший true | true orelse (1 < 5) | true |
xor | Виключне АБО | true xor true | false |
Операції порівняння
Операції порівняння отримують два операнди, а результатом операції є логічне значення true
або false
. У Erlang є наступні операції: ==
(рівно), =:=
(рівно, враховуючи тип — використовується для порівняння чисел), /=
(не рівно), =/=
(не рівно, враховуючи тип — використовується для порівняння чисел), =<
(менше або дорівнює), <
(менше), >
(більше), >=
(більше або дорівнює):
==
перевірка на рівність (не враховуючи тип):
1> 5 == 5. true 2> 5 == 5.0. true
=:=
перевірка на рівність (враховуючи тип):
4> 5 =:= 5. true 5> 5 =:= 5.0. false
Можна порівнювати значення різних типів, але вони вважаються в Erlang впорядкованими наступним чином: число < атом < посилання < функція < порт < ідентифікатор процесу < кортеж < список < бінарні дані
Списки вважаються впорядкованими в лексикографічному порядку, а кортежі порівнюються за довжиною, і лише потім у лексикографічному порядку.
Змінні
Змінні служать для зберігання значень простих і складових типів. Ім'я змінної починається з великої літери (у спеціальних випадках — з підкреслення) і може містити букви, цифри, підкреслення. Змінній можна присвоїти значення лише один раз — ця властивість мови програмування називається одиничним присвоєнням (англ. single assignment). До переваг одиничного присвоєння можна віднести усунення необхідності в блокуваннях, а також спрощення налагодження програми
Відбувається обчислення(редукція) аргументів функції перед застосуванням функції до цих аргументів (вхідних параметрів).
Область видимості змінної поширюється від її визначення (en: bind — зв'язування) до закінчення клози функції. Приклад:
binomial(X) -> Y = X * X, X + Y. prod([1|T]) -> prod(T); prod([Y|T]) -> Y * prod(T); prod([]) -> 1.
У цьому прикладі область видимості X
— весь опис функції binomial/1
, а Y
— від присвоєння до кінця опису. Змінна Y
у другій клозі функції prod/1
не має відношення до змінної Y
з binomial/1
: її область видимості поширюється до кінця цієї клози.
При виході обчислень за межі області видимості змінної, пам'ять, зайнята її вмістом, може бути звільнена у процесі збирання сміття, якщо значення змінної не використовується в іншій частині програми.
Зіставлення зі зразком (en: Pattern Matching) використовується в Erlang для присвоєння (у тому числі, при роботі з параметрами функцій), управління потоком виконання програми, отримання значень складових типів, вибору повідомлення з черги. У лівій частині порівняння (або в заголовку функції) можуть бути пов'язані (вже мають значення) і незв'язані (отримуючі значення) змінні, а також літерали (атоми, числа, рядки). В результаті виконання порівняння може виявитися успішним (у цьому випадку змінні зв'язуються зі значеннями) та неуспішним — змінні залишаються непов'язаними. У зразку можуть бути змінні, значення яких для зразка байдуже: їх імена записуються з підкреслення. Змінні, ім'я яких починається з підкреслення, це звичайні змінні, крім того, що компілятор не буде скаржитися, якщо вони не використані. Не можна прив'язувати до них значення більше одного разу.
Функції
Програми Erlang складаються з функцій, які викликають одне одного. Кількість вхідних аргументів (параметрів) функції називається арністю. При виклику функції заголовки функції зіставляються зі зразком. У разі збігу параметрів виклику формальні параметри зв'язуються з фактичними і виконується відповідна частина тіла функції. Запис варіанту обчислення функції для деякого зразка може називатися клозом від англ. clause, а визначення функції — це набір з одного або більше клозів.
Для уточнення зіставлення зі зразком у функціях можна використовувати охоронні вирази, які випливають після ключового слова when
. У прикладі нижче визначено функцію обчислення знака числа, яка розраховується в залежності від порівняння параметра з нулем:
sign(X) when X > 0 -> 1; sign(X) when X == 0 -> 0; sign(X) when X < 0 -> -1.
Erlang перебирає (матчить) клози функції в тому порядку, в якому вони записані (зверху вниз, зліва направо), доки не буде знайдено відповідний вираз (заголовок клози), який зматчиться. В охоронних виразах можна використовувати лише обмежений набір вбудованих функцій, оскільки ці функції не повинні мати побічних ефектів.
Функції Erlang підтримують рекурсивні виклики. У разі коли визначення функції закінчується рекурсивним викликом (хвостова рекурсія), Erlang використовує оптимізацію: стек викликів не застосовується.
Як параметром, і результатом функції може бути інша функція. У наступному прикладі функція одного аргументу повертає функцію додавання аргументу
1> Plus = fun(X) -> fun(Y) -> X + Y end end. % Визначення функції, яка повертає функцію #Fun<erl_eval.6.82930912> 2> Plus(2). % Функція повертає Fun-об'єкт #Fun<erl_eval.6.82930912> 3> Plus(2)(3). % Такий синтаксис не працює * 1 : syntax error before : '(' 4> ( Plus(2) )(3). % Додаткові дужки дозволяють досягти необхідного результату 5 5> Plus2 = Plus(2), Plus2(3). % Те саме з використанням додаткової змінної 5
Умовні вирази
Окрім матчингу та охоронних виразів у клозах функції, в Erlang є інші умовні вирази вибору: if та case. Вираз вибору дозволяє організувати зіставлення зі зразком усередині функції і зазвичай має наступний синтаксис:
if охорона1 -> вираз11, вираз12, ... ; охорона2 -> вираз21, вираз22, ... ; ... охоронаN -> виразN1, виразN2, ... end
Тут охорона1
— охоронний вираз (en: guards). Охоронні вирази — розширення зіставлення зі зразком, що додає виразності. Без охоронних виразів ми не можемо визначати такі речі, як діапазон значень чи певні типи даних. У Erlang if — це вираз, який може мати декілька гілок. Гілки скануються послідовно, зверху донизу, допоки захисна послідовність не буде оцінена як true. Якщо охорона1 (перший guard в даному прикладі) поверне true одразу почнеться виконання відповідних виразів: вираз11, вираз12,… Після виконання цих виразів відбудеться вихід з блоку і наступні умови охорона2, …, охоронаN
перевірятися не будуть. Якщо ж охорона1
поверне false
, відбувається перехід до перевірки наступного охоронного виразу, і так доти, поки guard не поверне значення true, після чого будуть виконані відповідні, розділені комами вирази і вихід з блоку. Слід зауважити, що і тут в охоронному виразі можна застосовувати лише обмежений набір операцій та вбудованих функцій. Коми в охоронному вираженні працюють як операція andalso, крапка з комою — як orelse, наприклад:
if X =< 0 -> io:format("менше або дорівнює нулю ~n", []), <<"менше або дорівнює нулю"/utf8>>; X > 0, X < 10 -> io:format("більше нуля та менше десяти ~n", []), <<"більше нуля та менше десяти"/utf8>>; X == 10; X == 11 -> io:format("дорівнює десяти або одинадцяти~n", []), <<"дорівнює десяти або одинадцяти"/utf8>>; true -> io:format("більше або дорівнює дванадцяти~n", []), <<"більше або дорівнює дванадцяти"/utf8>> end.
Якщо жодна захисна послідовність не є істинною, виникає помилка виконання if_clause
. При необхідності можна використовувати захисник true
. В останній гілці, оскільки ця захисна послідовність завжди вірна, і вважається аналогом «інше». Компілятор Erlang стежить за безпекою зв'язування змінних усередині умовних виразів, це ми можемо побачити на наступному прикладі:
-module(badexample). -export([broken_if/1]). broken_if(X) -> if X < 0 -> Z = -1; X >= 0 -> Y = 1 end, Y * Z.
При спробі скомпілювати модуль виникають повідомлення про помилки, тому що в такому коді змінні не пов'язуються зі значенням в іншій клозі відповідно:
1> c(badexample). badexample.erl:8: variable 'Y' unsafe in 'if' (line 4) badexample.erl:8: variable 'Z' unsafe in 'if' (line 4) error
Правильним було б визначити всі використовувані далі за кодом змінні у всіх гілках if-вирази.
-module(if_else). -export([compare/2, ascii/1, run/3]). compare(X, Y) -> Result = if X > Y -> greater; X =:= Y -> equal; X < Y -> less end, io:format("~p is ~p than ~p ~n", [X, Result, Y]). ascii(Letter) -> Code = if Letter =:= 'A' -> 101; Letter =:= 'B' -> 102; true -> unknown end, io:format("~p = ~p ~n", [Letter, Code]). run(X, Y, Letter) -> compare(X, Y), ascii(Letter).
Можна використовувати вираз case ... of
для порівняння послідовності патернів. На відміну від виразу if, case ... of
дозволяє використовувати охоронні вирази в пунктах співставлення. Якщо жодний вираз case не відповідає зразку (не матчиться), система виконання викличе помилку про відсутність відповідності: «no case clause matching». Використовувати шаблон підкреслення _
можна, щоб захопити будь-яке інше значення, яким не відповідали попередні ключі.
case expression of pattern1 [when guard1] -> expr_seq1; pattern2 [when guard2] -> expr_seq2; ... end.
Спочатку обчислюється expression, припустимо, що при цьому воно набуває значення Value. Далі Value співставляється з pattern1 (разом з опціональним контролером guard1), pattern2 і так далі, до першого успішного співставлення. Як тільки це станеться, виконується послідовність виразів (expr_seqN) і результат цього обчислення стає результатом всього даного виразу. Якщо жоден із патернів не підійде, то відбувається виняткова ситуація.
-module(case_of). -compile([export_all, nowarn_export_all]). admit(Person) -> case Person of {male, Age} when Age > 21 -> yes_with_cover; {female, Age} when Age > 21 -> yes_no_cover; {male, _} -> no_boy_admission; {female, _} -> no_girl_admission; _ -> unknown end. run(Person) -> Record = admit(Person), io:format(" ~p~n", [Record]).
Приклади
В функціональних мовах програмування відсутні цикли, натомість використовується рекурсія.
Розглянемо функції обчислення факторіалу:
-module(fact). -export([fac/1, func/1]). fac(0) -> 1; fac(N) when N > 0 -> N * fac(N-1).
Це рекурсія без хвостової оптимізації, вона добре працює для невеликої глибини рекурсії. Проте, стає проблематичною у випадку великої глибини рекурсії.
Чим більше операцій рекурсії — тим більше займе пам'яті дана програма у стеку при виконанні, дана рекурсія розгортається у стек — відповідно, чим більше рекурсивних викликів — тим більше пам'яті займе дана програма при виконанні.
Хвостова рекурсія — це рекурсія, яка викликається останньою інструкцією, таким чином стек залишається незмінним (або ж практично незмінним) і функція може працювати перманентно без зупинки.
func(N) -> func(N,1). func(0,A) -> A; func(N,A) when N > 0 -> func(N-1, N*A).
Хвостова рекурсія незалежна від кількості рекурсивних викликів — в пам'яті залишаються лише два числа. Спробуємо написати функцію обчислення N-ного числа Фібоначчі на Erlang двома шляхами-алгоритмами. Спочатку звичайна рекурсія.
-module(fibonacci). -export([fib_usual/1, fib_tail/1]). fib_usual(1) -> 0; fib_usual(2) -> 1; fib_usual(N) when N > 0 -> fib_usual(N - 1) + fib_usual(N - 2).
Дана функція тримає всі числа-проміжні результати одночасно у памяті, і кількість рекурсивних викликів функції — активних процесів — зростає надто стрімко. Хвостова рекурсія в даному випадку пишеться з використанням двох тимчасових змінних в якості параметрів нашої функції. Такі змінні називаються акумуляторами та використовуються для зберігання проміжних результатів наших обчислень, щоб не зберігати багато незакінчених обчислень (процесів, які очікують результат розрахунків від інших процесів) у пам'яті.
fib_tail(N) when is_integer(N), N > 0 -> fib_tail(N, 1, 0). fib_tail(0, A1, _) -> A1; fib_tail(N, A1, A2) -> fib_tail(N - 1, A2, A1 + A2).
У памяті тримаються лише три числа та займається обчисленнями лише один процес.
Додамо декілька функцій, які працюють рекурсивно зі списком і виконують такі звичні для всіх нас завдання:
- визначення довжини масиву;
- знаходження максимального (мінімального) елемента масиву;
- обчислення суми всіх елементів масиву.
1. Визначення довжини масиву:
- спочатку звичайна рекурсія
len_list([]) -> 0; len_list([_]) -> 1; len_list([_H|T]) when is_list([_H|T]) -> 1 + len_list(T).
- хвостова рекурсія з акумулятором
length_tail(List) when is_list(List)-> length_tail(List, 0). length_tail([], Acc) -> Acc; length_tail([_|Tail], Acc) -> length_tail(Tail, 1 + Acc).
2. Знаходимо максимальний елемент масиву:
- спочатку звичайна рекурсія
max_el([Last]) when is_number(Last) -> Last; max_el([H | T]) when hd(T) >= H -> max_el(T); max_el([H | T]) -> max_el([H | tl(T)]).
- та сама функція, з допомогою хвостової рекурсії і акумулятора
tail_maxx([H | T]) when is_number(H)-> tail_maxx(T, H). tail_maxx([], Acc) when is_number(Acc) -> Acc; tail_maxx([H | T], Acc) when H >= Acc -> tail_maxx(T, H); tail_maxx([_ | T], Acc) -> tail_maxx(T, Acc).
3. Підрахуємо суму елементів масиву:
- звичайна рекурсія
sumx([]) -> 0; sumx([H | T]) -> H + sumx(T).
- підрахунок суми елементів масиву з допомогою хвостової рекурсії
tail_sum(List) -> tail_sum(List, 0). tail_sum([], Acc) -> Acc; tail_sum([H | T], Acc) -> tail_sum(T, Acc + H).
Один з алгоритмів сортування — швидке сортування
-module(qsort). -export([qsort/1]). qsort([]) -> []; qsort([Pivot|Rest]) -> qsort([Front || Front <- Rest, Front < Pivot]) ++ [Pivot] ++ qsort([Back || Back <- Rest, Back >= Pivot]).
У цьому прикладі функція qsort
викликається рекурсивно до вичерпання всіх елементів. Вираз [Front || Front <- Rest, Front < Pivot]
збирає список Front
з елементів Rest
таких, що елемент Front
менший за Pivot
. Оператор ++
склеює списки.
Препроцесор та макроси
Препроцесор Erlang (EPP) дозволяє вкладати файли з вихідним кодом один в інший, визначати макроси та здійснювати прості та параметризовані макропідстановки. Макрос визначається за допомогою директиви -define
, а макропідстановка здійснюється вказівкою імені макроса та можливих параметрів після знака питання (?
). Наступний приклад показує визначення та застосування параметризованого макроса:
-define(ZERO(X), X == 0). is_zero(T) when ?ZERO(X) -> true; is_zero(T) -> false.
Ім'я макроса зазвичай пишеться великими літерами. Визначення макроса має містити лексеми Erlang цілком (наприклад, спроба задати частину імені змінної за допомогою макроса викликає синтаксичну помилку). Макроси можуть використовуватися для підвищення зручності читання коду в охоронних виразах, для операторів налагодження і т. ін. Препроцесор має декілька визначених макросів, які не можна перевизначити: ?MODULE
, ?MODULE_STRING
, ?FILE
, ?LINE
, ?MACHINE
.
Заголовний файл (розширення .hrl
) з визначеннями макросів та записів можна включити за допомогою директиви -include
.
Обробка помилок
Для обробки виняткових ситуацій Erlang можна застосовувати конструкцію try ... catch
, в загальному випадку записується в наступному вигляді
try вираз для обчислення of зразок1 when охорона1 -> вираз1; зразок2 when охорона2 -> вираз2; ... зразокN when охоронаN -> виразN catch класс1:зразокВикл1 when охоронаВикл1 -> виразВикл1; ... классМ:зразокВиклМ:Stacktrace when охоронаВиклМ -> виразВиклМ; end
Як і у випадку case-виразу, вираз, що обчислюється, зіставляється зі зразком (частини між of
і catch
) для отримання результату. Після ключового слова catch
слідують частини обробки винятків, у яких на додаток до зразків винятків можуть бути вказані класи винятків (перед двокрапкою): error
, throw
та exit
. Stacktrace — це список викликів функцій, обчислення яких виконувала програма, коли було створено виняток. Підкреслення може використовуватись як у зразку, так і в класі виключення. Наступний простий приклад ілюструє перехоплення помилки класу error
при обчисленні квадратного кореня.
1> try math:sqrt(-1) catch error:Error -> {error, Error} end. {error, badarith} 2> try math:sqrt(4) catch error:Error -> {error, Error} end. 2.0
Для створення винятків, визначених користувачем, використовується функція throw/1
, яка приймає кортеж з більш детальним описом помилки, що виникла і генерує виняток класу throw
. Використання цієї функції небажане через погіршення зручності читання коду програми, але може знадобитися в деяких випадках при роботі з вкладеними структурами даних, наприклад, при розборі XML. Винятки класу exit
виникають у результаті виклику вбудованої функції exit/1
або сигналу виходу.
До розробки Річардом Карлссоном (Richard Carlsson) з команди проєкту HiPE описаного вище нового механізму обробки винятків (з'явився у версії R10B) в Erlang використовувалися catch-вирази.
Модулі
Код програми на Erlang можна розбити на окремі модулі. Модуль — це ім'я для набору функцій, організованих в одному файлі. Ім'я модуля має збігатися з ім'ям файлу (якщо відкинути розширення). Модуль можна відкомпілювати в байт-код як із командного рядка операційної системи, так і з командної оболонки Erlang. У файлі модуля можна записати оголошення функцій та директиви (іноді називаються атрибутами). Обов'язковим атрибутом є лише -module(атом_імені_модуля).
Інший атрибут, що часто використовується — -export
— застосовується для опису списку експортованих функцій, тобто функцій, які можна використовувати за межами модуля.
Функції в Erlang однозначно визначаються модулем, ім'ям та арністю. Наприклад, math:cos/1
відповідає функції cos
з модуля math
приймає один аргумент. Викликати функцію можна так: math:cos(1.2)
Вихідний текст модуля компілюється в BEAM-файл — файл, що містить байт-код віртуальної машини BEAM (англ. Bogdan’s/Björn's Erlang Abstract MachineBogdan's/Björn's Erlang Abstract Machine). У свою чергу, ERTS (англ. Erlang Runtime SystemErlang Runtime System — система часу виконання Erlang) виконує цей код.
Процеси
Основною абстракцією паралельного програмування в Erlang є процес. Процеси можуть породжувати інші процеси, виконуватися одночасно, обмінюватися повідомленнями, реагувати на завершення один одного.
Створення процесів
Erlang має невеликий, але потужний набір примітивів для створення процесів і спілкування між ними.
Міжпроцесовий зв'язок працює за допомогою асинхронної системи передачі повідомлень, яка не має спільного доступу: кожен процес має «поштову скриньку» — чергу повідомлень, які були надіслані іншими процесами та ще не використані. Для отримання повідомлень, які відповідають бажаним паттернам, процес використовує примітив receive
. Процедура обробки повідомлень перевіряє повідомлення по черзі на відповідність кожному паттерну, поки один з них не збігається. Коли повідомлення використано та видалено з поштової скриньки, процес відновлює виконання. Повідомлення може містити будь-яку структуру Erlang, включаючи примітиви (цілі числа, числа з плаваючою точкою, символи, атоми), кортежі, списки та функції.
Для створення нового процесу служить декілька вбудованих функцій (spawn
та її аналоги). Функції повертають ідентифікатор процесу, який може використовуватися, наприклад, для надсилання повідомлень новоствореному процесу. В інтерактивній консолі erl можна отримати список процесів та іншу інформацію за допомогою функцій processes().
та i().
відповідно.
Наведений нижче приклад коду показує вбудовану підтримку розподілених процесів:
%% Створимо процес та викличемо функцію web:start_server(Port, MaxConnections) ServerProcess = spawn(web, start_server, [Port, MaxConnections]), %% Створимо віддалений процес та викличемо функцію %% web:start_server(Port, MaxConnections) на віддаленій ноді RemoteNode RemoteProcess = spawn(RemoteNode, web, start_server, [Port, MaxConnections]), %% Відправимо повідомлення процесу ServerProcess (асинхронно). %% Повідомлення складається з кортежа з атомом "pause" та числом "10". ServerProcess ! {pause, 10}, %% Отримаємо повідомлення, надіслані цьому процесу receive a_message -> do_something; {data, DataContent} -> handle(DataContent); {hello, Text} -> io:format("Got hello message: ~s", [Text]); {goodbye, Text} -> io:format("Got goodbye message: ~s", [Text]) end.
Як показує приклад, процеси можуть бути створені у віддалених вузлах, і взаємодія з ними є прозорою у тому сенсі, що взаємодія з віддаленими процесами працює точно так само, як взаємодія з локальними процесами.
Розподіленість (en: Concurrency) підтримує основний метод обробки помилок в Erlang. Коли процес аварійно завершується, він акуратно завершує роботу та надсилає повідомлення керуючому процесу, який потім може вжити заходів, наприклад запустити новий процес, який бере на себе завдання старого процесу.
Передача та прийом повідомлень
Як і мова Occam, Erlang використовує для відправки повідомлення синтаксис зі знаком оклику: Process_ID ! Message
. Прийом повідомлення — тобто вилучення його з черги («поштової скриньки») процесу — виконується за допомогою receive-виразів, які зазвичай записуються таким чином:
receive зразок1 when охорона1 -> вираз11, вираз12, ...; зразок2 when охорона2 -> вираз21, вираз22, ...; ... зразокN when охоронаN -> виразN1, виразN2, ...; Непов'язанаЗміннаДляІншихПовідомлень -> вираз1, вираз2, ... end
Зустрівши такий вираз, інтерпретатор послідовно переглядає повідомлення з черги. Кожне повідомлення інтерпретатор зіставляє зі зразком і, якщо воно відповідає зразку, то обчислюються відповідні вирази. Коли всі повідомлення перебрані, і потрібного не виявилося, процес очікує нових повідомлень, після чого перебір черги повторюється. Якщо в receive-виразі відсутній зразок, якому задовольняє будь-яке повідомлення, такий вираз називається вибірковим receive-виразом.
Обробка помилок та завершення процесів
Процес можна зв'язати з іншим, у результаті між процесами встановлюється двонаправлене з'єднання (англ. link). Якщо один із процесів завершується ненормально, всім пов'язаним з ним процесам передається сигнал виходу (англ. exit signal). Процеси, що отримали сигнал, завершуються, поширюючи сигнал далі. Сигнал виходу є кортежем, елементами якого є атом 'EXIT'
(вихід), ідентифікатор процесу, що завершився, і причину завершення процесу. Причина завершення передається ланцюжком процесів, що завершуються.
Процес може здійснити перехоплення помилки (англ. trapping errors), якщо він має прапорець перехоплення виходу. Такий процес отримує сигнали виходу пов'язаних з ним процесів у вигляді звичайних повідомлень з аналогічною структурою кортежу. Перехоплений сигнал виходу більше не передається пов'язаним з процесом-перехоплювачем процесам. Сигнал виходу з причиною — атомом normal
(нормальне завершення процесу) не викликає завершення пов'язаного процесу. Якщо ж причина — атом kill
, процес завершується беззастережно (незалежно від прапорець перехоплення виходу), а пов'язаним з ним процесам як причина відправляється атом killed
, що дає їм можливість зреагувати.
Erlang має можливість встановити і однонаправлене з'єднання. При завершенні процесу, що спостерігається, процес-спостерігач отримує повідомлення із зазначенням причини завершення. Процес може зупинити себе сам чи зупинити інший процес, викликавши функцію exit.
Ввід-вивід
У процесів Erlang-системи проблема (вводу-виводу), властива багатьом іншим мовам паралельного програмування, вирішена достатньо елегантно. Управління вводом-виводом, інтегроване з планувальником, вже на нижньому рівні здійснюється на основі подій, що дозволяє програмі обробляти вхідні та вихідні дані без зайвих блокувань. Такий підхід вимагає меншого числа випадків установлення та розриву з'єднань, а також прибирає необхідність блокування та перемикання контексту. Спосіб частіше застосовується в системах з явними вимогами високої доступності та низького часу відгуку. Реалізація подієво-орієнтованого вводу-виводу вбудована в Erlang-систему. Це є перевагою при проєктуванні паралельних додатків.
Стандартна бібліотека містить модуль io
з функціями вводу-виводу. Такі функції містять в собі побічні ефекти. Вони полягають, наприклад, у появі виведеної інформації в консолі або у записуванні даних у файл на диску. Наприклад, функція io:format
для форматованого виводу виводить рядок із підстановкою параметрів, повертаючи у разі успіху атом ok.
1> io:format("приклад виводу : ~p~n", [1]). приклад виводу : 1 ok
Функції модуля io
передбачають стандартний серверний інтерфейс вводу-виводу. Протокол вводу-виводу Erlang (англ. The Erlang I/O-protocol) детально визначає зв'язок клієнта і сервера, забезпечує двонаправлений зв'язок між клієнтами та серверами. Сервер вводу/виводу — це процес, який обробляє запити та виконує потрібне завдання, наприклад, на пристрої введення/виведення. Клієнт — це будь-який процес Erlang, який бажає читати або писати дані з/на пристрій введення/виведення.
Бібліотеки
Стандартна бібліотека модулів
Згідно з офіційною документацією, стандартна бібліотека модулів STDLIB є обов'язковою для включення до мінімальної системи Erlang/OTP разом з ядром Erlang. Бібліотека містить модулі, що надають різноманітні функції для роботи з вбудованими типами та іншими структурами даних, вводу-виводу, звернення до середовища, для роботи з файловою системою, процесами тощо.
Згідно з офіційною документацією, стандартна бібліотека модулів STDLIB є обов'язковою для включення до мінімальної системи Erlang/OTP разом з ядром Erlang. Бібліотека містить модулі, що надають різноманітні функції для роботи з вбудованими типами та іншими структурами даних, вводу-виводу, звернення до середовища, для роботи з файловою системою, процесами тощо.
Модуль array
:
- визначає (функціональний) абстрактний тип даних для динамічного масиву.
- містить функції вилучення та оновлення елементів масиву, рекурсивні функції для роботи з масивами.
Модуль string
розширює можливості модуля lists
функціями для роботи безпосередньо зі списками символів, якими є рядки в мові Erlang.
Модуль dict
(від англ. dictionary — словник) містить функції для асоціативного масиву. Наприклад, збереження, вилучення та видалення значення за ключем, з'єднання масивів тощо.
Модуль math
містить математичні функції.
Модуль random
містить функції для генерації псевдовипадкових чисел.
Модуль calendar
забезпечує обчислення місцевого та універсального часу, дня тижня та багатьох функцій перетворення часу. Час є місцевим, коли він налаштований відповідно до поточного часового поясу та літнього часу. Час є універсальним, коли він відображає час на нульовій довготі без будь-яких поправок на літній час.
Модуль timer
містить функції переведення інтервалів часу до мілісекунд, запуску подій за таймером та інші, пов'язані з часом, функції.
Модуль erlang
містить вбудовані функції Erlang; по замовчуванню, функції з цього модуля є імпортованими в кожен модуль.
Модуль file
забезпечує інтерфейс до файлової системи. Функції для відкриття, закриття, читання та запису файлів; перегляду директорій і т. д.
Модуль filelib
містить утиліти вищого рівня, ніж модуль file
. Цей модуль не підтримує «необроблені» імена файлів (тобто файли, імена яких не відповідають очікуваному кодуванню). Такі файли ігноруються функціями цього модуля. Допоміжні функції для маніпуляцій з файлами:
ensure_dir(Name) -> ok | {error, Reason}
— Переконується, що всі батьківські каталоги для вказаного файлу або імені каталогу існують, намагаючись створити їх, якщо необхідно. Повертає OK, якщо всі батьківські каталоги вже існують або можуть бути створені. Повертає {error, Reason}, якщо якийсь батьківський каталог не існує та не може бути створений.ensure_path(Path) -> ok | {error, Reason}
— Переконується, що всі батьківські каталоги для вказаного шляху Path існують, намагаючись створити їх, якщо необхідно. На відміну від secure_dir/1, ця функція намагатиметься створити всі сегменти шляху як каталог, включаючи останній сегмент. Повертає OK, якщо всі батьківські каталоги вже існують або можуть бути створені. Повертає{error, Reason}
, якщо якийсь батьківський каталог не існує та не може бути створений.
Модуль filename
містить функції для аналізу та обробки імен файлів. Ці функції створені таким чином, щоб код Erlang міг працювати на багатьох різних платформах із різними форматами імен файлів. Назва файлу може бути короткою відносною назвою, наприклад foo.erl, довгою абсолютною назвою, включаючи позначення диска, назвою каталогу, як-от D:\usr/local\bin\erl/lib\tools\foo.erl, або будь-якими варіаціями між ними. Допоміжні функції для маніпуляцій з файлами:
absname(Filename) -> file:filename_all()
— Перетворює відносне ім'я файлу та повертає абсолютне ім'я. Не робить спроб створити найкоротшу абсолютну назву, оскільки це може дати неправильні результати у файлових системах, які дозволяють посилання.absname(Filename, Dir) -> file:filename_all()
— Те саме, що absname/1, за винятком того, що каталог, до якого має бути віднесене ім'я файлу, вказано в аргументі Dir.
Модуль io
забезпечує інтерфейс до стандартних серверів введення/виведення Erlang. Усі функції виведення повертають ОК, якщо вони успішні, або завершують роботу, якщо це не так. Функції в цьому модулі мають додатковий параметр IoDevice. Якщо він включений, це буде pid процесу, який обробляє протоколи введення/виведення. Зазвичай — IoDevice, який повертає file: open/2. Якщо IoDevice не вказано, використовується standard_io. Опис протоколів вводу-виводу є у розділі «Протокол вводу-виводу Erlang» у посібнику користувача.
Модуль io_lib
— функції бібліотеки введення/виведення. Містить функції для перетворення в / і з рядків (списків символів). Вони використовуються для реалізації функцій в модулі io.
Модуль crypto
забезпечує набір криптографічних функцій. Наявні хеш-функції:
- SHA1, SHA2 — Secure Hash Standard [FIPS PUB 180-4].
- SHA3 — Standard: Permutation-Based Hash and Extendable-Output Functions [FIPS PUB 202].
- BLAKE2 — fast secure hashing.
- MD5 — Message Digest Algorithm [RFC 1321].
- MD4 — Message Digest Algorithm [RFC 1320].
Модуль crypto_app
— додаток crypto
. Метою програми crypto є надання Erlang API для криптографічних функцій. API знаходиться на досить низькому рівні, і є деякі відповідні функції API, доступні в public_key(3), на вищому рівні абстракції, який використовує криптододаток у своїй реалізації. Поточна реалізація крипто використовує nifs для інтерфейсу криптобібліотеки OpenSSL і може працювати з обмеженою функціональністю зі старими версіями, як OpenSSL 0.9.8c. Підтримка режиму FIPS вимагає принаймні версії 1.0.1 і встановлення OpenSSL із підтримкою FIPS. Рекомендується використовувати версію, яка офіційно підтримується проєктом OpenSSL. API-сумісні серверні модулі, такі як LibreSSL, також повинні працювати. Криптододаток щодня тестується принаймні з однією версією OpenSSL 1.0.1, 1.0.2, 1.1.0, 1.1.1 і 3.0. Режим FIPS також перевірено для 1.0.1 і 1.0.2. Використання OpenSSL 3.0 із механізмами або в режимі FIPS ще не підтримується програмою OTP/crypto. Вихідні версії OpenSSL можна завантажити з домашньої сторінки проєкту OpenSSL або з перелічених там сайтів-дзеркал.
Окрім цих найбільш важливих модулів, стандартна бібліотека містить багато інших, з якими можна познайомитися за документацією.
Таблиці ETS та DETS
Для організації колекцій в оперативній пам'яті в Erlang є модуль ETS (англ. Erlang Term Storage — «сховище термів Erlang»). ETS може зберігати чотири види колекцій: множина (англ. set), впорядкована множина (англ. ordered set), мультимножина (англ. bag), мультимножина з повтореннями (англ. duplicate bag). Доступ до елементів колекцій відбувається ключовим полем кортежу(ключі, як і значення, можуть бути будь-яких типів). Упорядковані множини зреалізовані у вигляді бінарних збалансованих АВЛ-дерев, а інші колекції — з використанням хеш-таблиць.
DETS-таблиці доповнюють функціональність ETS-таблиць (за винятком впорядкованих множин), дозволяючи зберігати дані у файлах.
Фреймворк OTP
OTP (англ. Open Telecom Platform) є налагодженим набором корисних поведінок (англ. behaviours) процесів. Він використовується для створення серверних програм. OTP формалізує дії процесів та дозволяє будувати на їх основі OTP-додатки. У модулях ОТР визначено загальні, стандартизовані шаблони для конструювання паралельних додатків. Gen_server
— інтерфейсний модуль для реалізації клієнт-серверної архітектури. Загальний серверний процес (gen_server
), реалізований за допомогою цього модуля, має стандартний набір інтерфейсних функцій і включає функції відстеження та звітування про помилки. Він вписується в дерево нагляду OTP. Найпопулярнішими поведінками є узагальнений сервер та спостерігач (англ. supervisor). Є й інші поведінки: кінцевий автомат, обробник подій. OTP містить і інше сполучне програмне забезпечення (англ. middleware), наприклад, СУБД .
OTP-поведінки поділяються на робочі процеси (англ. worker processes):
- Що виконують власне обробку запитів,
- Процеси-спостерігачі (англ. supervisors).
У завдання процесів спостерігачів входить стеження за робочими процесами та іншими процесами спостерігачами — нащадками. Дерева спостерігачів складають OTP-додаток (англ. application). Документація Erlang визначає OTP-додаток компонентом, який реалізує деяку функціональність, яка може бути незалежно запущена на виконання і зупинена як ціле, а також повторно використана в інших системах. Розробник програми пише код модулів функцій зворотного виклику (англ. call-back module), в яких і знаходиться специфічна для цієї програми частина функціональності.
Строго кажучи, OTP не є частиною мови Erlang. Однак, він настільки увійшов у культуру та практику розробників на Erlang, що часом між ними складно провести межу.
Розробка графічного інтерфейсу користувача
Розробка додатків з графічним інтерфейсом користувача (крім веб-інтерфейсів) може вестись за допомогою бібліотеки wxErlang — бібліотеки wxWidgets, портованої для Erlang. В стандартну поставку Erlang/OTP входить WxErlang. WxWidgets написаний на , тому перед розробниками wxErlang стояло завдання виразити засобами Erlang ієрархію об'єктів. Спрощуючи, у wxErlang класам відповідають модулі, а об'єктам — посилання, макросам на C ++ відповідають макроси Erlang. Деякі типи даних, для яких у C++ були використані класи, подаються в Erlang за допомогою інших типів даних, наприклад wxPoint задається у вигляді кортежу з двох елементів. Події wxErlang можна оброблити в Erlang або через функцію зворотнього виклику (англ. call-back functions), або в більш природному середовищі Erlang передачею повідомлень.
Програмування на Erlang
Інтерактивна оболонка
Інтерактивна оболонка (англ. shell) для Erlang може бути викликана в Unix-подібних системах командою erl
, у Windows — werl
.
Оболонка дозволяє:
- вводити вирази та отримувати результат їх виконання, випробувати новий код,
- займатися інтерактивним налагодженням,
- керувати системою, що знаходиться в промисловій експлуатації, тощо.
Також, оболонка дозволяє використовувати додаткові функції (команди), доступні тільки в ній. До прикладу, команда q().
здійснює вихід із оболонки із завершенням всього, що робить Erlang-система.
В оболонці можна викликати BREAK-меню за допомогою Ctrl+C (у Unix-подібних ОС) або Ctrl+Break (у Windows). Це меню має різні команди, у тому числі a — негайна зупинка, c — продовження роботи в оболонці та інші інформаційні та допоміжні команди для роботи з Erlang-системою. Комбінація клавіш Ctrl+G викликає ще командне меню, яким можна, за необхідності, зупинити процес, що «завісив» оболонку, і повернутися в оболонку (i і потім c)
Документування та оформлення коду
Система EDoc може генерувати документацію з вихідного коду. Для документування коду модуля достатньо додати певним чином розмічений текст, а також файл overview.edoc
для документації рівня проєкту (в останньому необов'язково використовувати знаки коментаря). Інструменти для роботи з кодом на Erlang, наприклад, erlang-режим в Emacs, мають на увазі деякі особливості щодо вживання символів коментаря. Коментарем вважається текст від знака відсотка (%
) до кінця рядка в Erlang. Так, потрійний знак відсотка викликає вирівнювання лівим краєм, подвоєний — вирівнювання на рівні навколишнього коду, а одиночний знак відсотка використовується для позначення коментаря після коду, в кінці рядка. Розробники Erlang виробили певні стильові угоди щодо організації та оформлення вихідного коду. Наприклад, хорошим стилем вважається зниження вкладеності синтаксичних структур, написання коротких модулів (менше 400 рядків коду) та функцій (не довше 15-20 рядків коду), використання осмислених імен для змінних та функцій тощо.
Типи та аналіз коду
Програма Dialyzer, розроблена в рамках проєкту HiPE. Вона входить до стандартної поставки і дозволяє виявити помилки (у тому числі помилки типізації) шляхом статичного аналізу коду. Програма TypEr, написана Тобіасом Ліндалом (Tobias Lindahl) та Костісом Сагонасом (Kostis Sagonas), є частиною Dialyzer. TypEr дозволяє перевіряти визначення типів функцій, звіряти вказаний у директиві -spec
тип функції з її визначенням, виконати виведення типів. Програма виводить всі типи, що відповідають успішному застосуванню функції, в загальному випадку лише приблизно, в більш грубий бік. Використання функції будь-яким іншим чином обов'язково призведе до помилки часу виконання. У наступному прикладі показаний синтаксис визначення типу (директива -type
), оголошення типу полів запису та директива -spec
разом з визначенням функції:
-type(user_status() :: disabled | enabled). % статус - один з двох атомів -record(user, {login="anon" ::string(), % типи полів запису password ::string(), status :: user_status(), nickname ::string()}). -spec(check_password(string(), #user{}) -> ok | {error, string()}). % декларація функції check_password(Password, User) -> % визначення функції ...
Dialyzer (від англ. DIscrepancy AnaLYZer for ERlang Programs — «аналізатор суперечностей для Erlang-програм») програма для виявлення в коді окремих модулів і в окремих додатках, помилок типів, недосяжного коду та надлишкових перевірок. Усі виявлені Dialyzer дефекти вимагають усунення, бо інструмент не дає помилкових спрацьовувань. Для кожної функції всіх модулів, що перевіряються, Dialyzer, встановлює тип, використовуючи заснований на обмеженнях вивід типів і аналіз потоків даних. Після визначення типів функцій проводиться аналіз протиріч у програмі.
Тестування, профілювання, рефакторинг
Для модульного тестування Erlang надає EUnit. Для системного тестування Erlang надає фреймворк Common Test. EUnit містить засоби для опису тестів, в тому числі необхідний для цього набір макросів, а також виводить звіт по закінченню тестування. Тестування модулів відбувається шляхом підключення заголовного файлу з EUnit, а функції з тестами можуть бути як включені в сам модуль, що тестується, так і винесені в окремий модуль.
Тестування паралельних програм можна виконати за допомогою Quviq Quick Check (версія Mini безкоштовно). Крім тестування, можна здійснити перевірку всіх можливих варіантів вихідних даних за допомогою методу перевірки моделей. Для цього є, створена в Мадридському політехнічному університеті, утиліта McErlang. [1]
Щоб профілювати код та виявити ступінь покриття коду тестами можна звернутися до модулів eprof
, fprof
, cover
та утиліти cprof.
Для Erlang розроблена низка інструментів рефакторингу вихідного коду (список не є вичерпним):
- RefactorErl,
- Wrangler,
- автоматична, незалежна від IDE утиліта tidier.
Утиліта tidier дозволяє автоматично знаходити та виробляти еквівалентні перетворення коду, наприклад, замінює
lists:filter(fun (X) -> is_something(X) end, L)
на
[X || X <- L, is_something(X)]
Ефективність
Erlang має свої секрети написання ефективного коду. Удосконалення мови робить деякі з трюків застарілими, тому документація є найкращим посібником у питаннях оптимізації, у сукупності з профілюванням та .
Наприклад, при роботі зі списками не бажано додавати елемент до кінця довгого списку за допомогою конкатенації або функції додавання елемента до списку. Зате можна додати елемент до початку списку, а кінцевий результат обробити функцією звернення порядку елементів списку.
L1 = [New_Elem | List]. L2 = lists:reverse(L1).
Є свої рекомендації і для підвищення ефективності паралельних програм. До прикладу, дії, що вимагають багато пам'яті, найкраще виділяти в окремий процес, бо при цьому зменшуються витрати на збирання сміття. Тоді пам'ять швидше буде звільнено після завершення процесу.
Erlang та інші мови програмування
Інтеграція та гібридні мови
Erlang-система дозволяє виконувати інтеграцію з системами на інших мовах програмування. Є механізми для мережевої взаємодії з С, Java, Лісп, Perl, Python, Ruby. До прикладу, для ефективнішого синхронного виклику невеликих функцій на C можна використовувати платформно-залежні функції (англ. NIF, natively implemented function). Високорівневі бібліотеки дозволяють Erlang-системі представляти C або Java-вузли як звичайні Erlang-вузли. Інші мови можна пов'язати з середовищем виконання Erlang за допомогою драйверів або мережевих сокетів за допомогою протоколів на кшталт HTTP, SNMP, IIOP. До прикладу, Ruby взаємодіє з Erlang за допомогою пакета erlectricity, а для Python розроблена реалізація Erlang-вузла у вигляді пакету py-interface.
Віртуальна машина Erlang знаходить застосування і в інших мовах програмування. До прикладу, Elixir та проєкт Erl2 Джо Армстронга. Крім того, Роберт Вірдінг підтримує проєкт Lisp Flavored Erlang («Erlang, приправлений Ліспом»), у якому синтаксис Ліспа використовується з компілятором Erlang. Є й інші BEAM-мови: Efene, Joxa, Reia, Luerl, Erlog.
На офіційному сайті мови є згадка проєкт про Erjang, в якому використовується віртуальна машина Java.
Порівняння Erlang та C++ за продуктивністю
Практика показує, що для вивчених телекомунікаційних додатків код на Erlang був на 70—85 % коротшим, ніж на , а продуктивність системи при переписуванні коду з C++ на Erlang зросла майже на 100 %. Для одного із використаних у дослідженні проєктів різниця була пояснена написанням додаткового C++ коду в рамках захисного програмування, управління пам'яттю та коду для високорівневої комунікації, тобто можливостями, які є частиною мови Erlang та бібліотек OTP.
Порівняння взаємодії процесів у Erlang та Go
Вплив теорії послідовних процесів, що взаємодіють, Чарльза Е.Хоара відчувається як у Go, так і в Erlang.
Erlang і Go
Спільне : процеси відправляють одне одному повідомлення.
Відмінне:
- В Erlang це відбувається безпосередньо.
- В Go за допомогою каналів (англ. channels) Ці канали мають типи.
Організація взаємодії з повідомленнями
У Erlang немає типізації часу компіляції за винятком охоронних виразів, що дозволяє посилати процесам повідомлення будь-якого типу. «Незрозуміле» повідомлення буде проігноровано, або назавжди залишиться в черзі.
Go дозволяє легко організувати групу «go-програм» (англ. goroutine — натяк на англ. co-routine — співпрограма) для отримання повідомлень з деякого каналу (такий підхід відомий як ).
Реалізація робочого пулу
В Erlang, при проєктуванні якого приділялася особлива увага та часу затримки (англ. latency), реалізація робочого пулу можлива, але потребує додаткових зусиль. Численні відправники тривіально реалізуються в обох мовах. Erlang-процес може надіслати повідомлення і чекати на нього відповідь (відповідно до деякого зразка), ігноруючи інші повідомлення в черзі.
В Go таке неможливо, але подібна функціональність може бути досягнута створенням (у тому числі динамічним) нових вводів, тобто поділом каналів за призначенням.
Розділення між процесами
В Erlang відсутній стан, що розділяється між процесами (англ. shared mutable state) і тому ізольований процес дуже рідко представляє інтерес
Go вимагає явної вказівки того, які go-програми будуть взаємодіяти з іншими передачею повідомлень.
Абстракції взаємодіючих процесів схожі в Erlang і Go. Щоб уникнути помилок при переході з однієї мови на іншу, слід враховувати тонкощі і особливості обох мов: шаблони, які хороші в одній мові, можуть не підходити для іншої.
Критика
В Erlang є недоліки:
- Недоліки синтаксису: символ закінчення виразу залежить від контексту (це або символи
. ,
або;
). Це вимагає додаткової уваги при зміні місця виразу. - Надлишкове багатослів'я записів (record).
- Завжди потрібно прописувати повний перелік альтернатив, або вказати останньою клозою true в if-виразі, для уникнення видачі винятку, якщо ні одна з умов не виконується.
- Суворо обмежений набір функцій, які можна використовувати в if-виразах (цей недолік можна оминути використанням case-виразів).
- Функціональний стиль і незмінювані змінні призводять у деяких додатках (наприклад, тести) до більшої кількості правок, ніж в інших мовах програмування, так як вставка деякої проміжної обробки може вимагати нових імен змінних, що може призвести до змін у коді, наступного далі за текстом.
- З недоліків системи типів можна вказати відсутність рядкового типу, і неможливість динамічно додавати у записи нові члени.
- Існують проблеми з організацією вихідного коду, яка можлива тільки через створення нового файлу.
- Відсутність просторів імен, класів або інших засобів для організації коду.
- Рівень якості модулів, за винятком основних, та документації є далеко не найкращим.
Джо Армстронг, один з творців мови, у своєму виступі на конференції з історії мов програмування в 2007 році перерахував список зон зростання для мови:
- Використання збирання сміття для атомів.
- Поліпшення засобів сполучення із зовнішнім кодом (англ. foreign code).
- Посилення ізоляції між процесами.
- Більш виборча система безпеки серед вузлів Erlang, заснована на різному ступені довіри.
- Окремі позначення для протоколів та систем.
- Модулі мають бути об'єктами першого класу.
Масове поширення Erlang може стримувати незвичний для більшості програмістів синтаксис, використання функціональної парадигми, а також те, що найкраща на 2022 рік реалізація мови використовує віртуальну машину BEAM, а не більш поширену JVM.
Сфера застосування
Erlang підходить для:
- Створення мережевих серверів, розподілених систем, програм з GUI та подібних до них інтерактивних програм.
- Створення інструментів для тестування, управління та стеження,
- Створення додатків з нерегулярним паралелізмом, у яких розпаралелювані завдання досить різноманітні.
Erlang погано підходить для: Написання коду, що містить інтенсивні обчислення з плаваючою комою, який вимагає включення нативного коду конкретної платформи чи сильної оптимізації і для створення додатків, які потребують синхронного виконання завдань.
Для проєктів, в яких код повинен виконуватися на JVM або CLR, або проєктів, що вимагають безлічі бібліотек з інших систем програмування.
Крім того, Erlang став застосовуватися для :
- Розробки систем хмари ще до того, як сформувалося саме поняття хмарних обчислень.
- Використовується в масштабних телекомунікаційних та Інтернет-додатках багатьма компаніями, включаючи Amazon EC2 з реалізацією SimpleDB.
- Сервіс соціальних закладок Delicious, Facebook (бекенд для чату), зроблений на Erlang.
- T-Mobile (сервіс SMS та системи аутентифікації)[46].
- Серверне програмне забезпечення WhatsApp написане на Erlang.
- У січні 2012 року сервери WhatsApp під FreeBSD з 96 ГБ оперативної пам'яті змогли обробляти від 1 до 2,8 мільйонів з'єднань.
Erlang часто ставлять у заслугу легендарну надійність ATM-комутатора AXD301 у мережі .
За даними Ericsson, з січня 2002 року за декілька років трапилася лише одна незначна несправність, на підставі чого надійність системи згідно з розрахунками була 99,9999999 %. Хоча більш реальні оцінки, що враховують багато інших факторів, говорять все-таки про «п'ять дев'яток», успіх маршрутизатора пов'язують з доступними засобами розробки надійних паралельних обчислень, вбудованими в Erlang.
Ще Erlang використовується в додатках з відкритим вихідним кодом, наприклад:
- CouchDB — документоорієнтована БД з REST — інтерфейсом,
- Disco — фреймворк для розподілених обчислень на основі парадигми MapReduce,
- Ejabberd — вільний (GNU GPL), розподілений та відмовостійкий Jabber-сервер, написаний на Erlang,
- RabbitMQ — платформа, орієнтована на обробку повідомлень (реалізує AMQP, MQTT),
- Wings 3D — програма 3D-моделювання.
Для Erlang було написано декілька веб-серверів:
Ще були створені декілька веб-фреймворків і систем управління вмістом, таких як:
- N2O,
- Zotonic
- BeepBeep
- Erlang Web
- ErlyWeb
- Novaframework
Серед відомого програмного забезпечення, написаного Erlang, яке не увійшло в категорії вище виділяють:
- Розподілену NoSQL базу даних Riak, яка спроєктована за принципами Amazon DynamoDB.
- (раніше відомий як ) — відеострімінговий сервер, що підтримує декілька протоколів.
Крім того, написаний на Erlang інструмент Tsung, який дозволяє емулювати тисячі (за достатньої кількості тестових серверів — мільйони) одночасних користувачів, застосовується у стрес-тестуваннях розподілених систем.
Erlang підходить для завдань штучного інтелекту (особливо обчислювального інтелекту, нейроеволюції), заснованих на нейронних мережах. Таке застосування можливе завдяки п'ятьом ключовими властивостями «мови програмування нейронних мереж», що є у Erlang:
- ізольовані процеси-нейрони (англ. encapsulation),
- паралелізм (англ. concurrency, одночасність),
- механізм виявлення збоїв,
- незалежність від розташування (англ. location transparency)
- гаряча заміна коду.
Прикладом такого застосування є реалізація одного з підходів до нейроеволюції — DXNN.
Спільнота
Навколо технологій Erlang утворилась спільнота розробників, яка підтримує новачків.
Вихідний код Erlang доступний через сервіс спільної розробки GitHub. Розробники та користувачі Erlang можуть спілкуватися через список розсилки Erlang-questions (питання Erlang) або на IRC-каналі #erlang на .
Erlang Factory влаштовує у всьому світі заходи та конференції, серед яких конференція користувачів Erlang (Erlang User Conference).
Спеціальна група SIGPLAN ACM регулярно проводить Erlang-майстерню (Erlang Workshop), а конференція включає секцію з Erlang.
В Україні Erlang спільнота порівняно невелика.
Див. також
Виноски
- The erlang Open Source Project on Open Hub: Languages Page — 2006.
- Nordström, Bengt (1981). Programming in Constructive Set Theory. Proceedings of the 1981 conference on Functional programming languages and computer architecture - FPCA '81. ACM Press. doi:10.1145/800223.806773. Процитовано 16 серпня 2022.
- Начала работы с Erlang [ 2013-11-22 у Wayback Machine.] (рос.)
- Armstrong, Joe (2007). History of Erlang. HOPL III: Proceedings of the third ACM SIGPLAN conference on History of programming languages (англійська) . ISBN .
{{}}
: Перевірте значення|isbn=
: недійсний символ () - Erlang.org. http://erlang.org/course/history.html (англійська) .
- Däcker, Bjarne (2000). Concurrent Functional Programming for Telecommunications: A Case Study of Technology Introduction (англійська) . Royal Institute of Technology. с. 37.
- Fredlund, Lars-Åke (2012). Erlang – a platform for developing distributed software systems (англійська) . Madrid: Universidad Politécnica de Madrid.
- Cesarini, Francesco (2009). Erlang Programming (англійська) . O’Reilly Media, Inc. с. 498. ISBN .
{{}}
: Перевірте значення|isbn=
: недійсний символ () - St. Laurent, Simon (2013). Introducing Erlang (англійська) . O’Reilly Media, Inc. с. 185. ISBN .
{{}}
: Перевірте значення|isbn=
: недійсний символ () - Verraes, Mathias (9 грудня 2014). Let It Crash. Mathias Verraes' Blog (англ.). Процитовано 11 жовтня 2022.
- Tate, Bruce A (2010). Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (англійська) . Pragmatic Bookshelf.
- Armstrong, Däcker, Lindgren, Millroth, Erlang product team at Ericsson. (2013). . http://ftp.sunet.se/pub/lang/erlang/white_paper.html (англійська) . Ericsson AB.
{{}}
:|archive-url=
вимагає|archive-date=
() - Hébert, Fred (2013). Learn You Some Erlang for Great Good!: A Beginner's Guide (англійська) . No Starch Press. с. 624. ISBN .
{{}}
: Перевірте значення|isbn=
: недійсний символ () - math, STDLIB Reference Manual Version 1.19.3. https://www.erlang.org/doc/man/math.html (англійська) .
- Martin Logan, et al, 2011, с. 31—32.
- Erlang/OTP 25.0.4. https://www.erlang.org/doc/ (Англійська) . Процитовано 25 серпня 2022.
- Logan,Merritt, Carlsson., Martin, Eric, Richard (2011). Erlang and OTP in Action. Manning. с. 397. ISBN .
{{}}
: Перевірте значення|isbn=
: недійсний символ () - Data Types, Erlang Reference Manual User's Guide Version 5.10.3. http://www.erlang.org/doc/reference_manual/data_types.html (англійська) . Ericsson AB. 2013.
- . (англійська) . Ericsson AB. 2013. Архів оригіналу за 3 грудня 2013. Процитовано 16 серпня 2022.
- Kessin, Zachary (2012). Building Web Applications with Erlang (Англійська) . O’Reilly Media, Inc. с. 156 p. ISBN .
{{}}
: Перевірте значення|isbn=
: недійсний символ () - Syntax in functions | Learn You Some Erlang for Great Good!. learnyousomeerlang.com. Процитовано 10 вересня 2022.
- The Preprocessor, Predefined Macros, Erlang Reference Manual User's Guide Version 5.10.3 (англійська) . Ericsson AB. 2013.
- Hebert, 2013, Modules.
- Martin Logan, et al, 2011, с. 75.
- The Erlang I/O-protocol, STDLIB User's Guide Version 1.19.4 (англійська) . Ericsson AB. 24 грудня 2013.
- STDLIB, STDLIB Reference Manual Version 1.19.3 (англ.). Ericsson AB. 2013. оригіналу за 7 листопада 2013. Процитовано 1 грудня 2013.
- Erlang -- gen_server. www.erlang.org. Процитовано 16 вересня 2022.
- Erlang -- supervisor. www.erlang.org. Процитовано 16 вересня 2022.
- Erlang -- gen_statem. www.erlang.org. Процитовано 16 вересня 2022.
- application, Kernel Reference Manual Version 2.16.3. https://www.erlang.org/doc/apps/kernel/application.html (англійська) . Ericsson AB. 1 листопада 2013. Процитовано 2013.
- Klas Eriksson, M. Williams, J. Armstrong (2 грудня 2013). . http://erlang.se/doc/programming_rules.shtml (англійська) . Ericsson AB. Архів оригіналу за 30 листопада 2013. Процитовано 16 серпня 2022.
- Aronis, Stavros and Papaspyrou, Nikolaos and Roukounaki, Katerina and Sagonas, Konstantinos and Tsiouris, Yiannis and Venetis, Ioannis E. (2012). A Scalability Benchmark Suite for Erlang/OTP (англійська) . Copenhagen, Denmark: ACM.: Proceedings of the Eleventh ACM SIGPLAN Workshop on Erlang Workshop. Erlang '12. с. pp. 33—42. ISBN .
{{}}
:|pages=
має зайвий текст (); Перевірте значення|isbn=
: недійсний символ () - Avgerinos, Thanassis and Sagonas, Konstantinos. (2009). Cleaning Up Erlang Code is a Dirty Job but Somebody's Gotta Do It (англійська) . Edinburgh, Scotland:: Proceedings of the 8th ACM SIGPLAN Workshop on ERLANG ACM,.
{{}}
: Недійсний|deadurl=https://dl.acm.org/doi/10.1145/1596600.1596602
() - Lisp Flavored Erlang. https://lfe.github.io/ (англійська) .
- Why I’m stopping work on Reia. http://www.unlimitednovelty.com/2011/06/why-im-stopping-work-on-reia.html (англійська) . JUNE 29, 2011.
- Federico Carrone, et al Spawned Shelter!. http://spawnedshelter.com/ (Англійська) . 15 вересня 2013.
- Nyström, Trinder, King, 2008.
- David Chisnall (14 листопада 2011). A Tale of Two Concurrency Models: Comparing the Go and Erlang Programming Languages (англ.). Pearson Education, Informit. оригіналу за 3 грудня 2013. Процитовано 1 грудня 2013.
- Chisnall, David (14 листопада 2011). A Tale of Two Concurrency Models: Comparing the Go and Erlang Programming Languages. https://www.informit.com/articles/ (англійська) . Процитовано 1 грудня 2013.
- Katz, Damien (9 березня 2008). What Sucks About Erlang. http://damienkatz.net/2008/03/what_sucks_about.html (англ.). оригіналу за 5 грудня 2013. Процитовано 24 листопада 2013.
- Armstrong, A History of Erlang, 2007, 6-19,6-20.
- Tate, 2010, с. 221.
- Dan McCreary, Ann Kelly, 2013.
- Larson, Erlang for Concurrent Programming, 2008.
- Робота з великими обсягами даних в хмарі за допомогою MapReduce (англійська) . IBM. 1 березня 2012. оригіналу за 11 грудня 2013. Процитовано 7 грудня 2013.
- Ericsson та 4 December 2014, "Ericsson". Ericsson.com. 4 December 2014. Retrieved 7 April 2018..
- Scaling to Millions of Simultaneous Connections Архівна копія на сайті Wayback Machine., Rick Reed (WhatsApp) // Erlang Factory SF, March 30, 2012
- 1 million is so 2011 Архівна копія на сайті Wayback Machine. // WhatsApp Blog, January 6, 2012
- Томпсон, 2012, с. 33.
- http://discoproject.org/ (1 березня 2012). Робота з великими обсягами даних в хмарі за допомогою Map Reduce. http://discoproject.org/ (Англійська) . оригіналу за 11 грудня 2013. Процитовано 7 грудня 2013.
- Disco (сторінка проєкту). http://discoproject.org/. оригіналу за 16 вересня 2010. Процитовано 7 грудня 2013.
- Pivotal Software, Inc. RabbitMQ MQTT Adapter. оригіналу за 1 грудня 2015. Процитовано 10 грудня 2015.
- Томпсон, 2012, с. 23—25.
- Cowboy, Nine Nines, 15 вересня 2022, процитовано 16 вересня 2022
- Martin Brown (2013). Introduction to programming in Erlang, Part 2: Use advanced features and functionality (англ.). IBM. оригіналу за 3 грудня 2013. Процитовано 1 грудня 2013.
- N2O. оригіналу за 18 серпня 2015. Процитовано 13 грудня 2014.
- Zachary Kessin, 2012, с. 121—123.
- Novaframework. https://github.com/novaframework/nova (англійська) . 24 травня 2022. Процитовано 22.08.2022.
- Simon St. Laurent, 2013, с. 167.
- Flussonic — live streaming software. оригіналу за 16 червня 2012. Процитовано 7 травня 2012.
- Bradley Holt. Chapter 6. Distributed Load Testing // Scaling CouchDB. — O'Reilly Media, Inc, 2011. — P. 39. — .
- Sher, 2013, с. 144—150, Chapter 5 The Unintentional Neural Network Programming Language.
- Simon St. Laurent, 2013, с. 168—169.
Посилання
- http://www.erlang.org/ — реалізація з відкритими вихідними текстами [ 13 червня 2006 у Wayback Machine.]
- http://groups.google.com/group/erlang-in-ukraine — група україномовної Erlang-спільноти
- https://archive.today/20030224125715/http://www.erlang-projects.org/ — репозиторій проєктів на Erlang
- — Comprehensive Erlang Archive Network, репозиторій проєктів на Erlang
- — форум, вікі, рішення, підручники, довідкові матеріали
- http://erlide.sourceforge.net/ — плагін для середовища розробки Eclipse [ 5 вересня 2007 у Wayback Machine.] з підтримкою мови Erlang
- http://www.learnyousomeerlang.com — англомовний онлайн-підручник з програмування мовою Erlang [ 8 квітня 2022 у Wayback Machine.]
- 2007. Programming Erlang: Software for a Concurrent World. Pragmatic Bookshelf .
- 2013. Programming Erlang: Software for a Concurrent World. Second edition. Pragmatic Bookshelf .
Це незавершена стаття про мови програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Erlang Erla ng ˈɜːrlaeŋ UR lang mova funkcijnogo programuvannya z dinamichnoyu tipizaciyeyu priznachena dlya rozrobki program dlya riznogo rodu rozpodilenih i bagatonitkovih sistem Rozroblena i pidtrimuyetsya kompaniyeyu Ericsson Mova mistit v sobi zasobi porodzhennya paralelnih procesiv ta yihnoyi vzayemodiyi za dopomogoyu posilannya asinhronnih povidomlen bez vikoristannya blokuvan ErlangParadigmamultiparadigmalna paralelna funkcionalnaData poyavi1987TvorciDzho Armstrong programist RozrobnikEricssonOstannij reliz25 18 chervnya 2022 2 roki tomu 2022 06 18 Sistema tipizaciyidinamichna tipizaciya silna tipizaciya Pid vplivom vidProlog SmallTalk Lisp Vplinula naF Clojure Rust Scala Opa Akka Dart Elixir Oz GoMova realizaciyiErlang 1 Operacijna sistemaBagatoplatformovaLicenziyaApache 2 0Zvichajni rozshirennya fajliv erl hrlRepozitorij vihidnogo kodugithub com erlang otpVebsajtwww erlang org Mediafajli u Vikishovishi Mova oriyentovana na rozrobku rozpodilenih vidmovostijkih zastosunkiv yaki zabezpechuyut paralelnu obrobku zapitiv v rezhimi realnogo chasu Mova nabula poshirennya v takih oblastyah yak telekomunikaciyi bankivski sistemi elektronna komerciya komp yuterna telefoniya i organizaciya mittyevogo obminu povidomlennyami Programa translyuyetsya v bajt kod yakij vikonuyetsya virtualnoyu mashinoyu sho zabezpechuye perenosnist Odnochasno rozrobnikami vipuskayetsya OTP Open Telecom Platform suputnij nabir bibliotek i komponentiv dlya rozrobki rozpodilenih sistem na movi Erlang Kod proyektu poshiryuyetsya pid modifikovanoyu vilnoyu licenziyeyu MPL Svij sintaksis i deyaki koncepciyi mova Erlang uspadkuvala vid movi logichnogo programuvannya Prolog Mova pidtrimuye zistavlyannya zi vzircem obrobku viklyuchen spiskovi ta binarni generatori anonimni funkciyi funkciyi vishogo poryadku obmin povidomlennyami mizh procesami Preprocesor pidtrimuye robotu z makrosami i vklyuchennya zagolovkovih fajliv Populyarnist movi Erlang zrosla u zv yazku z rozshirennyam oblasti vikoristannya telekomunikacijni sistemi na paralelni rozpodileni sistemi z visokim navantazhennyam yaki obslugovuyut miljoni koristuvachiv WWW taki yak chati sistemi keruvannya veb kontentom veb serveri i rozpodileni bazi danih sho vimagayut masshtabuvannya Erlang vikoristovuyutsya v deyakih NoSQL bazah danih Nazva ta istoriyaSered maloobiznanih z istoriyeyu movi Erlang lyudej poshirena dumka sho nazva Erlang rozshifrovuyetsya yak ERicsson LANGuage Naspravdi mova otrimala svoyu nazvu na chest en danskogo matematika yakij pracyuvav u galuzi telekomunikacij Isnuye odinicya vimiryuvannya telekomunikacijnogo trafiku yaka takozh nazivayetsya en Na stvorennya Erlang vplinuli ML en Ada en CHILL Prolog Okrim togo na sposib onovlennya programnogo zabezpechennya vplinuli Smalltalk i propriyetarni movi EriPascal ta PLEX yakimi poslugovuvalis v Ericson Mova Erlang bula stvorena v 1986 roci v laboratoriyi kompaniyi Ericsson spilno Dzho Armstrongom Joe Armstrong Robert Virding i Mike Williams i v 1998 roci perevedena v rozryad vidkritih proyektiv Zavdyaki pochatkovij oriyentaciyi na stvorennya zastosunkiv dlya paralelnoyi obrobki zapitiv v rezhimi realnogo chasu mova nabula poshirennya v takih oblastyah yak telekomunikaciyi bankivski sistemi elektronna komerciya komp yuterna telefoniya i organizaciya mittyevogo obminu povidomlennyami Robert Virding ta Dzho Armstrong 2013 rik U 1998 roci top menedzhment Ericsson virishiv ne brati na sebe zobov yazan z rozrobki ta pidtrimki vlasnoyi movi programuvannya natomist zoseredivshis na Java Vikoristannya Erlang bulo zaboroneno u novih proyektah Ericsson Radio AB u zv yazku z realizaciyeyu planu autsorsingu programnoyi tehnologiyi kompaniyi Rational Inc Ce rishennya duzhe silno vplinulo na majbutnye Erlang vono prizvelo do vidkrittya kodu Erlang pid vidkritoyu licenziyeyu EPL analog Mozilla Public License a takozh posluzhilo golovnoyu prichinoyu pochatku poshirennya movi za mezhami kompaniyi sho jogo stvorila Osnovnim zaperechennyam proti vidkrittya vihidnogo kodu bulo virishennya pitan shodo patentiv ale ci trudnoshi buli podolani Nezabarom bagato hto z osnovnih rozrobnikiv pokinuv Ericsson shob organizuvati vlasnij biznes Bluetail AB Majkl Vilyams odin z tvorciv Erlang Na pochatku 2000 h rokiv naukovi kola stali viyavlyati interes do Erlang Z 2002 roku stav provoditis shorichnij Erlang Workshop Ericsson prodovzhuvav sponsoruvati proyekt HiPE vid angl High Performance Erlang visokoproduktivnij Erlang Proyekt HiPE zajmavsya efektivnoyu realizaciyeyu movi ta instrumentami dlya perevirki tipiv i stvorenij u grupi proyektu kompilyator v mashinnij kod yakij vhodit u postachannya versiyi Erlang OTP vilno rozpovsyudzhuyetsya z 2001 roku Roboti pov yazani z Erlang vedut inshi zakladi vishoyi osviti Instrumenti dlya refaktoringu stvoreni v Kentskomu universiteti u Velikij Britaniyi ta universiteti Loranda Etvesha v Ugorshini instrumenti dlya riznih vidiv testuvannya u Madridskomu politehnichnomu universiteti tehnichnomu universiteti Chalmersa ta Geteborgskomu universiteti Koli sistemi z simetrichnoyu bagatoprocesornistyu tilki pochinali zavojovuvati rinok serveriv i nastilnih komp yuteriv kidayuchi viklik rozrobnikam programnogo zabezpechennya vzhe v 2006 persha versiya Erlang z pidtrimkoyu SMP bula vipushena spilnimi zusillyami komandi OTP z Ericsson i komandi HiPE Nezabarom pislya cogo vijshla persha majzhe za desyatilittya velika monografiya z Erlang Programming Erlang Dzho Armstronga pislya chogo bagato rozrobnikiv vidkrili dlya sebe Erlang OTP i mova stala nabirati populyarnosti Proces rozvitku movi vklyuchaye v sebe rozglyad propozicij z rozvitku EEP Erlang Enhancement Proposal Za dopomogoyu cih propozicij Erlang spilnota vnosit zmini u standartnu podachu Erlang Z vnesenimi propoziciyami mozhna oznajomitisya na veb storinci erlang org eeps FilosofiyaZa svidchennyami Majka Vilyamsa Erlang stvoryuvavsya dlya virishennya troh problem rozrobki rozpodilenih sistem m yakogo realnogo chasu z visokim stupenem paralelizmu mozhlivosti shvidkoyi ta efektivnoyi rozrobki PZ otrimannya sistemi stijkoyi do programnih ta aparatnih zboyiv mozhlivosti onovlennya sistemi na lotu bez prostoyu obladnannya Za slovami Vilyamsa filosofiya yakoyi dotrimuvalis rozrobniki Erlang pasuye i dlya napisannya programnogo zabezpechennya ciyeyu movoyu Znajdit pravilni metodi Proyektujte z vikoristannyam prototipiv Samih lishe idej nedostatno treba vmiti yih realizovuvati i znati sho voni pracyuyut Robit pomilki v nevelikomu masshtabi a ne u virobnichomu proyekti Originalnij tekst angl Find the right methods Design by Prototyping It is not good enough to have ideas you must also be able to implement them and know they work Make mistakes on a small scale not in a production project Bilshist mov stvorenih ranishe za Erlang buli rozrobleni bez poperednogo znahodzhennya zastosuvannya todi yak Erlang buv rozroblenij specialno na osnovi vimog do rozpodilenih stijkih do vidmov paralelnih sistem realnogo chasu Z rozvitkom Internetu viyavilosya sho bagato program mayut analogichni vimogi sho poyasnyuye zrostannya interesu do movi Sekret visokoyi stijkosti do vidmov polyagaye u vikoristanni izolovanih odin vid odnogo legkih procesiv pov yazanih lishe mehanizmom obminu povidomlennyami ta signalami vihodu Principi rozrobnikiv na Erlang stosovno obrobki pomilkovih situacij u procesah mozhna viraziti u viglyadi vislovlyuvannya Let it crash Pov yazano ce z tim sho v Erlang sistemi legko stezhiti za zavershennyam procesu zavershuvati procesi pov yazani zi zboyami i zapuskati novi procesi OsoblivostiSintaksis uspadkovanij vid movi Prolog Pidtrimuye moduli polimorfni funkciyi zistavlennya za shablonom anonimni funkciyi umovni konstrukciyi strukturi obrobku vinyatkiv optimizaciyu hvostovoyi rekursiyi Golovna risa Erlang model legkih procesiv Procesi ye deshevimi yihnye stvorennya vimagaye taku kilkist resursiv sho yih mozhna porivnyati z viklikom funkciyi Yedinim sposobom vzayemodiyi procesiv ye asinhronnij obmin povidomlennyami Proces mozhe vstanoviti zv yazok link z inshimi procesami i za viborom abo otrimuvati povidomlennya pro yihnye dostrokove zavershennya z vkazannyam prichini abo rozdiliti yihnyu dolyu Proces maye svoyu poshtovu skrinyu zvidki mozhe vibirkovo chitati povidomlennya Mova programuvannya Erlang spriyaye stvorennyu velikoyi kilkosti konkurentnih procesiv Procesi izolovani ta ne mayut spilnogo stanu Proces proyektuvannya polyagaye v iterativnomu rozbitti sistemi na iyerarhiyi pidsistem yaki konkurentno vzayemodiyut doki skladovi ne stanut dostatno prostimi dlya realizaciyi Suv yaz Procesi povidomlennya na vidminu vid suv yazi Ob yekti Interfejsi Uspadkuvannya chasto daye kompaktnishi rishennya Vidsutnist potrebi blokuvannya dostupu do stanu procesu dlya sinhronizaciyi yihnoyi vzayemodiyi suttyevo sproshuye programuvannya Dlya konkurentnogo resursu zazvichaj stvoryuyetsya proces monitor cherez yakij zdijsnyuyetsya vzayemodiya z resursom Takozh vazhlivij moment polyagaye u formuli let it crash nehaj proces vpade Zamist perehoplyuvati pomilki i namagatisya prodovzhuvati robotu chastina programi sho mistit rizikovanij kod vidokremlyuyetsya u nezalezhnij proces kamikadze yakij sistema vbivaye u vipadku viniknennya pomilki pri comu batkivskij proces otrimuye povidomlennya pro smert nashadkiv i za potrebi mozhe perezapuskati ci procesi Takij pidhid pozbavlyaye kod chislennih perevirok Visokorivnevi konstrukciyi Erlang ye deklarativnoyu movoyu programuvannya yaka vikoristovuyetsya bilshe dlya opisu togo sho maye buti obchisleno nizh yak Napriklad viznachennya funkciyi yake vikoristovuye zistavlennya zi zrazkom dlya viboru odnogo z variantiv obchislennya abo viluchennya elementa danih zi skladovoyi strukturi nagaduye rivnyannya Zistavlennya zi vzircem poshirene navit na bitovi ryadki sho sproshuye realizaciyu telekomunikacijnih protokoliv Funkciyi ye ob yektami pershogo klasu Erlang U movi takozh shiroko zastosovuyutsya harakterni dlya funkcionalnoyi paradigmi programuvannya spiskovi vklyuchennya generatori spiskiv Paralelni obchislennya Obmin povidomlennyami v movi Erlang Osoblivistyu movi Erlang ye zastosuvannya legkovagih procesiv vidpovidno do modeli aktoriv Takij pidhid dozvolyaye vikonuvati odnochasno sotni tisyach i navit miljoni takih procesiv kozhen z yakih mozhe mati skromni vimogi do pam yati Procesi izolovani odin vid odnogo i ne mayut zagalnogo stanu ale mizh nimi mozhna vstanoviti zv yazok ta otrimuvati povidomlennya pro yihnij stan Dlya vzayemodiyi procesiv vikoristovuyut asinhronnij obmin povidomlennyami Kozhen proces maye svoyu chergu povidomlen obrobka yakoyi vikoristovuye zistavlennya iz vzircem Proces sho nadislav povidomlennya ne otrimuye povidomlennya pro dostavku navit yaksho identifikator procesu oderzhuvacha nedijsnij abo oderzhuvach ignoruye povidomlennya Takim chinom vidpovidalnist za pravilno organizovanu vzayemodiyu mizh procesami lezhit na rozrobnikovi Napriklad pri realizaciyi na Erlang merezhevogo chatu struktura programi mozhe bezposeredno vidobrazhati odnochasnist dij koristuvachiv shodo obminu povidomlennyami shlyahom zapusku novih procesiv Efektivnist peredachi povidomlen zberigayetsya zi zbilshennyam kilkosti procesiv a vimogi do pam yati minimizuyutsya za rahunok togo sho legkovagimi procesami keruye virtualna mashina a ne zasobi operacijnoyi sistemi Rozpodileni obchislennya Erlang z samogo pochatku proyektuvavsya dlya rozpodilenih obchislen ta masshtabovanosti Pidtrimka paralelizmu vbudovana v sintaksis ta semantiku movi tomu pobudovu sistemi mozhna vesti abstraguyuchis vid konkretnogo miscya obchislen U standartnij postavci Erlang mozhe nalagoditi zv yazok procesiv protokolu TCP IP nezalezhno vid pidtrimuvanih nim platform operacijnih sistem Zapushenij ekzemplyar emulyatora Erlang nazivayetsya vuzlom node Vuzol maye im ya i znaye pro isnuvannya inshih vuzliv na cij mashini abo u merezhi Stvorennya ta vzayemodiya procesiv riznih vuzliv ne vidriznyayetsya vid vzayemodiyi procesiv vseredini vuzla Programi napisani na Erlang zdatni pracyuvati na kilkoh vuzlah Vuzlami mozhut buti procesori bagato yader odnogo procesora i navit cilij klaster mashin Dlya stvorennya procesu na inshomu vuzli procesu dostatno znati jogo im ya i bez osoblivih pidstav vin mozhe ne cikavitisya fizichnim roztashuvannyam procesu sho z nim vzayemodiye Sintaksis vidpravki povidomlennya procesu na svoyemu vuzli ta viddalenomu odnakovij Zavdyaki vbudovanim u movu mozhlivostyam rozpodilenih obchislen ob yednannya v klaster balansuvannya navantazhennya dodavannya vuzliv ta serveriv pidvishennya nadijnosti viklikayut lishe neveliki vitrati na dodatkovij kod Za zamovchuvannyam vuzli sproyektovani dlya roboti vseredini vidokremlenogo segmenta merezhi DMZ ale yaksho neobhidno komunikaciya mizh vuzlami mozhe vidbuvatisya iz zastosuvannyam protokolu SSL zahishenogo kriptografichnimi metodami M yakij realnij chas Programi visokorivnevoyu movoyu Erlang mozhut buti vikoristani v sistemah m yakogo realnogo chasu yakij inodi perekladayut yak psevdorealnij abo kvazirealnij Avtomatizovane keruvannya pam yattyu ta zbirannya smittya diyut u ramkah odnogo procesu sho daye mozhlivist stvoryuvati sistemi z milisekundnim navit nezvazhayuchi na neobhidnist zbirannya smittya sho ne vidchuvayut pogirshennya propusknoyi zdatnosti pri visokomu navantazhenni Garyacha zamina kodu Dlya sistem yaki ne mozhut buti zupineni dlya Erlang proponuye garyachu zaminu kodu angl hot code upgrade Pri comu v dodatku mozhut odnochasno pracyuvati stari i novi versiyi kodu U takij sposib programne zabezpechennya na Erlang mozhe buti modernizovano bez prostoyiv a viyavleni pomilki vipravleni Opis moviTipi danih Tipizaciya v Erlang ye silnoyu ta dinamichnoyu Dinamichna tipizaciya bula obrana dlya movi Erlang cherez te sho pershi rozrobniki buli bilshe z neyu znajomi Na dumku Dzho Armstronga statichna tipizaciya vimagala b duzhe velikih trudovitrat zokrema realizuvati sistemu garyachogo dozavantazhennya kodu bulo b duzhe vazhko Taka tipizaciya koli mozhlivi pomilki tipiv viyavlyayutsya lishe pid chas vikonannya ne zavadila mozhlivosti stvoryuvati sistemi z duzhe Dani Erlang ye nezminnimi operaciyi ne perepisuyut stari znachennya sho znahodyatsya v pam yati Yaksho neobhidno moduli na Erlang mozhna zabezpechiti opisami ta viznachennyami novih tipiv sho ne vplivayut na kompilyaciyu programi dlya avtomatichnoyi perevirki tipiv za dopomogoyu utiliti Dialyzer Chisla U Erlang ye dva tipi chislovih literaliv cili i z ruhomoyu komoyu napriklad 125 4 5e 20 Krim zvichajnoyi notaciyi chisla mozhna zadavati cherez simvol ASCII napriklad B oznachaye 66 abo razom iz zaznachennyam sistemi chislennya z osnovoyu vid 2 do 36 u starih versiyah do 16 napriklad 16 3f 2 1010 U Erlang zastosovuyutsya cili chisla dovilnoyi tochnosti ta dijsni chisla podvijnoyi tochnosti 64 biti u standarti Dlya roboti z chislami mozhna vikoristovuvati modul math yakij mistit zvichajnij nabir matematichnih funkcij ta funkciyu math pi 0 sho povertaye chislo p displaystyle pi Priklad obchislen v interaktivnij obolonci Erlang OTP 23 erts 11 2 2 4 source 64 bit smp 20 20 ds 20 20 10 async threads 1 hipe Eshell V11 2 2 4 abort with G 1 gt 123 23 12 2 3 65 34782608695652 2 gt math cos math pi 1 0 3 gt random uniform 10 5 Atomi Atom konstanta z im yam sho maye buti vzyata v odinarni lapki yaksho ne pochinayetsya z maloyi literi abo mistit znaki okrim liter cifr pidkreslennya krapki ta simvolu Ponyattya atoma zapozichene z Prolog ta jogo mozhna vvazhati analogom pererahuvan enum v inshih movah programuvannya bez neobhidnosti poperednoyi deklaraciyi Atomi vikoristovuyutsya majzhe viklyuchno v porivnyannyah ta v zistavlenni zi vzircem en Pattern matching ta mayut Erlang duzhe efektivnu realizaciyu Krim togo deyaki atomi mayut pevnij sens u znachennyah sho povertayutsya i opisi vinyatkiv Do nih vidnosyatsya napriklad error ignore noreply ok reply stop undefined Bitovi ryadki ta binarni dani Bitovij ryadok vikoristovuyetsya dlya zberigannya pam yati netipizovanih danih Ryadki sho skladayutsya z ciloyi kilkosti oktetiv nazivayutsya binarnimi abo dvijkovimi danimi angl binaries Sintaksis opisu bitovogo ryadka dosit gnuchkij oskilki viznachaye znachennya bitiv okremih diapazoniv i mozhe buti zabezpechenij modifikatorom tipu Dekilka prikladiv v interaktivnij komandnij obolonci 1 gt lt lt 23 89 120 gt gt lt lt 23 89 120 gt gt 2 gt lt lt ABC gt gt lt lt 65 66 67 gt gt 3 gt lt lt 10 17 42 16 gt gt lt lt 10 17 0 42 gt gt 4 gt lt lt a b c gt gt lt lt abc gt gt 5 gt lt lt 1024 utf8 gt gt lt lt 208 128 gt gt Konstruktori bitovih ryadkiv angl bitstring comprehension analogichni spiskovim generatoram ale pracyuyut nad bitovimi ryadkami 1 gt lt lt lt lt bnot X 1 gt gt lt lt X 1 gt gt lt lt lt 2 111011 6 gt gt gt gt lt lt 4 6 gt gt U comu prikladi zminna X poslidovno otrimuye biti chisla 2 111011 yaki potim invertuyutsya operaciyeyu bitovogo zaperechennya bnot vid angl binary NOT vnaslidok chogo vihodit chislo 4 Kortezh Kortezh angl tuple skladenij tip danih z fiksovanoyu kilkistyu elementiv Pri dostupi do elementiv kortezhu za dopomogoyu vbudovanih funkcij numeraciya elementiv pochinayetsya z odinici a ne z nulya Pershij element kortezhu atom mozhut vikoristovuvati dlya opisu roli kortezhu u programi jogo nazivayut tegom angl tag mitka V Erlang prijnyato buduvati rizni tipi danih na osnovi kortezhiv z tegami ce polegshuye znevadzhennya programi ta vvazhayetsya garnim stilem programuvannya Dlya roboti z kortezhami ye dekilka vbudovanih funkcij napriklad 1 gt tuple size a 1 777 3 2 gt element 1 b 2 3 4 b 3 gt setelement 1 c 5 d d 5 Spisok Spisok angl list skladenij tip danih zi zminnoyu kilkistyu elementiv Dlya manipulyaciyi zi spiskami mozhna vikoristovuvati funkciyi modulya a rel nofollow class external text href https www erlang org doc man lists html all 2 lists a standartnoyi biblioteki Formalno spisok viznachayetsya yak struktura yaka maye golovu angl head ta hvist angl tail sho virazhayetsya sintaksichno u viglyadi HEAD TAIL de hvist zazvichaj ye spiskom mozhlivo porozhnim Porozhnij spisok poznachayetsya Spiski mozhna zapisuvati i bilsh zvichnim sposobom Nastupni zapisi ekvivalentni 1 gt a b c a b c Dlya roboti zi spiskami mozhna vikoristovuvati konstruktori spiskiv generatori spiskiv en List Comprehensions napriklad 1 gt X 2 X lt 1 2 3 4 0 5 1 0 1 5 2 0 Modul a rel nofollow class external text href https www erlang org doc man lists html all 2 lists a standartnoyi biblioteki mistit funkciyi dlya roboti zi spiskami ta ryadkami oskilki ryadok vidu test v Erlang ye spiskom kodiv simvoliv taki yak znahodzhennya najbilshogo znachennya sortuvannya zmini poryadku elementiv na protilezhnij otrimannya sumi elementiv tosho U nastupnomu prikladi skleyuyemo dva spiski v odin za dopomogoyu konkatenaciyi i dali rozbivayemo na dva spiski funkciyeyu lists split 2 1 gt lists split 2 l 2 3 4 5 6 l 2 3 4 5 6 A ce priklad togo sho ryadok vidu test v Erlang ye spiskom kodiv simvoliv 1 gt test t e s t true 2 gt test 116 101 115 116 true 3 gt t 116 U moduli a rel nofollow class external text href https www erlang org doc man lists html all 2 lists a ye takozh nabir funkcij vishogo poryadku takih yak lists all 2 lists any 2 lists dropwhile 2 lists filter 2 lists foldl 3 lists foldr 3 lists map 2 lists foreach 2 lists map 2 funkciya vishogo poryadku yaka daye mozhlivist zastosuvati viznachenu nami funkciyu do kozhnogo elementa spisku v rezultati otrimayemo novij spisok third degree R gt lists map fun X gt math pow X 3 end R V danomu prikladi funkciya math pow X 3 pidnosit do stepenya 3 kozhen element spisku R lists filter 2 dana funkciya vishogo poryadku prijmaye dva parametri funkciyu predikat za dopomogoyu yakoyi mi vidfiltrovuyemo nash spisok drugij parametr Povertaye novij spisok rezultat obrobki filtrom vhidnogo spisku multiple three List gt lists filter fun X gt X rem 3 0 end List V danomu prikladi z vhidnogo spisku List u novij vihidnij spisok popadut lishe elementi kratni trom lists foldl 3 funkciya livoyi zgortki angl fold zgornuti l vid angl left livij prijmaye 3 argumenti funkciyu zgortannya pochatkove znachennya akumulyatora perelik Funkciya zgortannya prijmaye dva argumenti potochnij element spisku ta potochne znachennya akumulyatora I povertaye nove znachennya akumulyatora Klasichni prikladi obchislennya sumi ta dobutku elementiv masivu 1 gt Numberlist 11 12 13 14 15 11 12 13 14 15 2 gt lists foldl fun Item Acc gt Acc Item end 0 Numberlist 65 3 gt lists foldl fun Item Acc gt Acc Item end 1 Numberlist 360360 Nastupnij priklad ilyustruye robotu funkciyi pravoyi zgortki lists foldr angl fold zgornuti r vid angl right pravij pershim parametrom yakoyi maye buti funkciya 1 gt D fun V A gt V A end funkciya D dilennya V na A Fun lt erl eval 12 82930912 gt 2 gt lists foldr D 1 1 2 4 8 0 25 3 gt 1 2 4 8 1 0 25 Rezultat vikonannya zgortki sprava nalivo u ryadku 2 totozhnij lancyuzhkovomu podilu ryadok 3 Drugij parametr foldr pochatkove znachennya tak zvanogo akumulyatora Dlya kozhnogo elementa spisku sprava livoruch do elementa ta akumulyatora zastosovuyetsya funkciya zadana pershim argumentom foldr a znachennya zapisuyetsya v akumulyator Za vicherpannyam spisku funkciya povertaye znachennya akumulyatora Funkciya ye dosit potuzhnim zasobom yaksho vrahuvati sho akumulyator mozhe buti spiskom abo kortezhem Zazvichaj koristuyutsya foldl tomu sho operaciya otrimannya elementu golovi spisku vikonuyetsya za konstantnij chas a dlya otrimannya elementu z kincya spisku potribno projtis cherez ves spisok Ryadok U Erlang nemaye samostijnogo tipu dlya ryadkiv vnutrishno ryadki ye spiskami kodiv simvoliv Ryadok Privit rivnosilnij u vidpovidnomu koduvanni spisku 1055 1088 1080 1074 1077 1090 33 Dlya pravilnoyi interpretaciyi spiskiv kodiv simvoliv yak ryadkiv v interaktivnij konsoli zapuskajte z vidpovidnim parametrom erl pc unicode Erlang pidtrimuye Unicode yak u ryadku tak i zapisu okremogo simvolu X de X deyakij simvol Binarni poslidovnosti zapisuyutsya ta vidobrazhayutsya yak poslidovnosti cilih chisel abo ryadkiv pomisheni mizh podvijnimi simvolami lt ta gt Dlya prikladu 1 gt lt lt 5 10 20 gt gt lt lt 5 10 20 gt gt 2 gt lt lt hello gt gt lt lt hello gt gt term to binary Term gt Bin Konvertuye bud yakij term Erlang u binarnu poslidovnist Binarna poslidovnist viroblena za dopomogoyu term to binary zberigayetsya v tak zvanomu zovnishnomu formati termu Termi yaki buli konvertovani v binarni poslidovnosti z vikoristannyam term to binary mozhut buti zberezheni v fajli peredani v povidomlennyah po merezhi tosho a pochatkovij term z yakogo voni buli zrobleni mozhe buti vidnovlenij piznishe Ce nadzvichajno korisno dlya zberezhennya skladnih struktur danih u fajli abo nadsilannya skladnih struktur danih na viddaleni mashini 1 gt B term to binary useful lt lt 131 107 0 6 117 115 101 102 117 108 gt gt 2 gt binary to term B useful Atomi i ryadki zovni dosit shozhi ale mayut rizni realizaciyi Todi yak atomi mozhna lishe porivnyuvati ryadki pidtrimuyut bagato inshih operacij yim ye bezlich funkcij v modulyah lists i string Ryadok mozhe vikonuvati funkciyi atoma ale pam yat yaku zajmaye ryadok proporcijna jogo dovzhini todi yak atomi zberigayutsya v sistemnij tablici i na kozhne zberigannya peresilannya atoma v programi pripadaye lishe dekilka bajtiv nezalezhno vid dovzhini atoma Porivnyannya dvoh atomiv ce porivnyannya dvoh vnutrishnih identifikatoriv yake vikonuyetsya za odnu operaciyu todi yak porivnyannya ryadkiv peredbachaye poelementnij prohid tobto porivnyannya kodiv simvoliv elementiv spiskiv Logichni znachennya Dlya znachen bulevoyi logiki istinne ta hibne v Erlang zastosovuyutsya atomi true istinne i false hibne yaki vikoristovuyutsya operaciyami porivnyannya logichnimi operaciyami vbudovanimi funkciyami Priklad 1 gt 2 lt 3 true 2 gt is boolean 125 false Funkcionalnij ob yekt Fun Fun viraz dozvolyaye stvoriti anonimnu funkciyu lyambda funkciyu yaka vikoristovuyetsya napriklad dlya peredachi argumentom v inshu funkciyu Za dopomogoyu fun mozhna takozh otrimati funkcionalnij ob yekt dlya funkciyi modulya Prikladi 1 gt lists map fun X gt X 1 end 1 2 3 2 3 4 2 gt Belongs fun lists member 2 Fun lt lists member 2 gt 3 gt Belongs a a b true Zapis Shob poznachati okremi elementi kortezhiv polegshiti robotu z velikimi kortezhami i uniknuti pomilok pri napisanni programi v Erlang bulo dodano sintaksichnij cukor sintaksis zapisiv angl record Zapisiv ne isnuye v chas vikonannya na etapi kompilyaciyi zapisi peretvoryuyutsya translyuyutsya v kortezhi klyuchi gublyatsya vidpovidno v chas vikonannya isnuyut lishe znachennya zapisiv Dlya roboti z zapisami neobhidno spochatku dati opis zapisu direktivoyu record napriklad dlya zapisu user opis mozhe buti nastupnim record user login anonymous email password Z cogo opisu kompilyator diznayetsya sho mayutsya na uvazi kortezhi z chotiroh elementiv v yakih elementi z drugogo po chetvertij vidpovidayut polyam login nick password zapisu z im yam user viznachayetsya atomom v pershomu elementi kortezhu Znachennyam za zamovchuvannyam dlya polya login ye ryadok anon Yaksho znachennya za zamovchuvannyam ne vkazano yavno takim ye atom undefined Stvorennya zapisiv ta viluchennya elementiv zapisu zavzhdi vimagaye yavnoyi vkazivki imeni zapisu R0 user vsi polya otrimuyut znachennya za zamovchuvannyam R1 user login user1 email user mail com password secret Zadayemo znachennya dlya vsih poliv Onovlennya odnogo znachennya v nayavnomu zapisi R2 R1 user login user2 onovlennya dvoh znachen v nayavnomu zapisi R2 R1 user login user2 email neo matrix org otrimati znachennya po klyuchu z zapisu Nick2 R2 user nick Karta Asociativnij masiv slovnik en map zberigaye pari vidu klyuch znachennya I klyuchem i znachennyam mozhe buti bud yakij term Erlang Map a gt 2 b gt 3 c gt 4 a gt 1 b gt 2 hi gt 42 Key hi maps find Key Map ok 42 Inshi tipi U movi Erlang ye inshi tipi danih Tip posilannya angl reference ye unikalnim u mezhah vuzla klastera z yednanih vuzliv v seredovishi chasu vikonannya Erlang Posilannya stvoryuyetsya viklikom funkciyi make ref 0 i mozhe povtoritisya cherez 282 viklikiv ciyeyi funkciyi Posilannya mozhna porivnyuvati na rivnist a zastosovuyutsya voni dlya odnorazovih poznachok abo Identifikator portu angl port identifier viznachaye port dlya zv yazku iz zovnishnim po vidnoshennyu do Erlang sistemi svitom Port dozvolyaye procesu sho jogo stvoriv vlasniku tak zvanomu priyednanomu procesu obminyuvatisya binarnimi povidomlennyami zi storonnimi programami i OS sposobom prijnyatim v danij operacijnij sistemi Identifikator procesu angl Pid yak i viplivaye z jogo nazvi identifikuye proces sho porodzhuyetsya riznimi funkciyami spawn Identifikator mozhna vvazhati unikalnim pid chas roboti Erlang sistemi ale v sistemah sho dovgo pracyuyut mozhut vse taki buti vikoristani povtorno sho zazvichaj ne ye problemoyu na praktici Vbudovani funkciyi dlya roboti z tipami Dlya peretvorennya tipiv vikoristovuyutsya vbudovani funkciyi BIF angl builtin function vidu x to y z x v y a dlya perevirki nalezhnosti znachennya togo chi inshogo tipu funkciyi vidu is x ye x 1 gt atom to list hello hello 2 gt list to binary world lt lt world gt gt 3 gt tuple to list 1 2 3 4 1 2 3 4 1 gt is integer 3 true 2 gt is tuple abc false 3 gt is integer 3 0 falseOperaciyiArifmetichni operaciyi Erlang nadaye najbilsh poshireni arifmetichni operaciyi dlya cilih chisel i chisel z plavayuchoyu komoyu Poznachennya Operaciya sho vikonuyetsya priklad Rezultat prikladu Unarnij plyus 3 3 Unarnij minus 3 3 Dodavannya 2 3 5 Vidnimannya 7 3 4 mnozhennya 1 2 0 4 0 48 Dilennya 5 3 1 6666666666666667 div Cilochiselne dilennya 5 div 3 1 rem Zalishok vid dilennya 5 rem 3 2 Vsi ci operaciyi Unarni operaciyi mayut najvishij prioritet potim sliduye mnozhennya i dilennya najmenshij prioritet u skladannya ta vidnimannya Pri neobhidnosti cile mozhe privoditisya do tipu z ruhomoyu komoyu Bitovi operaciyi Bitovi operaciyi pracyuyut nad cilimi chislami i dayut v rezultati cile chislo Poznachennya Operaciya sho vikonuyetsya priklad Rezultat prikladu bnot Pobitove zaperechennya bnot 2 1000 9 band Pobitove I 2 band 3 2 bor Pobitove ABO 1 bor 2 3 bxor Pobitove viklyuchne ABO 5 bxor 3 6 bsr Pobitovij zsuv vpravo 32 bsr 2 8 bsl Pobitovij zsuv vlivo 1 bsl 5 32 Logichni operaciyi Logichni operaciyi pracyuyut nad logichnimi znachennyami true istinne i false hibne oderzhuvanimi v rezultati porivnyan ta zastosuvannya funkcij perevirki tipu Poznachennya Operaciya sho vikonuyetsya priklad Rezultat prikladu not Zaperechennya NE not true false and Kon yunkciya I true and 1 lt 5 true andalso Analogichno and ale ne obchislyuye drugij operand yaksho pershij false false andalso 1 lt 5 false or Diz yunkciya ABO is atom 1 or is atom 1 false orelse Analogichno or ale ne obchislyuye drugij operand yaksho pershij true true orelse 1 lt 5 true xor Viklyuchne ABO true xor true false Operaciyi porivnyannya Operaciyi porivnyannya otrimuyut dva operandi a rezultatom operaciyi ye logichne znachennya true abo false U Erlang ye nastupni operaciyi rivno rivno vrahovuyuchi tip vikoristovuyetsya dlya porivnyannya chisel ne rivno ne rivno vrahovuyuchi tip vikoristovuyetsya dlya porivnyannya chisel lt menshe abo dorivnyuye lt menshe gt bilshe gt bilshe abo dorivnyuye perevirka na rivnist ne vrahovuyuchi tip 1 gt 5 5 true 2 gt 5 5 0 true perevirka na rivnist vrahovuyuchi tip 4 gt 5 5 true 5 gt 5 5 0 false Mozhna porivnyuvati znachennya riznih tipiv ale voni vvazhayutsya v Erlang vporyadkovanimi nastupnim chinom chislo lt atom lt posilannya lt funkciya lt port lt identifikator procesu lt kortezh lt spisok lt binarni dani Spiski vvazhayutsya vporyadkovanimi v leksikografichnomu poryadku a kortezhi porivnyuyutsya za dovzhinoyu i lishe potim u leksikografichnomu poryadku Zminni Zminni sluzhat dlya zberigannya znachen prostih i skladovih tipiv Im ya zminnoyi pochinayetsya z velikoyi literi u specialnih vipadkah z pidkreslennya i mozhe mistiti bukvi cifri pidkreslennya Zminnij mozhna prisvoyiti znachennya lishe odin raz cya vlastivist movi programuvannya nazivayetsya odinichnim prisvoyennyam angl single assignment Do perevag odinichnogo prisvoyennya mozhna vidnesti usunennya neobhidnosti v blokuvannyah a takozh sproshennya nalagodzhennya programi Vidbuvayetsya obchislennya redukciya argumentiv funkciyi pered zastosuvannyam funkciyi do cih argumentiv vhidnih parametriv Oblast vidimosti zminnoyi poshiryuyetsya vid yiyi viznachennya en bind zv yazuvannya do zakinchennya klozi funkciyi Priklad binomial X gt Y X X X Y prod 1 T gt prod T prod Y T gt Y prod T prod gt 1 U comu prikladi oblast vidimosti X ves opis funkciyi binomial 1 a Y vid prisvoyennya do kincya opisu Zminna Y u drugij klozi funkciyi prod 1 ne maye vidnoshennya do zminnoyi Y z binomial 1 yiyi oblast vidimosti poshiryuyetsya do kincya ciyeyi klozi Pri vihodi obchislen za mezhi oblasti vidimosti zminnoyi pam yat zajnyata yiyi vmistom mozhe buti zvilnena u procesi zbirannya smittya yaksho znachennya zminnoyi ne vikoristovuyetsya v inshij chastini programi Zistavlennya zi vzircem Zistavlennya zi zrazkom en Pattern Matching vikoristovuyetsya v Erlang dlya prisvoyennya u tomu chisli pri roboti z parametrami funkcij upravlinnya potokom vikonannya programi otrimannya znachen skladovih tipiv viboru povidomlennya z chergi U livij chastini porivnyannya abo v zagolovku funkciyi mozhut buti pov yazani vzhe mayut znachennya i nezv yazani otrimuyuchi znachennya zminni a takozh literali atomi chisla ryadki V rezultati vikonannya porivnyannya mozhe viyavitisya uspishnim u comu vipadku zminni zv yazuyutsya zi znachennyami ta neuspishnim zminni zalishayutsya nepov yazanimi U zrazku mozhut buti zminni znachennya yakih dlya zrazka bajduzhe yih imena zapisuyutsya z pidkreslennya Zminni im ya yakih pochinayetsya z pidkreslennya ce zvichajni zminni krim togo sho kompilyator ne bude skarzhitisya yaksho voni ne vikoristani Ne mozhna priv yazuvati do nih znachennya bilshe odnogo razu FunkciyiProgrami Erlang skladayutsya z funkcij yaki viklikayut odne odnogo Kilkist vhidnih argumentiv parametriv funkciyi nazivayetsya arnistyu Pri vikliku funkciyi zagolovki funkciyi zistavlyayutsya zi zrazkom U razi zbigu parametriv vikliku formalni parametri zv yazuyutsya z faktichnimi i vikonuyetsya vidpovidna chastina tila funkciyi Zapis variantu obchislennya funkciyi dlya deyakogo zrazka mozhe nazivatisya klozom vid angl clause a viznachennya funkciyi ce nabir z odnogo abo bilshe kloziv Dlya utochnennya zistavlennya zi zrazkom u funkciyah mozhna vikoristovuvati ohoronni virazi yaki viplivayut pislya klyuchovogo slova when U prikladi nizhche viznacheno funkciyu obchislennya znaka chisla yaka rozrahovuyetsya v zalezhnosti vid porivnyannya parametra z nulem sign X when X gt 0 gt 1 sign X when X 0 gt 0 sign X when X lt 0 gt 1 Erlang perebiraye matchit klozi funkciyi v tomu poryadku v yakomu voni zapisani zverhu vniz zliva napravo doki ne bude znajdeno vidpovidnij viraz zagolovok klozi yakij zmatchitsya V ohoronnih virazah mozhna vikoristovuvati lishe obmezhenij nabir vbudovanih funkcij oskilki ci funkciyi ne povinni mati pobichnih efektiv Funkciyi Erlang pidtrimuyut rekursivni vikliki U razi koli viznachennya funkciyi zakinchuyetsya rekursivnim viklikom hvostova rekursiya Erlang vikoristovuye optimizaciyu stek viklikiv ne zastosovuyetsya Yak parametrom i rezultatom funkciyi mozhe buti insha funkciya U nastupnomu prikladi funkciya odnogo argumentu povertaye funkciyu dodavannya argumentu1 gt Plus fun X gt fun Y gt X Y end end Viznachennya funkciyi yaka povertaye funkciyu Fun lt erl eval 6 82930912 gt 2 gt Plus 2 Funkciya povertaye Fun ob yekt Fun lt erl eval 6 82930912 gt 3 gt Plus 2 3 Takij sintaksis ne pracyuye 1 syntax error before 4 gt Plus 2 3 Dodatkovi duzhki dozvolyayut dosyagti neobhidnogo rezultatu 5 5 gt Plus2 Plus 2 Plus2 3 Te same z vikoristannyam dodatkovoyi zminnoyi 5 Umovni virazi Okrim matchingu ta ohoronnih viraziv u klozah funkciyi v Erlang ye inshi umovni virazi viboru if ta case Viraz viboru dozvolyaye organizuvati zistavlennya zi zrazkom useredini funkciyi i zazvichaj maye nastupnij sintaksis if ohorona 1 gt viraz 11 viraz 12 ohorona 2 gt viraz 21 viraz 22 ohorona N gt viraz N1 viraz N2 end Tut ohorona1 ohoronnij viraz en guards Ohoronni virazi rozshirennya zistavlennya zi zrazkom sho dodaye viraznosti Bez ohoronnih viraziv mi ne mozhemo viznachati taki rechi yak diapazon znachen chi pevni tipi danih U Erlang if ce viraz yakij mozhe mati dekilka gilok Gilki skanuyutsya poslidovno zverhu donizu dopoki zahisna poslidovnist ne bude ocinena yak true Yaksho ohorona1 pershij guard v danomu prikladi poverne true odrazu pochnetsya vikonannya vidpovidnih viraziv viraz11 viraz12 Pislya vikonannya cih viraziv vidbudetsya vihid z bloku i nastupni umovi ohorona2 ohoronaN pereviryatisya ne budut Yaksho zh ohorona1 poverne false vidbuvayetsya perehid do perevirki nastupnogo ohoronnogo virazu i tak doti poki guard ne poverne znachennya true pislya chogo budut vikonani vidpovidni rozdileni komami virazi i vihid z bloku Slid zauvazhiti sho i tut v ohoronnomu virazi mozhna zastosovuvati lishe obmezhenij nabir operacij ta vbudovanih funkcij Komi v ohoronnomu virazhenni pracyuyut yak operaciya andalso krapka z komoyu yak orelse napriklad if X lt 0 gt io format menshe abo dorivnyuye nulyu n lt lt menshe abo dorivnyuye nulyu utf8 gt gt X gt 0 X lt 10 gt io format bilshe nulya ta menshe desyati n lt lt bilshe nulya ta menshe desyati utf8 gt gt X 10 X 11 gt io format dorivnyuye desyati abo odinadcyati n lt lt dorivnyuye desyati abo odinadcyati utf8 gt gt true gt io format bilshe abo dorivnyuye dvanadcyati n lt lt bilshe abo dorivnyuye dvanadcyati utf8 gt gt end Yaksho zhodna zahisna poslidovnist ne ye istinnoyu vinikaye pomilka vikonannya if clause Pri neobhidnosti mozhna vikoristovuvati zahisnik true V ostannij gilci oskilki cya zahisna poslidovnist zavzhdi virna i vvazhayetsya analogom inshe Kompilyator Erlang stezhit za bezpekoyu zv yazuvannya zminnih useredini umovnih viraziv ce mi mozhemo pobachiti na nastupnomu prikladi module badexample export broken if 1 broken if X gt if X lt 0 gt Z 1 X gt 0 gt Y 1 end Y Z Pri sprobi skompilyuvati modul vinikayut povidomlennya pro pomilki tomu sho v takomu kodi zminni ne pov yazuyutsya zi znachennyam v inshij klozi vidpovidno 1 gt c badexample badexample erl 8 variable Y unsafe in if line 4 badexample erl 8 variable Z unsafe in if line 4 error Pravilnim bulo b viznachiti vsi vikoristovuvani dali za kodom zminni u vsih gilkah if virazi module if else export compare 2 ascii 1 run 3 compare X Y gt Result if X gt Y gt greater X Y gt equal X lt Y gt less end io format p is p than p n X Result Y ascii Letter gt Code if Letter A gt 101 Letter B gt 102 true gt unknown end io format p p n Letter Code run X Y Letter gt compare X Y ascii Letter Mozhna vikoristovuvati viraz case of dlya porivnyannya poslidovnosti paterniv Na vidminu vid virazu if case of dozvolyaye vikoristovuvati ohoronni virazi v punktah spivstavlennya Yaksho zhodnij viraz case ne vidpovidaye zrazku ne matchitsya sistema vikonannya vikliche pomilku pro vidsutnist vidpovidnosti no case clause matching Vikoristovuvati shablon pidkreslennya mozhna shob zahopiti bud yake inshe znachennya yakim ne vidpovidali poperedni klyuchi case expression of pattern1 when guard1 gt expr seq1 pattern2 when guard2 gt expr seq2 end Spochatku obchislyuyetsya expression pripustimo sho pri comu vono nabuvaye znachennya Value Dali Value spivstavlyayetsya z pattern1 razom z opcionalnim kontrolerom guard1 pattern2 i tak dali do pershogo uspishnogo spivstavlennya Yak tilki ce stanetsya vikonuyetsya poslidovnist viraziv expr seqN i rezultat cogo obchislennya staye rezultatom vsogo danogo virazu Yaksho zhoden iz paterniv ne pidijde to vidbuvayetsya vinyatkova situaciya module case of compile export all nowarn export all admit Person gt case Person of male Age when Age gt 21 gt yes with cover female Age when Age gt 21 gt yes no cover male gt no boy admission female gt no girl admission gt unknown end run Person gt Record admit Person io format p n Record Prikladi V funkcionalnih movah programuvannya vidsutni cikli natomist vikoristovuyetsya rekursiya Rozglyanemo funkciyi obchislennya faktorialu module fact export fac 1 func 1 fac 0 gt 1 fac N when N gt 0 gt N fac N 1 Ce rekursiya bez hvostovoyi optimizaciyi vona dobre pracyuye dlya nevelikoyi glibini rekursiyi Prote staye problematichnoyu u vipadku velikoyi glibini rekursiyi Chim bilshe operacij rekursiyi tim bilshe zajme pam yati dana programa u steku pri vikonanni dana rekursiya rozgortayetsya u stek vidpovidno chim bilshe rekursivnih viklikiv tim bilshe pam yati zajme dana programa pri vikonanni Hvostova rekursiya ce rekursiya yaka viklikayetsya ostannoyu instrukciyeyu takim chinom stek zalishayetsya nezminnim abo zh praktichno nezminnim i funkciya mozhe pracyuvati permanentno bez zupinki func N gt func N 1 func 0 A gt A func N A when N gt 0 gt func N 1 N A Hvostova rekursiya nezalezhna vid kilkosti rekursivnih viklikiv v pam yati zalishayutsya lishe dva chisla Sprobuyemo napisati funkciyu obchislennya N nogo chisla Fibonachchi na Erlang dvoma shlyahami algoritmami Spochatku zvichajna rekursiya module fibonacci export fib usual 1 fib tail 1 fib usual 1 gt 0 fib usual 2 gt 1 fib usual N when N gt 0 gt fib usual N 1 fib usual N 2 Dana funkciya trimaye vsi chisla promizhni rezultati odnochasno u pamyati i kilkist rekursivnih viklikiv funkciyi aktivnih procesiv zrostaye nadto strimko Hvostova rekursiya v danomu vipadku pishetsya z vikoristannyam dvoh timchasovih zminnih v yakosti parametriv nashoyi funkciyi Taki zminni nazivayutsya akumulyatorami ta vikoristovuyutsya dlya zberigannya promizhnih rezultativ nashih obchislen shob ne zberigati bagato nezakinchenih obchislen procesiv yaki ochikuyut rezultat rozrahunkiv vid inshih procesiv u pam yati fib tail N when is integer N N gt 0 gt fib tail N 1 0 fib tail 0 A1 gt A1 fib tail N A1 A2 gt fib tail N 1 A2 A1 A2 U pamyati trimayutsya lishe tri chisla ta zajmayetsya obchislennyami lishe odin proces Dodamo dekilka funkcij yaki pracyuyut rekursivno zi spiskom i vikonuyut taki zvichni dlya vsih nas zavdannya viznachennya dovzhini masivu znahodzhennya maksimalnogo minimalnogo elementa masivu obchislennya sumi vsih elementiv masivu 1 Viznachennya dovzhini masivu spochatku zvichajna rekursiyalen list gt 0 len list gt 1 len list H T when is list H T gt 1 len list T hvostova rekursiya z akumulyatoromlength tail List when is list List gt length tail List 0 length tail Acc gt Acc length tail Tail Acc gt length tail Tail 1 Acc 2 Znahodimo maksimalnij element masivu spochatku zvichajna rekursiyamax el Last when is number Last gt Last max el H T when hd T gt H gt max el T max el H T gt max el H tl T ta sama funkciya z dopomogoyu hvostovoyi rekursiyi i akumulyatoratail maxx H T when is number H gt tail maxx T H tail maxx Acc when is number Acc gt Acc tail maxx H T Acc when H gt Acc gt tail maxx T H tail maxx T Acc gt tail maxx T Acc 3 Pidrahuyemo sumu elementiv masivu zvichajna rekursiyasumx gt 0 sumx H T gt H sumx T pidrahunok sumi elementiv masivu z dopomogoyu hvostovoyi rekursiyitail sum List gt tail sum List 0 tail sum Acc gt Acc tail sum H T Acc gt tail sum T Acc H Odin z algoritmiv sortuvannya shvidke sortuvannya module qsort export qsort 1 qsort gt qsort Pivot Rest gt qsort Front Front lt Rest Front lt Pivot Pivot qsort Back Back lt Rest Back gt Pivot U comu prikladi funkciya qsort viklikayetsya rekursivno do vicherpannya vsih elementiv Viraz Front Front lt Rest Front lt Pivot zbiraye spisok Front z elementiv Rest takih sho element Front menshij za Pivot Operator skleyuye spiski Preprocesor ta makrosi Preprocesor Erlang EPP dozvolyaye vkladati fajli z vihidnim kodom odin v inshij viznachati makrosi ta zdijsnyuvati prosti ta parametrizovani makropidstanovki Makros viznachayetsya za dopomogoyu direktivi define a makropidstanovka zdijsnyuyetsya vkazivkoyu imeni makrosa ta mozhlivih parametriv pislya znaka pitannya Nastupnij priklad pokazuye viznachennya ta zastosuvannya parametrizovanogo makrosa define ZERO X X 0 is zero T when ZERO X gt true is zero T gt false Im ya makrosa zazvichaj pishetsya velikimi literami Viznachennya makrosa maye mistiti leksemi Erlang cilkom napriklad sproba zadati chastinu imeni zminnoyi za dopomogoyu makrosa viklikaye sintaksichnu pomilku Makrosi mozhut vikoristovuvatisya dlya pidvishennya zruchnosti chitannya kodu v ohoronnih virazah dlya operatoriv nalagodzhennya i t in Preprocesor maye dekilka viznachenih makrosiv yaki ne mozhna pereviznachiti MODULE MODULE STRING FILE LINE MACHINE Zagolovnij fajl rozshirennya hrl z viznachennyami makrosiv ta zapisiv mozhna vklyuchiti za dopomogoyu direktivi include Obrobka pomilok Dlya obrobki vinyatkovih situacij Erlang mozhna zastosovuvati konstrukciyu try catch v zagalnomu vipadku zapisuyetsya v nastupnomu viglyaditry viraz dlya obchislennya of zrazok 1 when ohorona 1 gt viraz 1 zrazok 2 when ohorona 2 gt viraz 2 zrazok N when ohorona N gt viraz N catch klass 1 zrazokVikl 1 when ohoronaVikl 1 gt virazVikl 1 klassM zrazokViklM Stacktrace when ohoronaViklM gt virazViklM end Yak i u vipadku case virazu viraz sho obchislyuyetsya zistavlyayetsya zi zrazkom chastini mizh of i catch dlya otrimannya rezultatu Pislya klyuchovogo slova catch sliduyut chastini obrobki vinyatkiv u yakih na dodatok do zrazkiv vinyatkiv mozhut buti vkazani klasi vinyatkiv pered dvokrapkoyu error throw ta exit Stacktrace ce spisok viklikiv funkcij obchislennya yakih vikonuvala programa koli bulo stvoreno vinyatok Pidkreslennya mozhe vikoristovuvatis yak u zrazku tak i v klasi viklyuchennya Nastupnij prostij priklad ilyustruye perehoplennya pomilki klasu error pri obchislenni kvadratnogo korenya 1 gt try math sqrt 1 catch error Error gt error Error end error badarith 2 gt try math sqrt 4 catch error Error gt error Error end 2 0 Dlya stvorennya vinyatkiv viznachenih koristuvachem vikoristovuyetsya funkciya throw 1 yaka prijmaye kortezh z bilsh detalnim opisom pomilki sho vinikla i generuye vinyatok klasu throw Vikoristannya ciyeyi funkciyi nebazhane cherez pogirshennya zruchnosti chitannya kodu programi ale mozhe znadobitisya v deyakih vipadkah pri roboti z vkladenimi strukturami danih napriklad pri rozbori XML Vinyatki klasu exit vinikayut u rezultati vikliku vbudovanoyi funkciyi exit 1 abo signalu vihodu Do rozrobki Richardom Karlssonom Richard Carlsson z komandi proyektu HiPE opisanogo vishe novogo mehanizmu obrobki vinyatkiv z yavivsya u versiyi R10B v Erlang vikoristovuvalisya catch virazi ModuliKod programi na Erlang mozhna rozbiti na okremi moduli Modul ce im ya dlya naboru funkcij organizovanih v odnomu fajli Im ya modulya maye zbigatisya z im yam fajlu yaksho vidkinuti rozshirennya Modul mozhna vidkompilyuvati v bajt kod yak iz komandnogo ryadka operacijnoyi sistemi tak i z komandnoyi obolonki Erlang U fajli modulya mozhna zapisati ogoloshennya funkcij ta direktivi inodi nazivayutsya atributami Obov yazkovim atributom ye lishe module atom imeni modulya Inshij atribut sho chasto vikoristovuyetsya export zastosovuyetsya dlya opisu spisku eksportovanih funkcij tobto funkcij yaki mozhna vikoristovuvati za mezhami modulya Funkciyi v Erlang odnoznachno viznachayutsya modulem im yam ta arnistyu Napriklad math cos 1 vidpovidaye funkciyi cos z modulya math prijmaye odin argument Viklikati funkciyu mozhna tak math cos 1 2 Vihidnij tekst modulya kompilyuyetsya v BEAM fajl fajl sho mistit bajt kod virtualnoyi mashini BEAM angl Bogdan s Bjorn s Erlang Abstract MachineBogdan s Bjorn s Erlang Abstract Machine U svoyu chergu ERTS angl Erlang Runtime SystemErlang Runtime System sistema chasu vikonannya Erlang vikonuye cej kod Procesi Osnovnoyu abstrakciyeyu paralelnogo programuvannya v Erlang ye proces Procesi mozhut porodzhuvati inshi procesi vikonuvatisya odnochasno obminyuvatisya povidomlennyami reaguvati na zavershennya odin odnogo Stvorennya procesiv Erlang maye nevelikij ale potuzhnij nabir primitiviv dlya stvorennya procesiv i spilkuvannya mizh nimi Mizhprocesovij zv yazok pracyuye za dopomogoyu asinhronnoyi sistemi peredachi povidomlen yaka ne maye spilnogo dostupu kozhen proces maye poshtovu skrinku chergu povidomlen yaki buli nadislani inshimi procesami ta she ne vikoristani Dlya otrimannya povidomlen yaki vidpovidayut bazhanim patternam proces vikoristovuye primitiv receive Procedura obrobki povidomlen pereviryaye povidomlennya po cherzi na vidpovidnist kozhnomu patternu poki odin z nih ne zbigayetsya Koli povidomlennya vikoristano ta vidaleno z poshtovoyi skrinki proces vidnovlyuye vikonannya Povidomlennya mozhe mistiti bud yaku strukturu Erlang vklyuchayuchi primitivi cili chisla chisla z plavayuchoyu tochkoyu simvoli atomi kortezhi spiski ta funkciyi Dlya stvorennya novogo procesu sluzhit dekilka vbudovanih funkcij spawn ta yiyi analogi Funkciyi povertayut identifikator procesu yakij mozhe vikoristovuvatisya napriklad dlya nadsilannya povidomlen novostvorenomu procesu V interaktivnij konsoli erl mozhna otrimati spisok procesiv ta inshu informaciyu za dopomogoyu funkcij processes ta i vidpovidno Navedenij nizhche priklad kodu pokazuye vbudovanu pidtrimku rozpodilenih procesiv Stvorimo proces ta viklichemo funkciyu web start server Port MaxConnections ServerProcess spawn web start server Port MaxConnections Stvorimo viddalenij proces ta viklichemo funkciyu web start server Port MaxConnections na viddalenij nodi RemoteNode RemoteProcess spawn RemoteNode web start server Port MaxConnections Vidpravimo povidomlennya procesu ServerProcess asinhronno Povidomlennya skladayetsya z kortezha z atomom pause ta chislom 10 ServerProcess pause 10 Otrimayemo povidomlennya nadislani comu procesu receive a message gt do something data DataContent gt handle DataContent hello Text gt io format Got hello message s Text goodbye Text gt io format Got goodbye message s Text end Yak pokazuye priklad procesi mozhut buti stvoreni u viddalenih vuzlah i vzayemodiya z nimi ye prozoroyu u tomu sensi sho vzayemodiya z viddalenimi procesami pracyuye tochno tak samo yak vzayemodiya z lokalnimi procesami Rozpodilenist en Concurrency pidtrimuye osnovnij metod obrobki pomilok v Erlang Koli proces avarijno zavershuyetsya vin akuratno zavershuye robotu ta nadsilaye povidomlennya keruyuchomu procesu yakij potim mozhe vzhiti zahodiv napriklad zapustiti novij proces yakij bere na sebe zavdannya starogo procesu Peredacha ta prijom povidomlen Yak i mova Occam Erlang vikoristovuye dlya vidpravki povidomlennya sintaksis zi znakom okliku Process ID Message Prijom povidomlennya tobto viluchennya jogo z chergi poshtovoyi skrinki procesu vikonuyetsya za dopomogoyu receive viraziv yaki zazvichaj zapisuyutsya takim chinom receive zrazok 1 when ohorona 1 gt viraz 11 viraz 12 zrazok 2 when ohorona 2 gt viraz 21 viraz 22 zrazok N when ohorona N gt viraz N1 viraz N2 Nepov yazanaZminnaDlyaInshihPovidomlen gt viraz 1 viraz 2 end Zustrivshi takij viraz interpretator poslidovno pereglyadaye povidomlennya z chergi Kozhne povidomlennya interpretator zistavlyaye zi zrazkom i yaksho vono vidpovidaye zrazku to obchislyuyutsya vidpovidni virazi Koli vsi povidomlennya perebrani i potribnogo ne viyavilosya proces ochikuye novih povidomlen pislya chogo perebir chergi povtoryuyetsya Yaksho v receive virazi vidsutnij zrazok yakomu zadovolnyaye bud yake povidomlennya takij viraz nazivayetsya vibirkovim receive virazom Obrobka pomilok ta zavershennya procesiv Proces mozhna zv yazati z inshim u rezultati mizh procesami vstanovlyuyetsya dvonapravlene z yednannya angl link Yaksho odin iz procesiv zavershuyetsya nenormalno vsim pov yazanim z nim procesam peredayetsya signal vihodu angl exit signal Procesi sho otrimali signal zavershuyutsya poshiryuyuchi signal dali Signal vihodu ye kortezhem elementami yakogo ye atom EXIT vihid identifikator procesu sho zavershivsya i prichinu zavershennya procesu Prichina zavershennya peredayetsya lancyuzhkom procesiv sho zavershuyutsya Proces mozhe zdijsniti perehoplennya pomilki angl trapping errors yaksho vin maye praporec perehoplennya vihodu Takij proces otrimuye signali vihodu pov yazanih z nim procesiv u viglyadi zvichajnih povidomlen z analogichnoyu strukturoyu kortezhu Perehoplenij signal vihodu bilshe ne peredayetsya pov yazanim z procesom perehoplyuvachem procesam Signal vihodu z prichinoyu atomom normal normalne zavershennya procesu ne viklikaye zavershennya pov yazanogo procesu Yaksho zh prichina atom kill proces zavershuyetsya bezzasterezhno nezalezhno vid praporec perehoplennya vihodu a pov yazanim z nim procesam yak prichina vidpravlyayetsya atom killed sho daye yim mozhlivist zreaguvati Erlang maye mozhlivist vstanoviti i odnonapravlene z yednannya Pri zavershenni procesu sho sposterigayetsya proces sposterigach otrimuye povidomlennya iz zaznachennyam prichini zavershennya Proces mozhe zupiniti sebe sam chi zupiniti inshij proces viklikavshi funkciyu exit Vvid vivid U procesiv Erlang sistemi problema vvodu vivodu vlastiva bagatom inshim movam paralelnogo programuvannya virishena dostatno elegantno Upravlinnya vvodom vivodom integrovane z planuvalnikom vzhe na nizhnomu rivni zdijsnyuyetsya na osnovi podij sho dozvolyaye programi obroblyati vhidni ta vihidni dani bez zajvih blokuvan Takij pidhid vimagaye menshogo chisla vipadkiv ustanovlennya ta rozrivu z yednan a takozh pribiraye neobhidnist blokuvannya ta peremikannya kontekstu Sposib chastishe zastosovuyetsya v sistemah z yavnimi vimogami visokoyi dostupnosti ta nizkogo chasu vidguku Realizaciya podiyevo oriyentovanogo vvodu vivodu vbudovana v Erlang sistemu Ce ye perevagoyu pri proyektuvanni paralelnih dodatkiv Standartna biblioteka mistit modul io z funkciyami vvodu vivodu Taki funkciyi mistyat v sobi pobichni efekti Voni polyagayut napriklad u poyavi vivedenoyi informaciyi v konsoli abo u zapisuvanni danih u fajl na disku Napriklad funkciya io format dlya formatovanogo vivodu vivodit ryadok iz pidstanovkoyu parametriv povertayuchi u razi uspihu atom ok 1 gt io format priklad vivodu p n 1 priklad vivodu 1 ok Funkciyi modulya io peredbachayut standartnij servernij interfejs vvodu vivodu Protokol vvodu vivodu Erlang angl The Erlang I O protocol detalno viznachaye zv yazok kliyenta i servera zabezpechuye dvonapravlenij zv yazok mizh kliyentami ta serverami Server vvodu vivodu ce proces yakij obroblyaye zapiti ta vikonuye potribne zavdannya napriklad na pristroyi vvedennya vivedennya Kliyent ce bud yakij proces Erlang yakij bazhaye chitati abo pisati dani z na pristrij vvedennya vivedennya BibliotekiStandartna biblioteka moduliv Zgidno z oficijnoyu dokumentaciyeyu standartna biblioteka moduliv STDLIB ye obov yazkovoyu dlya vklyuchennya do minimalnoyi sistemi Erlang OTP razom z yadrom Erlang Biblioteka mistit moduli sho nadayut riznomanitni funkciyi dlya roboti z vbudovanimi tipami ta inshimi strukturami danih vvodu vivodu zvernennya do seredovisha dlya roboti z fajlovoyu sistemoyu procesami tosho Zgidno z oficijnoyu dokumentaciyeyu standartna biblioteka moduliv STDLIB ye obov yazkovoyu dlya vklyuchennya do minimalnoyi sistemi Erlang OTP razom z yadrom Erlang Biblioteka mistit moduli sho nadayut riznomanitni funkciyi dlya roboti z vbudovanimi tipami ta inshimi strukturami danih vvodu vivodu zvernennya do seredovisha dlya roboti z fajlovoyu sistemoyu procesami tosho Modul a rel nofollow class external text href https www erlang org doc man array array a viznachaye funkcionalnij abstraktnij tip danih dlya dinamichnogo masivu mistit funkciyi viluchennya ta onovlennya elementiv masivu rekursivni funkciyi dlya roboti z masivami Modul a rel nofollow class external text href https www erlang org doc man string string a rozshiryuye mozhlivosti modulya a rel nofollow class external text href https www erlang org doc man lists html all 2 lists a funkciyami dlya roboti bezposeredno zi spiskami simvoliv yakimi ye ryadki v movi Erlang Modul a rel nofollow class external text href https www erlang org doc man dict dict a vid angl dictionary slovnik mistit funkciyi dlya asociativnogo masivu Napriklad zberezhennya viluchennya ta vidalennya znachennya za klyuchem z yednannya masiviv tosho Modul a rel nofollow class external text href https www erlang org doc man math math a mistit matematichni funkciyi Modul a rel nofollow class external text href https www erlang org doc man random random a mistit funkciyi dlya generaciyi psevdovipadkovih chisel Modul a rel nofollow class external text href https www erlang org doc man calendar calendar a zabezpechuye obchislennya miscevogo ta universalnogo chasu dnya tizhnya ta bagatoh funkcij peretvorennya chasu Chas ye miscevim koli vin nalashtovanij vidpovidno do potochnogo chasovogo poyasu ta litnogo chasu Chas ye universalnim koli vin vidobrazhaye chas na nulovij dovgoti bez bud yakih popravok na litnij chas Modul a rel nofollow class external text href https www erlang org doc man timer timer a mistit funkciyi perevedennya intervaliv chasu do milisekund zapusku podij za tajmerom ta inshi pov yazani z chasom funkciyi Modul a rel nofollow class external text href https www erlang org doc man erlang erlang a mistit vbudovani funkciyi Erlang po zamovchuvannyu funkciyi z cogo modulya ye importovanimi v kozhen modul Modul a rel nofollow class external text href https www erlang org doc man file html file a zabezpechuye interfejs do fajlovoyi sistemi Funkciyi dlya vidkrittya zakrittya chitannya ta zapisu fajliv pereglyadu direktorij i t d Modul a rel nofollow class external text href https www erlang org doc man filelib html filelib a mistit utiliti vishogo rivnya nizh modul a rel nofollow class external text href https www erlang org doc man file html file a Cej modul ne pidtrimuye neobrobleni imena fajliv tobto fajli imena yakih ne vidpovidayut ochikuvanomu koduvannyu Taki fajli ignoruyutsya funkciyami cogo modulya Dopomizhni funkciyi dlya manipulyacij z fajlami ensure dir Name gt ok error Reason Perekonuyetsya sho vsi batkivski katalogi dlya vkazanogo fajlu abo imeni katalogu isnuyut namagayuchis stvoriti yih yaksho neobhidno Povertaye OK yaksho vsi batkivski katalogi vzhe isnuyut abo mozhut buti stvoreni Povertaye error Reason yaksho yakijs batkivskij katalog ne isnuye ta ne mozhe buti stvorenij ensure path Path gt ok error Reason Perekonuyetsya sho vsi batkivski katalogi dlya vkazanogo shlyahu Path isnuyut namagayuchis stvoriti yih yaksho neobhidno Na vidminu vid secure dir 1 cya funkciya namagatimetsya stvoriti vsi segmenti shlyahu yak katalog vklyuchayuchi ostannij segment Povertaye OK yaksho vsi batkivski katalogi vzhe isnuyut abo mozhut buti stvoreni Povertaye error Reason yaksho yakijs batkivskij katalog ne isnuye ta ne mozhe buti stvorenij Modul a rel nofollow class external text href https www erlang org doc man filename filename a mistit funkciyi dlya analizu ta obrobki imen fajliv Ci funkciyi stvoreni takim chinom shob kod Erlang mig pracyuvati na bagatoh riznih platformah iz riznimi formatami imen fajliv Nazva fajlu mozhe buti korotkoyu vidnosnoyu nazvoyu napriklad foo erl dovgoyu absolyutnoyu nazvoyu vklyuchayuchi poznachennya diska nazvoyu katalogu yak ot D usr local bin erl lib tools foo erl abo bud yakimi variaciyami mizh nimi Dopomizhni funkciyi dlya manipulyacij z fajlami absname Filename gt file filename all Peretvoryuye vidnosne im ya fajlu ta povertaye absolyutne im ya Ne robit sprob stvoriti najkorotshu absolyutnu nazvu oskilki ce mozhe dati nepravilni rezultati u fajlovih sistemah yaki dozvolyayut posilannya absname Filename Dir gt file filename all Te same sho absname 1 za vinyatkom togo sho katalog do yakogo maye buti vidnesene im ya fajlu vkazano v argumenti Dir Modul a rel nofollow class external text href https www erlang org doc man io html io a zabezpechuye interfejs do standartnih serveriv vvedennya vivedennya Erlang Usi funkciyi vivedennya povertayut OK yaksho voni uspishni abo zavershuyut robotu yaksho ce ne tak Funkciyi v comu moduli mayut dodatkovij parametr IoDevice Yaksho vin vklyuchenij ce bude pid procesu yakij obroblyaye protokoli vvedennya vivedennya Zazvichaj IoDevice yakij povertaye file open 2 Yaksho IoDevice ne vkazano vikoristovuyetsya standard io Opis protokoliv vvodu vivodu ye u rozdili Protokol vvodu vivodu Erlang u posibniku koristuvacha Modul a rel nofollow class external text href https www erlang org doc man io lib io lib a funkciyi biblioteki vvedennya vivedennya Mistit funkciyi dlya peretvorennya v i z ryadkiv spiskiv simvoliv Voni vikoristovuyutsya dlya realizaciyi funkcij v moduli io Modul a rel nofollow class external text href https www erlang org doc man crypto html crypto a zabezpechuye nabir kriptografichnih funkcij Nayavni hesh funkciyi SHA1 SHA2 Secure Hash Standard FIPS PUB 180 4 SHA3 Standard Permutation Based Hash and Extendable Output Functions FIPS PUB 202 BLAKE2 fast secure hashing MD5 Message Digest Algorithm RFC 1321 MD4 Message Digest Algorithm RFC 1320 Modul u crypto app u dodatok crypto Metoyu programi crypto ye nadannya Erlang API dlya kriptografichnih funkcij API znahoditsya na dosit nizkomu rivni i ye deyaki vidpovidni funkciyi API dostupni v public key 3 na vishomu rivni abstrakciyi yakij vikoristovuye kriptododatok u svoyij realizaciyi Potochna realizaciya kripto vikoristovuye nifs dlya interfejsu kriptobiblioteki OpenSSL i mozhe pracyuvati z obmezhenoyu funkcionalnistyu zi starimi versiyami yak OpenSSL 0 9 8c Pidtrimka rezhimu FIPS vimagaye prinajmni versiyi 1 0 1 i vstanovlennya OpenSSL iz pidtrimkoyu FIPS Rekomenduyetsya vikoristovuvati versiyu yaka oficijno pidtrimuyetsya proyektom OpenSSL API sumisni serverni moduli taki yak LibreSSL takozh povinni pracyuvati Kriptododatok shodnya testuyetsya prinajmni z odniyeyu versiyeyu OpenSSL 1 0 1 1 0 2 1 1 0 1 1 1 i 3 0 Rezhim FIPS takozh perevireno dlya 1 0 1 i 1 0 2 Vikoristannya OpenSSL 3 0 iz mehanizmami abo v rezhimi FIPS she ne pidtrimuyetsya programoyu OTP crypto Vihidni versiyi OpenSSL mozhna zavantazhiti z domashnoyi storinki proyektu OpenSSL abo z perelichenih tam sajtiv dzerkal Okrim cih najbilsh vazhlivih moduliv standartna biblioteka mistit bagato inshih z yakimi mozhna poznajomitisya za dokumentaciyeyu Tablici ETS ta DETS Dlya organizaciyi kolekcij v operativnij pam yati v Erlang ye modul ETS angl Erlang Term Storage shovishe termiv Erlang ETS mozhe zberigati chotiri vidi kolekcij mnozhina angl set vporyadkovana mnozhina angl ordered set multimnozhina angl bag multimnozhina z povtorennyami angl duplicate bag Dostup do elementiv kolekcij vidbuvayetsya klyuchovim polem kortezhu klyuchi yak i znachennya mozhut buti bud yakih tipiv Uporyadkovani mnozhini zrealizovani u viglyadi binarnih zbalansovanih AVL derev a inshi kolekciyi z vikoristannyam hesh tablic DETS tablici dopovnyuyut funkcionalnist ETS tablic za vinyatkom vporyadkovanih mnozhin dozvolyayuchi zberigati dani u fajlah Frejmvork OTP Derevo procesiv Erlang OTP angl Open Telecom Platform ye nalagodzhenim naborom korisnih povedinok angl behaviours procesiv Vin vikoristovuyetsya dlya stvorennya servernih program OTP formalizuye diyi procesiv ta dozvolyaye buduvati na yih osnovi OTP dodatki U modulyah OTR viznacheno zagalni standartizovani shabloni dlya konstruyuvannya paralelnih dodatkiv Gen server interfejsnij modul dlya realizaciyi kliyent servernoyi arhitekturi Zagalnij servernij proces gen server realizovanij za dopomogoyu cogo modulya maye standartnij nabir interfejsnih funkcij i vklyuchaye funkciyi vidstezhennya ta zvituvannya pro pomilki Vin vpisuyetsya v derevo naglyadu OTP Najpopulyarnishimi povedinkami ye uzagalnenij server ta sposterigach angl supervisor Ye j inshi povedinki kincevij avtomat obrobnik podij OTP mistit i inshe spoluchne programne zabezpechennya angl middleware napriklad SUBD OTP povedinki podilyayutsya na robochi procesi angl worker processes Sho vikonuyut vlasne obrobku zapitiv Procesi sposterigachi angl supervisors U zavdannya procesiv sposterigachiv vhodit stezhennya za robochimi procesami ta inshimi procesami sposterigachami nashadkami Dereva sposterigachiv skladayut OTP dodatok angl application Dokumentaciya Erlang viznachaye OTP dodatok komponentom yakij realizuye deyaku funkcionalnist yaka mozhe buti nezalezhno zapushena na vikonannya i zupinena yak cile a takozh povtorno vikoristana v inshih sistemah Rozrobnik programi pishe kod moduliv funkcij zvorotnogo vikliku angl call back module v yakih i znahoditsya specifichna dlya ciyeyi programi chastina funkcionalnosti Strogo kazhuchi OTP ne ye chastinoyu movi Erlang Odnak vin nastilki uvijshov u kulturu ta praktiku rozrobnikiv na Erlang sho chasom mizh nimi skladno provesti mezhu Rozrobka grafichnogo interfejsu koristuvacha Rozrobka dodatkiv z grafichnim interfejsom koristuvacha krim veb interfejsiv mozhe vestis za dopomogoyu biblioteki wxErlang biblioteki wxWidgets portovanoyi dlya Erlang V standartnu postavku Erlang OTP vhodit WxErlang WxWidgets napisanij na C tomu pered rozrobnikami wxErlang stoyalo zavdannya viraziti zasobami Erlang iyerarhiyu ob yektiv Sproshuyuchi u wxErlang klasam vidpovidayut moduli a ob yektam posilannya makrosam na C vidpovidayut makrosi Erlang Deyaki tipi danih dlya yakih u C buli vikoristani klasi podayutsya v Erlang za dopomogoyu inshih tipiv danih napriklad wxPoint zadayetsya u viglyadi kortezhu z dvoh elementiv Podiyi wxErlang mozhna obrobliti v Erlang abo cherez funkciyu zvorotnogo vikliku angl call back functions abo v bilsh prirodnomu seredovishi Erlang peredacheyu povidomlen Programuvannya na ErlangInteraktivna obolonka Interaktivna obolonka erl v okremomu vikni Interaktivna obolonka angl shell dlya Erlang mozhe buti viklikana v Unix podibnih sistemah komandoyu erl u Windows werl Obolonka dozvolyaye vvoditi virazi ta otrimuvati rezultat yih vikonannya viprobuvati novij kod zajmatisya interaktivnim nalagodzhennyam keruvati sistemoyu sho znahoditsya v promislovij ekspluataciyi tosho Takozh obolonka dozvolyaye vikoristovuvati dodatkovi funkciyi komandi dostupni tilki v nij Do prikladu komanda q zdijsnyuye vihid iz obolonki iz zavershennyam vsogo sho robit Erlang sistema V obolonci mozhna viklikati BREAK menyu za dopomogoyu Ctrl C u Unix podibnih OS abo Ctrl Break u Windows Ce menyu maye rizni komandi u tomu chisli a negajna zupinka c prodovzhennya roboti v obolonci ta inshi informacijni ta dopomizhni komandi dlya roboti z Erlang sistemoyu Kombinaciya klavish Ctrl G viklikaye she komandne menyu yakim mozhna za neobhidnosti zupiniti proces sho zavisiv obolonku i povernutisya v obolonku i i potim c Dokumentuvannya ta oformlennya kodu Sistema EDoc mozhe generuvati dokumentaciyu z vihidnogo kodu Dlya dokumentuvannya kodu modulya dostatno dodati pevnim chinom rozmichenij tekst a takozh fajl overview edoc dlya dokumentaciyi rivnya proyektu v ostannomu neobov yazkovo vikoristovuvati znaki komentarya Instrumenti dlya roboti z kodom na Erlang napriklad erlang rezhim v Emacs mayut na uvazi deyaki osoblivosti shodo vzhivannya simvoliv komentarya Komentarem vvazhayetsya tekst vid znaka vidsotka do kincya ryadka v Erlang Tak potrijnij znak vidsotka viklikaye virivnyuvannya livim krayem podvoyenij virivnyuvannya na rivni navkolishnogo kodu a odinochnij znak vidsotka vikoristovuyetsya dlya poznachennya komentarya pislya kodu v kinci ryadka Rozrobniki Erlang virobili pevni stilovi ugodi shodo organizaciyi ta oformlennya vihidnogo kodu Napriklad horoshim stilem vvazhayetsya znizhennya vkladenosti sintaksichnih struktur napisannya korotkih moduliv menshe 400 ryadkiv kodu ta funkcij ne dovshe 15 20 ryadkiv kodu vikoristannya osmislenih imen dlya zminnih ta funkcij tosho Tipi ta analiz kodu Programa Dialyzer rozroblena v ramkah proyektu HiPE Vona vhodit do standartnoyi postavki i dozvolyaye viyaviti pomilki u tomu chisli pomilki tipizaciyi shlyahom statichnogo analizu kodu Programa TypEr napisana Tobiasom Lindalom Tobias Lindahl ta Kostisom Sagonasom Kostis Sagonas ye chastinoyu Dialyzer TypEr dozvolyaye pereviryati viznachennya tipiv funkcij zviryati vkazanij u direktivi spec tip funkciyi z yiyi viznachennyam vikonati vivedennya tipiv Programa vivodit vsi tipi sho vidpovidayut uspishnomu zastosuvannyu funkciyi v zagalnomu vipadku lishe priblizno v bilsh grubij bik Vikoristannya funkciyi bud yakim inshim chinom obov yazkovo prizvede do pomilki chasu vikonannya U nastupnomu prikladi pokazanij sintaksis viznachennya tipu direktiva type ogoloshennya tipu poliv zapisu ta direktiva spec razom z viznachennyam funkciyi type user status disabled enabled status odin z dvoh atomiv record user login anon string tipi poliv zapisu password string status user status nickname string spec check password string user gt ok error string deklaraciya funkciyi check password Password User gt viznachennya funkciyi Dialyzer vid angl DIscrepancy AnaLYZer for ERlang Programs analizator superechnostej dlya Erlang program programa dlya viyavlennya v kodi okremih moduliv i v okremih dodatkah pomilok tipiv nedosyazhnogo kodu ta nadlishkovih perevirok Usi viyavleni Dialyzer defekti vimagayut usunennya bo instrument ne daye pomilkovih spracovuvan Dlya kozhnoyi funkciyi vsih moduliv sho pereviryayutsya Dialyzer vstanovlyuye tip vikoristovuyuchi zasnovanij na obmezhennyah vivid tipiv i analiz potokiv danih Pislya viznachennya tipiv funkcij provoditsya analiz protirich u programi Testuvannya profilyuvannya refaktoring Dlya modulnogo testuvannya Erlang nadaye EUnit Dlya sistemnogo testuvannya Erlang nadaye frejmvork Common Test EUnit mistit zasobi dlya opisu testiv v tomu chisli neobhidnij dlya cogo nabir makrosiv a takozh vivodit zvit po zakinchennyu testuvannya Testuvannya moduliv vidbuvayetsya shlyahom pidklyuchennya zagolovnogo fajlu z EUnit a funkciyi z testami mozhut buti yak vklyucheni v sam modul sho testuyetsya tak i vineseni v okremij modul Testuvannya paralelnih program mozhna vikonati za dopomogoyu Quviq Quick Check versiya Mini bezkoshtovno Krim testuvannya mozhna zdijsniti perevirku vsih mozhlivih variantiv vihidnih danih za dopomogoyu metodu perevirki modelej Dlya cogo ye stvorena v Madridskomu politehnichnomu universiteti utilita McErlang 1 Shob profilyuvati kod ta viyaviti stupin pokrittya kodu testami mozhna zvernutisya do moduliv eprof fprof cover ta utiliti cprof Dlya Erlang rozroblena nizka instrumentiv refaktoringu vihidnogo kodu spisok ne ye vicherpnim RefactorErl Wrangler avtomatichna nezalezhna vid IDE utilita tidier Utilita tidier dozvolyaye avtomatichno znahoditi ta viroblyati ekvivalentni peretvorennya kodu napriklad zaminyuyelists filter fun X gt is something X end L na X X lt L is something X Efektivnist Erlang maye svoyi sekreti napisannya efektivnogo kodu Udoskonalennya movi robit deyaki z tryukiv zastarilimi tomu dokumentaciya ye najkrashim posibnikom u pitannyah optimizaciyi u sukupnosti z profilyuvannyam ta Napriklad pri roboti zi spiskami ne bazhano dodavati element do kincya dovgogo spisku za dopomogoyu konkatenaciyi abo funkciyi dodavannya elementa do spisku Zate mozhna dodati element do pochatku spisku a kincevij rezultat obrobiti funkciyeyu zvernennya poryadku elementiv spisku L1 New Elem List L2 lists reverse L1 Ye svoyi rekomendaciyi i dlya pidvishennya efektivnosti paralelnih program Do prikladu diyi sho vimagayut bagato pam yati najkrashe vidilyati v okremij proces bo pri comu zmenshuyutsya vitrati na zbirannya smittya Todi pam yat shvidshe bude zvilneno pislya zavershennya procesu Erlang ta inshi movi programuvannyaIntegraciya ta gibridni movi Erlang sistema dozvolyaye vikonuvati integraciyu z sistemami na inshih movah programuvannya Ye mehanizmi dlya merezhevoyi vzayemodiyi z S Java Lisp Perl Python Ruby Do prikladu dlya efektivnishogo sinhronnogo vikliku nevelikih funkcij na C mozhna vikoristovuvati platformno zalezhni funkciyi angl NIF natively implemented function Visokorivnevi biblioteki dozvolyayut Erlang sistemi predstavlyati C abo Java vuzli yak zvichajni Erlang vuzli Inshi movi mozhna pov yazati z seredovishem vikonannya Erlang za dopomogoyu drajveriv abo merezhevih soketiv za dopomogoyu protokoliv na kshtalt HTTP SNMP IIOP Do prikladu Ruby vzayemodiye z Erlang za dopomogoyu paketa erlectricity a dlya Python rozroblena realizaciya Erlang vuzla u viglyadi paketu py interface Virtualna mashina Erlang znahodit zastosuvannya i v inshih movah programuvannya Do prikladu Elixir ta proyekt Erl2 Dzho Armstronga Krim togo Robert Virding pidtrimuye proyekt Lisp Flavored Erlang Erlang pripravlenij Lispom u yakomu sintaksis Lispa vikoristovuyetsya z kompilyatorom Erlang Ye j inshi BEAM movi Efene Joxa Reia Luerl Erlog Na oficijnomu sajti movi ye zgadka proyekt pro Erjang v yakomu vikoristovuyetsya virtualna mashina Java Porivnyannya Erlang ta C za produktivnistyu Praktika pokazuye sho dlya vivchenih telekomunikacijnih dodatkiv kod na Erlang buv na 70 85 korotshim nizh na C a produktivnist sistemi pri perepisuvanni kodu z C na Erlang zrosla majzhe na 100 Dlya odnogo iz vikoristanih u doslidzhenni proyektiv riznicya bula poyasnena napisannyam dodatkovogo C kodu v ramkah zahisnogo programuvannya upravlinnya pam yattyu ta kodu dlya visokorivnevoyi komunikaciyi tobto mozhlivostyami yaki ye chastinoyu movi Erlang ta bibliotek OTP Porivnyannya vzayemodiyi procesiv u Erlang ta Go Vpliv teoriyi poslidovnih procesiv sho vzayemodiyut Charlza E Hoara vidchuvayetsya yak u Go tak i v Erlang Erlang i Go Spilne procesi vidpravlyayut odne odnomu povidomlennya Vidminne V Erlang ce vidbuvayetsya bezposeredno V Go za dopomogoyu kanaliv angl channels Ci kanali mayut tipi Organizaciya vzayemodiyi z povidomlennyami U Erlang nemaye tipizaciyi chasu kompilyaciyi za vinyatkom ohoronnih viraziv sho dozvolyaye posilati procesam povidomlennya bud yakogo tipu Nezrozumile povidomlennya bude proignorovano abo nazavzhdi zalishitsya v cherzi Go dozvolyaye legko organizuvati grupu go program angl goroutine natyak na angl co routine spivprograma dlya otrimannya povidomlen z deyakogo kanalu takij pidhid vidomij yak Realizaciya robochogo pulu V Erlang pri proyektuvanni yakogo pridilyalasya osobliva uvaga ta chasu zatrimki angl latency realizaciya robochogo pulu mozhliva ale potrebuye dodatkovih zusil Chislenni vidpravniki trivialno realizuyutsya v oboh movah Erlang proces mozhe nadislati povidomlennya i chekati na nogo vidpovid vidpovidno do deyakogo zrazka ignoruyuchi inshi povidomlennya v cherzi V Go take nemozhlivo ale podibna funkcionalnist mozhe buti dosyagnuta stvorennyam u tomu chisli dinamichnim novih vvodiv tobto podilom kanaliv za priznachennyam Rozdilennya mizh procesami V Erlang vidsutnij stan sho rozdilyayetsya mizh procesami angl shared mutable state i tomu izolovanij proces duzhe ridko predstavlyaye interes Go vimagaye yavnoyi vkazivki togo yaki go programi budut vzayemodiyati z inshimi peredacheyu povidomlen Abstrakciyi vzayemodiyuchih procesiv shozhi v Erlang i Go Shob uniknuti pomilok pri perehodi z odniyeyi movi na inshu slid vrahovuvati tonkoshi i osoblivosti oboh mov shabloni yaki horoshi v odnij movi mozhut ne pidhoditi dlya inshoyi KritikaV Erlang ye nedoliki Nedoliki sintaksisu simvol zakinchennya virazu zalezhit vid kontekstu ce abo simvoli abo Ce vimagaye dodatkovoyi uvagi pri zmini miscya virazu Nadlishkove bagatosliv ya zapisiv record Zavzhdi potribno propisuvati povnij perelik alternativ abo vkazati ostannoyu klozoyu true v if virazi dlya uniknennya vidachi vinyatku yaksho ni odna z umov ne vikonuyetsya Suvoro obmezhenij nabir funkcij yaki mozhna vikoristovuvati v if virazah cej nedolik mozhna ominuti vikoristannyam case viraziv Funkcionalnij stil i nezminyuvani zminni prizvodyat u deyakih dodatkah napriklad testi do bilshoyi kilkosti pravok nizh v inshih movah programuvannya tak yak vstavka deyakoyi promizhnoyi obrobki mozhe vimagati novih imen zminnih sho mozhe prizvesti do zmin u kodi nastupnogo dali za tekstom Z nedolikiv sistemi tipiv mozhna vkazati vidsutnist ryadkovogo tipu i nemozhlivist dinamichno dodavati u zapisi novi chleni Isnuyut problemi z organizaciyeyu vihidnogo kodu yaka mozhliva tilki cherez stvorennya novogo fajlu Vidsutnist prostoriv imen klasiv abo inshih zasobiv dlya organizaciyi kodu Riven yakosti moduliv za vinyatkom osnovnih ta dokumentaciyi ye daleko ne najkrashim Dzho Armstrong odin z tvorciv movi u svoyemu vistupi na konferenciyi z istoriyi mov programuvannya v 2007 roci pererahuvav spisok zon zrostannya dlya movi Vikoristannya zbirannya smittya dlya atomiv Polipshennya zasobiv spoluchennya iz zovnishnim kodom angl foreign code Posilennya izolyaciyi mizh procesami Bilsh viborcha sistema bezpeki sered vuzliv Erlang zasnovana na riznomu stupeni doviri Okremi poznachennya dlya protokoliv ta sistem Moduli mayut buti ob yektami pershogo klasu Masove poshirennya Erlang mozhe strimuvati nezvichnij dlya bilshosti programistiv sintaksis vikoristannya funkcionalnoyi paradigmi a takozh te sho najkrasha na 2022 rik realizaciya movi vikoristovuye virtualnu mashinu BEAM a ne bilsh poshirenu JVM Sfera zastosuvannya Tipova arhitektura sistemi yaka vikoristovuye Erlang OTP Programi Erlang koristuyutsya sluzhbami Mnesia SASL agentami SNMP monitoringu ta inshimi na bazi frejmvorku OTP yakij u svoyu chergu vikoristovuye ERTS Programi inshih sistem programuvannya pidtrimuyutsya menshoyu miroyu Erlang pidhodit dlya Stvorennya merezhevih serveriv rozpodilenih sistem program z GUI ta podibnih do nih interaktivnih program Stvorennya instrumentiv dlya testuvannya upravlinnya ta stezhennya Stvorennya dodatkiv z neregulyarnim paralelizmom u yakih rozparalelyuvani zavdannya dosit riznomanitni Erlang pogano pidhodit dlya Napisannya kodu sho mistit intensivni obchislennya z plavayuchoyu komoyu yakij vimagaye vklyuchennya nativnogo kodu konkretnoyi platformi chi silnoyi optimizaciyi i dlya stvorennya dodatkiv yaki potrebuyut sinhronnogo vikonannya zavdan Dlya proyektiv v yakih kod povinen vikonuvatisya na JVM abo CLR abo proyektiv sho vimagayut bezlichi bibliotek z inshih sistem programuvannya Krim togo Erlang stav zastosovuvatisya dlya Rozrobki sistem hmari she do togo yak sformuvalosya same ponyattya hmarnih obchislen Vikoristovuyetsya v masshtabnih telekomunikacijnih ta Internet dodatkah bagatma kompaniyami vklyuchayuchi Amazon EC2 z realizaciyeyu SimpleDB Servis socialnih zakladok Delicious Facebook bekend dlya chatu zroblenij na Erlang T Mobile servis SMS ta sistemi autentifikaciyi 46 Serverne programne zabezpechennya WhatsApp napisane na Erlang U sichni 2012 roku serveri WhatsApp pid FreeBSD z 96 GB operativnoyi pam yati zmogli obroblyati vid 1 do 2 8 miljoniv z yednan Erlang chasto stavlyat u zaslugu legendarnu nadijnist ATM komutatora AXD301 u merezhi Za danimi Ericsson z sichnya 2002 roku za dekilka rokiv trapilasya lishe odna neznachna nespravnist na pidstavi chogo nadijnist sistemi zgidno z rozrahunkami bula 99 9999999 Hocha bilsh realni ocinki sho vrahovuyut bagato inshih faktoriv govoryat vse taki pro p yat dev yatok uspih marshrutizatora pov yazuyut z dostupnimi zasobami rozrobki nadijnih paralelnih obchislen vbudovanimi v Erlang She Erlang vikoristovuyetsya v dodatkah z vidkritim vihidnim kodom napriklad CouchDB dokumentooriyentovana BD z REST interfejsom Disco frejmvork dlya rozpodilenih obchislen na osnovi paradigmi MapReduce Ejabberd vilnij GNU GPL rozpodilenij ta vidmovostijkij Jabber server napisanij na Erlang RabbitMQ platforma oriyentovana na obrobku povidomlen realizuye AMQP MQTT Wings 3D programa 3D modelyuvannya Dlya Erlang bulo napisano dekilka veb serveriv Cowboy Yaws angl Yet Another Web Server biblioteka dlya stvorennya HTTP serveriv She buli stvoreni dekilka veb frejmvorkiv i sistem upravlinnya vmistom takih yak N2O Zotonic BeepBeep Erlang Web ErlyWeb Novaframework Sered vidomogo programnogo zabezpechennya napisanogo Erlang yake ne uvijshlo v kategoriyi vishe vidilyayut Rozpodilenu NoSQL bazu danih Riak yaka sproyektovana za principami Amazon DynamoDB ranishe vidomij yak videostrimingovij server sho pidtrimuye dekilka protokoliv Krim togo napisanij na Erlang instrument Tsung yakij dozvolyaye emulyuvati tisyachi za dostatnoyi kilkosti testovih serveriv miljoni odnochasnih koristuvachiv zastosovuyetsya u stres testuvannyah rozpodilenih sistem Erlang pidhodit dlya zavdan shtuchnogo intelektu osoblivo obchislyuvalnogo intelektu nejroevolyuciyi zasnovanih na nejronnih merezhah Take zastosuvannya mozhlive zavdyaki p yatom klyuchovimi vlastivostyami movi programuvannya nejronnih merezh sho ye u Erlang izolovani procesi nejroni angl encapsulation paralelizm angl concurrency odnochasnist mehanizm viyavlennya zboyiv nezalezhnist vid roztashuvannya angl location transparency garyacha zamina kodu Prikladom takogo zastosuvannya ye realizaciya odnogo z pidhodiv do nejroevolyuciyi DXNN Spilnota Navkolo tehnologij Erlang utvorilas spilnota rozrobnikiv yaka pidtrimuye novachkiv Vihidnij kod Erlang dostupnij cherez servis spilnoyi rozrobki GitHub Rozrobniki ta koristuvachi Erlang mozhut spilkuvatisya cherez spisok rozsilki Erlang questions pitannya Erlang abo na IRC kanali erlang na Erlang Factory vlashtovuye u vsomu sviti zahodi ta konferenciyi sered yakih konferenciya koristuvachiv Erlang Erlang User Conference Specialna grupa SIGPLAN ACM regulyarno provodit Erlang majsternyu Erlang Workshop a konferenciya vklyuchaye sekciyu z Erlang V Ukrayini Erlang spilnota porivnyano nevelika Div takozh erl Elixir mova programuvannya VinoskiThe erlang Open Source Project on Open Hub Languages Page 2006 d Track Q124688 Nordstrom Bengt 1981 Programming in Constructive Set Theory Proceedings of the 1981 conference on Functional programming languages and computer architecture FPCA 81 ACM Press doi 10 1145 800223 806773 Procitovano 16 serpnya 2022 Nachala raboty s Erlang 2013 11 22 u Wayback Machine ros Armstrong Joe 2007 History of Erlang HOPL III Proceedings of the third ACM SIGPLAN conference on History of programming languages anglijska ISBN ISBN 978 1 59593 766 7 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Perevirte znachennya isbn nedijsnij simvol dovidka Erlang org http erlang org course history html anglijska Dacker Bjarne 2000 Concurrent Functional Programming for Telecommunications A Case Study of Technology Introduction anglijska Royal Institute of Technology s 37 Fredlund Lars Ake 2012 Erlang a platform for developing distributed software systems anglijska Madrid Universidad Politecnica de Madrid Cesarini Francesco 2009 Erlang Programming anglijska O Reilly Media Inc s 498 ISBN ISBN 978 0 596 51818 9 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Perevirte znachennya isbn nedijsnij simvol dovidka St Laurent Simon 2013 Introducing Erlang anglijska O Reilly Media Inc s 185 ISBN ISBN 978 1 449 33176 4 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Perevirte znachennya isbn nedijsnij simvol dovidka Verraes Mathias 9 grudnya 2014 Let It Crash Mathias Verraes Blog angl Procitovano 11 zhovtnya 2022 Tate Bruce A 2010 Seven Languages in Seven Weeks A Pragmatic Guide to Learning Programming Languages anglijska Pragmatic Bookshelf Armstrong Dacker Lindgren Millroth Erlang product team at Ericsson 2013 http ftp sunet se pub lang erlang white paper html anglijska Ericsson AB a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a archive url vimagaye archive date dovidka Hebert Fred 2013 Learn You Some Erlang for Great Good A Beginner s Guide anglijska No Starch Press s 624 ISBN ISBN 978 1593274351 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Perevirte znachennya isbn nedijsnij simvol dovidka math STDLIB Reference Manual Version 1 19 3 https www erlang org doc man math html anglijska Martin Logan et al 2011 s 31 32 Erlang OTP 25 0 4 https www erlang org doc Anglijska Procitovano 25 serpnya 2022 Logan Merritt Carlsson Martin Eric Richard 2011 Erlang and OTP in Action Manning s 397 ISBN ISBN 9781933988788 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Perevirte znachennya isbn nedijsnij simvol dovidka Data Types Erlang Reference Manual User s Guide Version 5 10 3 http www erlang org doc reference manual data types html anglijska Ericsson AB 2013 anglijska Ericsson AB 2013 Arhiv originalu za 3 grudnya 2013 Procitovano 16 serpnya 2022 Kessin Zachary 2012 Building Web Applications with Erlang Anglijska O Reilly Media Inc s 156 p ISBN ISBN 978 1 4493 0996 1 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Perevirte znachennya isbn nedijsnij simvol dovidka Syntax in functions Learn You Some Erlang for Great Good learnyousomeerlang com Procitovano 10 veresnya 2022 The Preprocessor Predefined Macros Erlang Reference Manual User s Guide Version 5 10 3 anglijska Ericsson AB 2013 Hebert 2013 Modules Martin Logan et al 2011 s 75 The Erlang I O protocol STDLIB User s Guide Version 1 19 4 anglijska Ericsson AB 24 grudnya 2013 STDLIB STDLIB Reference Manual Version 1 19 3 angl Ericsson AB 2013 originalu za 7 listopada 2013 Procitovano 1 grudnya 2013 Erlang gen server www erlang org Procitovano 16 veresnya 2022 Erlang supervisor www erlang org Procitovano 16 veresnya 2022 Erlang gen statem www erlang org Procitovano 16 veresnya 2022 application Kernel Reference Manual Version 2 16 3 https www erlang org doc apps kernel application html anglijska Ericsson AB 1 listopada 2013 Procitovano 2013 Klas Eriksson M Williams J Armstrong 2 grudnya 2013 http erlang se doc programming rules shtml anglijska Ericsson AB Arhiv originalu za 30 listopada 2013 Procitovano 16 serpnya 2022 Aronis Stavros and Papaspyrou Nikolaos and Roukounaki Katerina and Sagonas Konstantinos and Tsiouris Yiannis and Venetis Ioannis E 2012 A Scalability Benchmark Suite for Erlang OTP anglijska Copenhagen Denmark ACM Proceedings of the Eleventh ACM SIGPLAN Workshop on Erlang Workshop Erlang 12 s pp 33 42 ISBN 978 1 59593 766 7 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a pages maye zajvij tekst dovidka Perevirte znachennya isbn nedijsnij simvol dovidka Avgerinos Thanassis and Sagonas Konstantinos 2009 Cleaning Up Erlang Code is a Dirty Job but Somebody s Gotta Do It anglijska Edinburgh Scotland Proceedings of the 8th ACM SIGPLAN Workshop on ERLANG ACM a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Nedijsnij deadurl a rel nofollow class external free href https dl acm org doi 10 1145 1596600 1596602 https dl acm org doi 10 1145 1596600 1596602 a dovidka Lisp Flavored Erlang https lfe github io anglijska Why I m stopping work on Reia http www unlimitednovelty com 2011 06 why im stopping work on reia html anglijska JUNE 29 2011 Federico Carrone et al Spawned Shelter http spawnedshelter com Anglijska 15 veresnya 2013 Nystrom Trinder King 2008 David Chisnall 14 listopada 2011 A Tale of Two Concurrency Models Comparing the Go and Erlang Programming Languages angl Pearson Education Informit originalu za 3 grudnya 2013 Procitovano 1 grudnya 2013 Chisnall David 14 listopada 2011 A Tale of Two Concurrency Models Comparing the Go and Erlang Programming Languages https www informit com articles anglijska Procitovano 1 grudnya 2013 Katz Damien 9 bereznya 2008 What Sucks About Erlang http damienkatz net 2008 03 what sucks about html angl originalu za 5 grudnya 2013 Procitovano 24 listopada 2013 Armstrong A History of Erlang 2007 6 19 6 20 Tate 2010 s 221 Dan McCreary Ann Kelly 2013 Larson Erlang for Concurrent Programming 2008 Robota z velikimi obsyagami danih v hmari za dopomogoyu MapReduce anglijska IBM 1 bereznya 2012 originalu za 11 grudnya 2013 Procitovano 7 grudnya 2013 Ericsson ta 4 December 2014 Ericsson Ericsson com 4 December 2014 Retrieved 7 April 2018 Scaling to Millions of Simultaneous Connections Arhivna kopiya na sajti Wayback Machine Rick Reed WhatsApp Erlang Factory SF March 30 2012 1 million is so 2011 Arhivna kopiya na sajti Wayback Machine WhatsApp Blog January 6 2012 Tompson 2012 s 33 http discoproject org 1 bereznya 2012 Robota z velikimi obsyagami danih v hmari za dopomogoyu Map Reduce http discoproject org Anglijska originalu za 11 grudnya 2013 Procitovano 7 grudnya 2013 Disco storinka proyektu http discoproject org originalu za 16 veresnya 2010 Procitovano 7 grudnya 2013 Pivotal Software Inc RabbitMQ MQTT Adapter originalu za 1 grudnya 2015 Procitovano 10 grudnya 2015 Tompson 2012 s 23 25 Cowboy Nine Nines 15 veresnya 2022 procitovano 16 veresnya 2022 Martin Brown 2013 Introduction to programming in Erlang Part 2 Use advanced features and functionality angl IBM originalu za 3 grudnya 2013 Procitovano 1 grudnya 2013 N2O originalu za 18 serpnya 2015 Procitovano 13 grudnya 2014 Zachary Kessin 2012 s 121 123 Novaframework https github com novaframework nova anglijska 24 travnya 2022 Procitovano 22 08 2022 Simon St Laurent 2013 s 167 Flussonic live streaming software originalu za 16 chervnya 2012 Procitovano 7 travnya 2012 Bradley Holt Chapter 6 Distributed Load Testing Scaling CouchDB O Reilly Media Inc 2011 P 39 ISBN 978 1 4493 0343 3 Sher 2013 s 144 150 Chapter 5 The Unintentional Neural Network Programming Language Simon St Laurent 2013 s 168 169 Posilannyahttp www erlang org realizaciya z vidkritimi vihidnimi tekstami 13 chervnya 2006 u Wayback Machine http groups google com group erlang in ukraine grupa ukrayinomovnoyi Erlang spilnoti https archive today 20030224125715 http www erlang projects org repozitorij proyektiv na Erlang Comprehensive Erlang Archive Network repozitorij proyektiv na Erlang forum viki rishennya pidruchniki dovidkovi materiali http erlide sourceforge net plagin dlya seredovisha rozrobki Eclipse 5 veresnya 2007 u Wayback Machine z pidtrimkoyu movi Erlang http www learnyousomeerlang com anglomovnij onlajn pidruchnik z programuvannya movoyu Erlang 8 kvitnya 2022 u Wayback Machine 2007 Programming Erlang Software for a Concurrent World Pragmatic Bookshelf ISBN 978 1934356005 2013 Programming Erlang Software for a Concurrent World Second edition Pragmatic Bookshelf ISBN 978 1937785536 Ce nezavershena stattya pro movi programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi