Эрланг (бағдарламалау тілі) - Erlang (programming language)

Эрланг
Erlang logo.svg
ПарадигмаларМультипарадигма: қатарлас, функционалды
Жобалаған
ӘзірлеушіЭриксон
Бірінші пайда болды1986; 34 жыл бұрын (1986)
Тұрақты шығарылым
23.1.1[1] / 2 қазан 2020; 55 күн бұрын (2020-10-02)
Пәнді теруДинамикалық, күшті
ЛицензияApache лицензиясы 2.0
Файл атауының кеңейтімдері.erl, .hrl
Веб-сайтwww.erlang.org
Майор іске асыру
Эрланг
Әсер еткен
Лисп, PLEX,[2] Пролог, Smalltalk
Әсер етті
Акка, Clojure[дәйексөз қажет ], Дарт, Эликсир, F #, Опа, Oz, Reia, Тот, Скала

Эрланг (/ˈ.rлæŋ/ UR-тіл ) Бұл жалпы мақсат, қатарлас, функционалды бағдарламалау тілі және а қоқыс жұмыс уақыты жүйесі. Erlang термині Erlang / OTP немесе ретінде қолданылады Телеком платформасын ашыңыз (OTP), ол Эрлангтан тұрады жұмыс уақыты жүйесі, негізінен Erlang тілінде жазылған бірнеше қолдануға дайын компоненттер (OTP) және жиынтығы жобалау принциптері Erlang бағдарламаларына арналған.[3]

Эрланг жұмыс уақыты жүйесі келесі белгілері бар жүйелерге арналған:

Эрланг бағдарламалау тілі бар өзгермейтін деректер, үлгілерді сәйкестендіру, және функционалды бағдарламалау.[5] Erlang тілінің дәйекті ішкі жиыны қолдайды асыға бағалау, жалғыз тапсырма, және динамикалық теру.

Бұл бастапқыда болған меншікті бағдарламалық жасақтама ішінде Эриксон, әзірлеген Джо Армстронг, Роберт Вирдинг және Майк Уильямс, 1986 ж.[6] ретінде шығарылды ақысыз және бастапқы көзі ашық бағдарламалық жасақтама 1998 ж.[7][8] Erlang / OTP қызметін Open Telecom Platform (OTP) өнімі қолдайды және қолдайды Эриксон.

Тарих

Аты ЭрлангБьярн Деккерге тиесілі телефон байланыстырғыштарында жұмыс жасайтындар (олар үшін тіл жасалды) дат математигі мен инженері үшін сілтеме деп болжады. Agner Krarup Erlang және а аббревиатура «Эриксон тілі».[6][9][түсіндіру қажет ] Эрланг телефония қосымшаларының дамуын жақсарту мақсатында жасалған.[дәйексөз қажет ] Erlang бағдарламасының бастапқы нұсқасы іске асырылды Пролог және бағдарламалау тілі әсер етті PLEX бұрынғы Ericsson биржаларында қолданылған. 1988 жылға қарай Эрланг телефон станцияларының прототипін жасауға жарамды екенін дәлелдеді, бірақ Prolog аудармашысы тым баяу болды. Ericsson ішіндегі бір топ өндірісті пайдалануға жарамды болу үшін 40 есе жылдамырақ болу керек деп есептеді. 1992 жылы жұмыс басталды Сәуле Erlang мен C-ді компиляциялайтын виртуалды машина (VM) бұрандалы код өнімділік пен дискілік кеңістік арасындағы тепе-теңдікті сақтау.[10] Армстронгтың айтуы бойынша, тіл зертханалық өнімнен нақты буынға айналды, ол кейінгі буын құлағаннан кейін AX телефон станциясы аталған AX-N 1995 жылы. Нәтижесінде келесіге Эрланг таңдалды асинхронды тасымалдау режимі (Банкомат) айырбастау AXD.[6]

1998 жылы Ericsson миллионнан астам Erlang линиясын қамтитын AXD301 ауыстырып-қосқышын жариялады және a-ға қол жеткізгені туралы хабарлады жоғары қол жетімділік туралы тоғыз «9».[11] Осыдан кейін көп ұзамай, Ericsson радио жүйелері патенттелмеген тілдерге басымдық беруін ескере отырып, Erlang-ді жаңа өнімдерге арналған үйде пайдалануға тыйым салды. Тыйым Армстронг пен басқалардың Эриксоннан кетуіне себеп болды.[12] Іске асыру жыл соңында ашық болды.[6] Ақыры Эриксон тыйымды алып тастап, 2004 жылы Армстронгты жұмысқа қабылдады.[12]

2006 жылы, туған симметриялық мультипроцесс жұмыс уақыты жүйесіне және VM-ге қолдау қосылды.[6]

Процестер

Джо Армстронг, Эрлангтың бірлескен өнертапқышы өзінің процестерінің принциптерін қорытындылады PhD докторы тезис:[13]

  • Барлығы процесс.
  • Процестер қатты оқшауланған.
  • Процесті құру және жою жеңіл операция.
  • Хабарлама жіберу - бұл процестердің өзара әрекеттесуінің жалғыз жолы.
  • Процестердің ерекше атаулары бар.
  • Егер сіз процестің атауын білсеңіз, оған хабарлама жібере аласыз.
  • Процестер ресурстарды бөліспейді.
  • Қате өңдеу жергілікті емес.
  • Процестер не істеу керек немесе сәтсіздікке ұшырайды.

Джо Армстронг 2013 жылы Rackspace-ке берген сұхбатында: «Егер Java бұл 'бір рет жаз, кез келген жерге жүгір ', содан кейін Эрланг' бір рет жаз, мәңгілікке жүгір '.[14]

Пайдалану

2014 жылы, Эриксон Erlang өзінің қолдау түйіндерінде қолданылған және GPRS, 3G және LTE бүкіл әлем бойынша және сонымен бірге Нортель және T-Mobile.[15]

Қалай Тим Брэй, веб-технологиялар директоры Sun Microsystems, өзінің негізгі баяндамасында көрсетілген O'Reilly ашық көзі туралы конвенция (OSCON) 2008 жылғы шілдеде:

Егер маған біреу келіп, маған үнемі үлкен көлемдегі хабарламаларды өңдеу жүйесін құру үшін көп ақша төлегісі келсе, ешқашан бірнеше жыл қатарынан түсіп кете алмайтын болса, мен бұлжытпай Эрлангты таңдаған болар едім оны салу.

Эрланг - кодтау үшін қолданылатын бағдарламалау тілі WhatsApp.[16]

Ашық көз ретінде шығарылғаннан бастап, Erlang телекомдардан тыс дамып, өзін FinTech, Gaming, Healthcare, Automotive, IoT және Blockchain сияқты басқа вертикальдарда дамыта бастады. WhatsApp-тан басқа Erlang компаниясының сәттілік тарихы деп аталған басқа компаниялар бар: Дауыстық сілтеме (MasterCard компаниясы), Goldman Sachs, Нинтендо, AdRoll, Гриндр, BT Mobile, Samsung, OpenX, SITA.[17][18]

Бағдарламалаудың функционалды мысалдары

Факторлық

A факторлық Erlang-да жүзеге асырылған алгоритм:

-модуль(факт). % Бұл 'fact.erl' файлы, модуль мен файл атауы сәйкес келуі керек-экспорт([бет/1]). % Бұл «fac» функциясын 1 экспорттайды (1 параметр, түрі жоқ, аты жоқ)бет(0) -> 1; % Егер 0 болса, онда 1 мәнін қайтарыңыз, әйтпесе (үтір үтірін ескеріңіз; «басқасы» дегенді білдіреді)бет(N) қашан N > 0, бүтін сан(N) -> N * бет(N-1).% Рекурсивті түрде анықтаңыз, содан кейін нәтижені қайтарыңыз% (периодты ескеріңіз. 'endif' немесе 'function end' мағынасын білдіреді)%% Бұл теріс емес бүтін саннан басқа нәрсе берілсе бұзылады.%% Бұл Эрлангтың «апатқа ұшырасын» философиясын бейнелейді.

Фибоначчи тізбегі

Өндіретін құйрықты рекурсивті алгоритм Фибоначчи тізбегі:

%% модуль декларациясы «series.erl» файл атауымен сәйкес келуі керек -модуль(серия).%% Экспорттық мәлімдемеде барлық осы функциялардың тізімі бар%% модульдің жалпы API. Бұл жағдайда бұл модуль жалғызды шығарады%% функциясы фиб деп аталады, ол 1 аргумент алады (мысалы, 1 аритияға ие)%% -export үшін жалпы синтаксис дегеніміз жәнеӘрбір қоғамдық функцияның %% қуаттылығы-экспорт([фиб/1]).%% ---------------------------------------------------------------------%% Public API%% ---------------------------------------------------------------------%% фиб / 1 нақты мәндерді алатын жағдайларды өңдеу%% Осы функционалды қолтаңбаларды жариялау тәртібі өте маңыздыОсы модульдің %% бөлігі%% Егер фиб / 1 дәл 0 санымен берілсе, онда 0 мәнін қайтарыңызфиб(0) -> 0;%% Егер фиб / 1 теріс сан алса, онда атомды қайтарыңыз err_neg_val%% Әдетте мұндай қорғаныстық кодтау Эрлангтың 'Let%% бұл апат философиясы; дегенмен, бұл жағдайда біз анық айтуымыз керек%% Erlang жұмыс істейтін қозғалтқышы бұзылатын жағдайдың алдын аладыфиб(N) қашан N < 0 -> қате_нег_ мән;%% Егер бүтін сан 3-тен кем болса, онда 1 мәнін қайтарыңыз%% Алдыңғы екі функционалды қолтаңба N <1,%%, сондықтан бұл функция қолтаңбасы N = 1 немесе N = 2 болатын жағдайларды өңдейдіфиб(N) қашан N < 3 -> 1;%% Барлық мәндер үшін орындау үшін fib_int / 3 жеке функциясын шақырыңыз%% есептеуфиб(N) -> fib_int(N, 0, 1).%% ---------------------------------------------------------------------%% жеке API%% ---------------------------------------------------------------------%% Егер fib_int / 3 бірінші аргумент ретінде 1 алса, бітті, солай%% B аргументіндегі мәнді қайтарады, өйткені бізЕкінші аргументтің %% мәні, мұны а-ны көрсету үшін _ арқылы белгілейміз%% мәні «маңызды емес»fib_int(1, _, B) -> B;%% Барлық басқа аргументтер үшін fib_int / 3 рекурсивті қоңырау шалыңыз%%, мұнда әр қоңырау келесі әрекеттерді орындайды:%% - азайту есептегіші N%% - В аргументіндегі алдыңғы фибоначчи мәнін алып, оны келесі түрде беріңіз%% аргумент A%% - Ағымдағы фибоначчи санының мәнін есептеп шығарыңыз%% аргумент ретінде Bfib_int(N, A, B) -> fib_int(N-1, B, A+B).

Міне, дәл сол бағдарлама түсіндірмелі пікірлерсіз:

-модуль(серия).-экспорт([фиб/1]).фиб(0) -> 0;фиб(N) қашан N < 0 -> қате_нег_ мән;фиб(N) қашан N < 3 -> 1;фиб(N) -> fib_int(N, 0, 1).fib_int(1, _, B) -> B;fib_int(N, A, B) -> fib_int(N-1, B, A+B).

Quicksort

Quicksort пайдаланып, Эрлангта тізімді түсіну:[19]

%% qsort: qsort (Тізім)%% Элементтер тізімін сұрыптаңыз-модуль(qsort).     % Бұл 'qsort.erl' файлы-экспорт([qsort/1]). % Qsort функциясы 1 параметрмен экспортталады (түрі жоқ, аты жоқ)qsort([]) -> []; Егер тізім [] бос болса, бос тізімді қайтарыңыз (сұрыптауға ештеңе жоқ)qsort([Жиынтық|Демалыңыз]) ->    'Pivot' дейін болуы керек барлық элементтер үшін 'Front' бар тізімді рекурсивті түрде жасаңыз    % содан кейін 'Pivot', содан кейін 'Pivot' кейін болуы керек барлық элементтер үшін 'Кері'    qsort([Алдыңғы || Алдыңғы <- Демалыңыз, Алдыңғы < Жиынтық]) ++     [Жиынтық] ++    qsort([Артқа || Артқа <- Демалыңыз, Артқа >= Жиынтық]).

Жоғарыда келтірілген мысал функцияны рекурсивті түрде шақырады qsort ештеңе сұрыпталмағанға дейін. Өрнек [Алдыңғы || Алдыңғы <- Демалыс, алдыңғы <жиынтық] Бұл тізімді түсіну, мағынасы «Элементтер тізімін құрыңыз Алдыңғы осындай Алдыңғы мүшесі болып табылады Демалыңыз, және Алдыңғы аз Жиынтық." ++ тізбекті біріктіру операторы болып табылады.

Салыстыру функциясын оқылым үшін күрделі құрылымдар үшін пайдалануға болады.

Келесі код тізімдерді ұзындығына қарай сұрыптайды:

% Бұл 'listsort.erl' файлы (компилятор осылай жасалған)-модуль(тізімдер).1 параметрмен экспорттау 'by_length' (түрі мен аты маңызды емес)-экспорт([ұзындық/1]).ұзындық(Тізімдер) -> 'Qsort / 2' пайдаланыңыз және параметр ретінде анонимді функцияны қамтамасыз етіңіз   qsort(Тізімдер, көңілді(A,B) -> ұзындығы(A) < ұзындығы(B) Соңы).qsort([], _)-> []; Егер тізім бос болса, бос тізімді қайтарыңыз (екінші параметрді елемеңіз)qsort([Жиынтық|Демалыңыз], Кішірек) ->    % Кішкентай емес элементтердің 'Pivot' алдындағы 'кіші' элементтері бар бөлімдер тізімі    «Жиынтықтан» кейін% және қосалқы тізімдерді сұрыптаңыз.    qsort([X || X <- Демалыңыз, Кішірек(X,Жиынтық)], Кішірек)    ++ [Жиынтық] ++    qsort([Y || Y <- Демалыңыз, емес(Кішірек(Y, Жиынтық))], Кішірек).

A Жиынтық берілген бірінші параметрден алынады qsort () және қалғаны Тізімдер деп аталады Демалыңыз. Өрнекке назар аударыңыз

[X || X <- Демалыңыз, Кішірек(X,Жиынтық)]

формасы жағынан ерекшеленбейді

[Алдыңғы || Алдыңғы <- Демалыңыз, Алдыңғы < Жиынтық]

(алдыңғы мысалда) соңғы бөлікте салыстыру функциясын қолдануды қоспағанда, «Элементтер тізімін құрыңыз X осындай X мүшесі болып табылады Демалыңыз, және Кішірек дұрыс », с Кішірек бұрын анықталатын

көңілді(A,B) -> ұзындығы(A) < ұзындығы(B) Соңы

The жасырын функция деп аталады Кішірек параметрінің екінші анықтамасының тізімінде qsort сол функцияға осы атпен сілтеме жасалуы үшін. Бұл бірінші анықтамада аталмаған qsort, ол бос тізімнің негізгі регистрімен айналысады және осылайша бұл функцияға ат қоюды қажет етпейді.

Мәліметтер түрлері

Эрлангтың сегіз қарабайырлығы бар деректер түрлері:

Бүтін сандар
Бүтін сандар ондық цифрлар тізбегі түрінде жазылады, мысалы, 12, 12375 және -23427 бүтін сандар. Бүтін арифметика дәл және тек құрылғыдағы қол жетімді жадпен шектеледі. (Бұл деп аталады арифметика.)
Атомдар
Атомдар бағдарламада ерекше мәндерді белгілеу үшін қолданылады. Олар тізбектелген әріптік-цифрлық жолдар түрінде жазылады, бірінші символ кіші әріппен жазылады. Атомдар кез-келген таңбаны қамтуы мүмкін, егер олар бір тырнақшаға алынған болса және кез-келген таңбаны атом ішінде пайдалануға мүмкіндік беретін қашу конвенциясы болса. Атомдар ешқашан қоқыс болып жиналмайды және оларды абайлап пайдалану керек, әсіресе динамикалық генерацияны қолданған жағдайда.
Жүзу
Жылжымалы нүктелер сандарын пайдаланады IEEE 754 64 биттік ұсыну.
Әдебиеттер тізімі
Сілтемелер - бұл жалғыз қасиеті, оларды теңдік үшін салыстыруға болатын жаһандық бірегей символдар. Олар Erlang примитивті бағалау арқылы жасалады make_ref ().
Екілік файлдар
Екілік дегеніміз - байттар тізбегі. Екілік файлдар екілік деректерді сақтаудың кеңістікті тиімді әдісін ұсынады. Erlang примитивтері екілік файлдарды құру және ыдырату және екілік файлдарды тиімді енгізу / шығару үшін бар.
Pids
Pid қысқа процесс идентификаторы - Pid Эрланг примитиві арқылы жасалады уылдырық шашу [...] Пидтер - бұл Erlang процестеріне сілтемелер.
Порттар
Порттар сыртқы әлеммен байланыс жасау үшін қолданылады. Порттар кіріктірілген функциямен жасалады ашық_порт. Хабарларды порттарға жіберуге және олардан алуға болады, бірақ бұл хабарламалар «порт протоколына» бағынуы керек.
Көңіл көтеру
Көңіл көтеру функциясы жабылу. Көңіл көтеру формасының өрнектері арқылы жасалады: көңілді (...) -> ... соңы.

Үш дерек түрі:

Жұптар
Tuples - бұл Erlang мәліметтер типінің белгіленген санына арналған контейнерлер. Синтаксис {D1, D2, ..., Dn} аргументтері бар кортежді білдіреді D1, D2, ... Dn. Аргументтер бастапқы деректер типтері немесе құрама деректер түрлері болуы мүмкін. Кортеждің кез-келген элементіне тұрақты уақытта қол жеткізуге болады.
Тізімдер
Тізімдер - бұл Erlang деректер типінің ауыспалы санына арналған контейнерлер. Синтаксис [Dh | Dt] бірінші элементі болатын тізімді білдіреді Dh, ал қалған элементтері тізім болып табылады Дт. Синтаксис [] бос тізімді білдіреді. Синтаксис [D1, D2, .., Dn] қысқа [D1 | [D2 | .. | [Dn | []]]]. Тізімнің бірінші элементіне тұрақты уақытта қол жеткізуге болады. Тізімнің бірінші элементі деп аталады бас тізімнің. Тізімнің басы жойылғаннан кейін қалған деп аталады құйрық тізімнің.
Карталар
Карталарда кілттер мәнінің ассоциациясының ауыспалы саны бар. Синтаксис# {Key1 => Value1, ..., KeyN => ValueN}.

Екі формасы синтаксистік қант ұсынылады:

Жолдар
Жолдар кейіпкерлердің екі рет келтірілген тізімдері ретінде жазылады. Бұл бүтін санға арналған синтаксистік қант Юникод жолдағы таңбаларға арналған кодтық нүктелер. Мәселен, мысалы, «мысық» жіпі стенографиялық болып табылады [99,97,116].[20]
Жазбалар
Жазбалар тегтерді кортеждегі элементтердің әрқайсысымен байланыстырудың ыңғайлы әдісін ұсынады. Бұл кортеж элементіне позициясы бойынша емес, аты бойынша сілтеме жасауға мүмкіндік береді. Алдын ала компилятор жазбаның анықтамасын алады және оны сәйкес кортеж сілтемесімен ауыстырады.

Erlang-да сыныптарды анықтау әдісі жоқ, дегенмен сыртқы түрлері бар кітапханалар қол жетімді.[21]

«Let it Crash» кодтау мәнері

Бағдарламалық жасақтаманың басқа көптеген тілдерінде бағдарламалық жасақтаманың бұзылуы әрдайым өте жағымсыз жағдайлар болып саналды, сондықтан оларды болдырмауға болмайды. Демек, осы жағдайларды ұстап, содан кейін олардың әсерін азайту үшін ерекше жағдайларды өңдеу механизмдері бар. Бұл жобалау философиясы компьютерлер бір процессорлы машиналар болған кезде бағдарламалық жасақтаманы жобалаудың көптеген негізгі принциптері анықталғандықтан бар. Бұл жағдайда бағдарламалық жасақтаманың бұзылуы шынымен де өлімге әкелді. Осы негізгі шектеулерді ескере отырып, кодтаудың көп бөлігі қателіктерді анықтауға және оларды өңдеуге арналған бағдарламалау стильдерін дамыту өте табиғи болды. Бұл өз кезегінде тікелей танымал, әлі күнге дейін кеңінен танымал кодтау стиліне әкелді қорғаныстық бағдарламалау.

Алайда, Erlang дизайнерлері өздерінің жағымсыз әсерлеріне қарамастан, бағдарламалық жасақтаманың бұзылуы өлім мен салыққа ұқсайтынын түсінді - бұл сөзсіз. Сондықтан апатты дағдарыстық жағдай ретінде қарастырмай, шешім табылғанша барлық қалыпты жұмысты уақытша тоқтатады, олар апатқа кез-келген басқа жұмыс уақытының оқиғалары сияқты қараудың мағынасы жоғары болады деп ойлады. Демек, Erlang процесі бұзылған кезде, бұл жағдай процестің пошта жәшігіне келетін хабарламаның тағы бір түрі ретінде баяндалады.

Бұл іске асыру Erlang дизайнерлеріне келесі іргелі ерекшеліктерге ие тіл құруға әкелді:

  • Эрлангта ғаламдық жады туралы түсінік жоқ; сондықтан бір-біріне қатысты барлық процестер оқшауланған орындау орталары болып табылады
  • Erlang процестері:
    • өте арзан уылдырық шашу
    • хабарлама жіберу арқылы ғана байланысады
    • бір-бірін бақылау. Бұл процестерді «супервизорлық ағаштар» деп аталатын иерархияларда ұйымдастыруға мүмкіндік береді.
  • Процесс өз міндетін орындауы немесе сәтсіздікке ұшырауы керек
  • Процестің сәтсіздігі жай хабарлама ретінде беріледі

«Let it Crash» кодтау стилі осы принциптерде жұмыс істейтін тілде жұмыс жасаудың практикалық нәтижесі болып табылады.

Бақылаушы ағаштар

Типтік Erlang қосымшасы супервизор ағашы түрінде жазылады. Бұл архитектура процестердің иерархиясына негізделген, онда жоғарғы деңгейдегі процесс «супервайзер» ретінде белгілі. Содан кейін супервизор жұмысшылардың немесе одан да көп, төменгі деңгейдегі бақылаушылардың рөлін атқаратын бірнеше балалар процестерін тудырады. Мұндай иерархиялар ерікті тереңдікте болуы мүмкін және қолданбалы функционалдылықты жүзеге асыруға болатын кеңейтілген және ақауларға төзімді ортаны ұсынған.

Жетекші ағашында барлық супервайзер процестері өздерінің балалар процестерінің өмірлік циклін басқаруға жауап береді және бұған балалар процесі бұзылатын жағдайлармен жұмыс істеу кіреді. Кез-келген үдеріс алдымен баланың процесін уылдырық шашып, содан кейін қоңырау шалу арқылы супервайзер бола алады erlang: монитор / 2 сол процесс бойынша. Егер бақыланатын процесс бұзылса, супервизор бірінші мүшесі атом болатын кортежі бар хабарлама алады «ТӨМЕН». Жетекші біріншіден осындай хабарламаларды тыңдауға, екіншіден, қате жағдайын түзету үшін тиісті шараларды қабылдауға жауапты.

Сонымен қатар, «Let it Crash» қорғаныс кодын аз қамтитын кодтау мәнеріне әкеледі, нәтижесінде кішігірім қосымшалар пайда болады.

Параллельділік және таралу бағыты

Эрлангтың басты күші - қолдау параллельдік. Онда процедураларды құруға және олардың арасында сөйлесуге арналған кішігірім, бірақ күшті примитивтер жиынтығы бар. Эрланг тұжырымдамалық жағынан тілге ұқсас оксам дегенмен, ол идеяларын жаңартады бірізді процестерді байланыстыру (CSP) функционалды құрылымда және хабарламаның асинхронды өтуін қолданады.[22] Процестер Erlang қосымшасын құрылымдаудың негізгі құралы болып табылады. Олар екеуі де емес операциялық жүйе процестер не жіптер, бірақ BEAM жоспарлаған жеңіл процестер. Операциялық жүйенің процестері сияқты (бірақ амалдық жүйенің ағындарынан айырмашылығы), олар бір-бірімен ешқандай күйде болмайды. Әрқайсысына есептелген минималды қосымша шығындар 300 құрайды сөздер.[23] Осылайша, өнімділікті төмендетпестен көптеген процестерді жасауға болады. 2005 жылы 16 ГБ-тегі машинада 20 биттік процесс 64-разрядты Erlang-мен сәтті орындалды жедел жад (Жедел жад; барлығы 800 байт / процесс).[24] Erlang қолдады симметриялық мультипроцесс 2006 жылдың мамырындағы R11B шығарылымынан бастап.

Әзірге жіптер көптеген тілдерде сыртқы кітапханалық қолдауға мұқтаж, Erlang бір уақытта бағдарламалауды жеңілдету мақсатында процестерді құру және басқару үшін тіл деңгейіндегі мүмкіндіктерді ұсынады. Барлық сәйкестік Эрлангта айқын болғанымен, процедуралар көмегімен байланысады хабарлама жіберу ортақ айнымалылардың орнына, бұл айқын қажеттілікті жояды құлыптар (құлыптау схемасын VM әлі күнге дейін ішкі қолданады).[25]

Процесаралық байланыс а арқылы жұмыс істейді ортақ-ештеңе асинхронды хабарлама жіберу жүйе: әр процестің «пошта жәшігі» бар, а кезек басқа процестермен жіберілген және әлі тұтынылмаған хабарламалар. Процесс алу қажетті үлгілерге сәйкес келетін хабарламаларды алу үшін қарабайыр. Хабарламамен жұмыс жасаудың әдеттегі тәртібі хабарламаларды олардың әрқайсысы сәйкес келгенше әр үлгіге қарсы тексереді. Хабарлама жұмсалып, пошта жәшігінен жойылған кезде, процесс орындалуды жалғастырады. Хабарламада кез-келген Erlang құрылымы, соның ішінде примитивтер (бүтін сандар, қалқымалар, символдар, атомдар), кортеждер, тізімдер және функциялар болуы мүмкін.

Төмендегі код мысалы үлестірілген процестерге арналған қолдауды көрсетеді:

 Процесс жасаңыз және веб-функцияны шақырыңыз: start_server (Port, MaxConnections) ServerProcess = уылдырық шашу(желі, бастау_сервер, [Порт, MaxConnections]), Қашықтан процесс жасап, функцияны шақырыңыз % web: RemoteNode машинасында start_server (Port, MaxConnections) RemoteProcess = уылдырық шашу(RemoteNode, желі, бастау_сервер, [Порт, MaxConnections]), % ServerProcess-ке хабарлама жіберіңіз (синхронды емес). Хабарлама кортежден тұрады % атоммен «үзіліс» және «10» санымен. ServerProcess ! {кідірту, 10}, % Осы процеске жіберілген хабарламаларды алыңыз алу         хабарлама -> бірдеңе жасау;         {деректер, DataContent} -> тұтқа(DataContent);         {Сәлеметсіз бе, Мәтін} -> io:формат(«Сәлем хабарламасы келді: ~ s", [Мәтін]);         {Сау болыңыз, Мәтін} -> io:формат(«Қоштасу туралы хабарлама алдым: ~ s", [Мәтін]) Соңы.

Мысалда көрсетілгендей, қашықтағы түйіндерде процестер жасалуы мүмкін және олармен байланыс қашықтағы процестермен байланыс жергілікті процестермен байланыс сияқты жұмыс істейтіндігі тұрғысынан айқын болады.

Параллельдік Erlang-да қателерді өңдеудің негізгі әдісін қолдайды. Процесс бұзылған кезде, ол мұқият шығады және басқарушы процеске хабарлама жібереді, содан кейін іс-әрекет жасай алады, мысалы, ескі процестің тапсырмасын қабылдайтын жаңа процесті бастау.[26][27]

Іске асыру

Erlang-дің ресми сілтемесі BEAM қолданады.[28] BEAM Erlang / OTP деп аталатын Erlang ресми дистрибуциясына кіреді. BEAM орындайды байт коды түрлендіріледі бұрандалы код жүктеу кезінде. Сондай-ақ, жоғары платформадағы Erlang Project (HiPE) әзірлеген көптеген платформалардағы жергілікті код компиляторын қамтиды Упсала университеті. 2001 жылдың қазан айынан бастап HiPE жүйесі толығымен Ericsson ашық бастапқы коды Erlang / OTP жүйесіне енгізілді.[29] Ол сонымен қатар тікелей бастапқы кодтан аударманы қолдайды дерексіз синтаксис ағашы, Erlang-дің R11B-5 шығарылымына сценарий арқылы.

Ыстық кодты жүктеу және модульдер

Erlang тіл деңгейін қолдайды Бағдарламалық жасақтаманы динамикалық жаңарту. Мұны жүзеге асыру үшін код «модуль» бірліктері ретінде жүктеледі және басқарылады; модуль а жинақтау бөлімі. Жүйе модульдің екі нұсқасын бір уақытта жадында сақтай алады және процестер бір уақытта әрқайсысынан кодты орындай алады. Нұсқалар «жаңа» және «ескі» нұсқа деп аталады. Процесс өзінің модуліне сыртқы қоңырау шалмайынша жаңа нұсқаға көшпейді.

Ыстық кодты жүктеу механизмінің мысалы:

  %% Процесс, оның жалғыз жұмысы санауыш жүргізу.  %% Бірінші нұсқа  -модуль(санауыш).  -экспорт([бастау/0, код қосқышы/1]).  бастау() -> цикл(0).  цикл(Қосынды) ->    алу       {өсім, Санақ} ->          цикл(Қосынды+Санақ);       {санауыш, Pid} ->          Pid ! {санауыш, Қосынды},          цикл(Қосынды);       кодты ауыстыру ->          ?МОДУЛЬ:код қосқышы(Қосынды)          % MODULE соңғы нұсқасынан 'Codeswitch / 1' қолдануға мәжбүр етіңіз    Соңы.  код қосқышы(Қосынды) -> цикл(Қосынды).

Екінші нұсқа үшін біз санауды нөлге қалпына келтіру мүмкіндігін қосамыз.

  %% Екінші нұсқа  -модуль(санауыш).  -экспорт([бастау/0, код қосқышы/1]).  бастау() -> цикл(0).  цикл(Қосынды) ->    алу       {өсім, Санақ} ->          цикл(Қосынды+Санақ);       қалпына келтіру ->          цикл(0);       {санауыш, Pid} ->          Pid ! {санауыш, Қосынды},          цикл(Қосынды);       кодты ауыстыру ->          ?МОДУЛЬ:код қосқышы(Қосынды)    Соңы.  код қосқышы(Қосынды) -> цикл(Қосынды).

Атомнан тұратын хабарлама алғанда ғана кодты ауыстыру цикл codewitch / 1 сыртқы қоңырауын орындайды (? МОДУЛЬ - ағымдағы модуль үшін препроцессорлық макро). Егер жаңа нұсқасы болса санауыш жадтағы модуль, содан кейін оның код қосқышы / 1 функциясы шақырылады. Белгілі бір кіру нүктесінің жаңа нұсқаға ие болу тәжірибесі бағдарламалаушыға күйді жаңа нұсқаға қажетіне айналдыруға мүмкіндік береді. Мысалда күй бүтін сан ретінде сақталады.

Іс жүзінде жүйелер Open Telecom Platform жобалау принциптерін қолдана отырып құрылады, бұл кодты жаңартуға мүмкіндік береді. Ыстық кодты сәтті жүктеу өте маңызды. Код Эрлангтың мүмкіндіктерін пайдалану үшін мұқият жазылуы керек.

Тарату

1998 жылы Эриксон Erlang-ды шығарды ақысыз және бастапқы көзі ашық бағдарламалық жасақтама оның бір сатушыдан тәуелсіздігін қамтамасыз ету және тіл туралы хабардарлықты арттыру. Erlang, кітапханалармен және нақты уақыт режимінде таратылған мәліметтер базасымен бірге Мнезия, кітапханалардың OTP жиынтығын құрайды. Ericsson және бірнеше басқа компаниялар Эрлангты коммерциялық тұрғыдан қолдайды.

Ашық көзден шыққаннан бері Erlang-ны әлемнің бірнеше фирмалары, соның ішінде қолданды Нортель және T-Mobile.[30] Erlang өз орнын толтыруға арналған және өмірінің көп бөлігі үшін түсініксіз тіл болып қала бергенімен, қатарлас қызметтерге деген сұраныстың арқасында оның танымалдығы артып келеді.[31][32]Эрланг өрісте кейбір қолданыстар тапты жаппай көп ойыншы онлайн-рөлдік ойын (MMORPG) серверлері.[33]

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ «Шығарылымдар - erlang / otp». Алынған 2 қазан 2020 - арқылы GitHub.
  2. ^ Конференциялар, N. D. C. (4 маусым 2014). «Джо Армстронг - Ағартудың ұзақ жолын функционалды бағдарламалау: тарихи және жеке баяндау». Vimeo.
  3. ^ «Erlang - кіріспе». erlang.org.
  4. ^ Армстронг, Джо; Деккер, Бьярне; Линдгрен, Томас; Милрот, Хакан. «Ашық қайнар көзі Erlang - ақ қағаз». Архивтелген түпнұсқа 2011 жылғы 25 қазанда. Алынған 31 шілде 2011.
  5. ^ Hitchhiker's the BEAM туры - Роберт Вирдинг http://www.erlang-factory.com/upload/presentations/708/HitchhikersTouroftheBEAM.pdf
  6. ^ а б c г. e Армстронг, Джо (2007). Эрланг тарихы. HOPL III: Бағдарламалау тілдерінің тарихы бойынша ACM SIGPLAN үшінші конференциясының материалдары. ISBN  978-1-59593-766-7.
  7. ^ «Технологиялық алпауыттар бағдарламалық жасақтаманың сүйіспеншілігін қалай таратады - CIO.com».
  8. ^ «Erlang / OTP ашық қайнар көзі ретінде шығарылды, 1998-12-08». Архивтелген түпнұсқа 1999 жылғы 9 қазанда.
  9. ^ «Эрланг, математик?».
  10. ^ Армстронг, Джо (тамыз 1997). «Эрлангтың дамуы». ACM SIGPLAN ескертулері. 32 (8): 196–203. дои:10.1145/258948.258967. ISBN  0897919181.
  11. ^ «Эрлангтағы параллюттік бағдарланған бағдарламалау» (PDF). 9 қараша 2002 ж.
  12. ^ а б «Эрлангтың болашағы туралы сұрақ». 6 шілде 2010 ж.
  13. ^ http://erlang.org/download/armstrong_thesis_2003.pdf
  14. ^ Макгреггор, Дункан (26 наурыз 2013). Rackspace үлестірілген есептеу үшін Erlang бағдарламалау тіліне назар аударады (Бейне). Rackspace студиясы, SFO. Алынған 24 сәуір 2019.
  15. ^ «Эриксон». Ericsson.com. 4 желтоқсан 2014. Алынған 7 сәуір 2018.
  16. ^ «Erlang ішінде, WhatsApp-тың сәттілігінің артында сирек кездесетін бағдарламалау тілі». fastcompany.com. 21 ақпан 2014. Алынған 12 қараша 2019.
  17. ^ «Erlang-ді қандай компаниялар қолданады және неге? # МеніңТоптогМатам». erlang-solutions.com. 11 қыркүйек 2019. Алынған 15 наурыз 2020.
  18. ^ «Erlang және Elixir-ді қандай жаңа компаниялар қолданады? #MyTopdogStatus». erlang-solutions.com. 2 наурыз 2020. Алынған 24 маусым 2020.
  19. ^ «Erlang - тізімді түсіну». erlang.org.
  20. ^ «Жолдар мен символдар». Алынған 2 мамыр 2015.
  21. ^ «ect - Erlang Class Transformation - Erlang-ға нысанға бағытталған бағдарламалауды қосыңыз - Google Project Hosting». Алынған 2 мамыр 2015.
  22. ^ Армстронг, Джо (Қыркүйек 2010). «Эрланг». ACM байланысы. 53 (9): 68–75. дои:10.1145/1810891.1810910. Erlang тұжырымдамалық тұрғыдан оксамдық бағдарламалау тіліне ұқсас, бірақ ол CSP идеяларын функционалды шеңберде жаңартады және хабарламаларды асинхронды түрде қолданады.
  23. ^ «Erlang тиімділігі жөніндегі нұсқаулық - процестер». Архивтелген түпнұсқа 2015 жылғы 27 ақпанда.
  24. ^ Wiger, Ulf (14 қараша 2005). «Стресс-тест ерланығы». комп.тіл.функционалды.миск. Алынған 25 тамыз 2006.
  25. ^ «Құлыпсыз хабарламалар кезегі». Алынған 23 желтоқсан 2013.
  26. ^ Армстронг, Джо. «Erlang беріктігі». Архивтелген түпнұсқа 23 сәуір 2015 ж. Алынған 15 шілде 2010.
  27. ^ «Erlang қадағалау принциптері». Архивтелген түпнұсқа 2015 жылғы 6 ақпанда. Алынған 15 шілде 2010.
  28. ^ «Erlang - жинақ және кодты жүктеу». erlang.org. Алынған 21 желтоқсан 2017.
  29. ^ «Жоғары өнімділік». Алынған 26 наурыз 2011.
  30. ^ «Erlang-ді өнімді дамыту үшін кім пайдаланады?». Erlang туралы жиі қойылатын сұрақтар. Алынған 16 шілде 2007. Erlang қолданушысының ең үлкен қолданушысы - (таңданыс!) Ericsson. Ericsson оны телекоммуникациялық жүйелерде қолданылатын бағдарламалық жасақтаманы жазу үшін пайдаланады. Мұны көптеген ондаған жобалар пайдаланды, әсіресе үлкені - AXD301 банкоматының өте ауқымды қосқышы. Жиі қойылатын сұрақтардың тізіміне енгізілген басқа коммерциялық пайдаланушыларға мыналар жатады: Nortel, Deutsche Flugsicherung (Германия азаматы әуе қозғалысын басқару ұйым), және T-Mobile.
  31. ^ «Erlang бағдарламалау». Алынған 13 желтоқсан 2008. Іс жүзінде барлық тілдерде ортақ мемлекеттік параллель қолданылады. Бұл өте қиын және ақауларды шешіп, жүйені кеңейту кезінде қорқынышты мәселелерге әкеліп соқтырады ... Қаржы әлеміндегі кейбір тез дамып келе жатқан стартаптар Erlang-ға келді; мысалы, шведтің www.kreditor.se.
  32. ^ «Эрланг, келесі Java». Архивтелген түпнұсқа 2007 жылғы 11 қазанда. Алынған 8 қазан 2008. Жақында басқа тілдер Эрлангты қуып жетеді дегенге сенбеймін. Оларға Erlang сияқты болу үшін тілдік мүмкіндіктерді қосу оңай болады. Олар үшін жоғары сапалы VM мен параллельділік пен сенімділікке арналған жетілген кітапханаларды құру ұзақ уақытты алады. Сонымен, Эрланг табысқа жетуге дайын. Егер сіз жақын аралықта бірнеше ядролы қосымшаны құрғыңыз келсе, Erlang бағдарламасын қарауыңыз керек.
  33. ^ Кларк, Гэвин (5 ақпан 2011). «Battlestar Galactica ветеринарлары онлайн режимінде ойнауға қажет». Музыка және БАҚ. Рег. Алынған 8 ақпан 2011.

Әрі қарай оқу

Сыртқы сілтемелер