Erlang (programovací jazyk) - Erlang (programming language)
![]() | |
Paradigmata | Multi-paradigma: souběžně, funkční |
---|---|
Navrhl |
|
Vývojář | Ericsson |
Poprvé se objevil | 1986 |
Stabilní uvolnění | 23.1.1[1] / 2. října 2020 |
Psací disciplína | Dynamický, silný |
Licence | Licence Apache 2.0 |
Přípony názvu souboru | .erl, .hrl |
webová stránka | www |
Hlavní, důležitý implementace | |
Erlang | |
Ovlivněno | |
Lisp, PLEX,[2] Prolog, Pokec | |
Ovlivněno | |
Akka, Clojure[Citace je zapotřebí ], Šipka, Elixír, F#, Opa, Oz, Reia, Rez, Scala | |
|
Erlang (/ˈ.rl…ŋ/ UR-lang ) je univerzální, souběžně, funkční programovací jazyk a sbírat odpadky runtime systém. Termín Erlang se používá zaměnitelně s Erlang / OTP, nebo Otevřená telekomunikační platforma (OTP), který se skládá z Erlangu runtime systém, několik komponent připravených k použití (OTP) napsaných hlavně v Erlangu a sada konstrukční principy pro programy Erlang.[3]
Erlang runtime systém je určen pro systémy s těmito vlastnostmi:
- Distribuováno
- Tolerantní k chybám
- Měkký v reálném čase
- Vysoce dostupné, nepřetržitě aplikace
- Výměna za provozu, kde lze změnit kód bez zastavení systému.[4]
Erlang programovací jazyk má neměnný data, porovnávání vzorů, a Funkcionální programování.[5] Sekvenční podmnožina jazyka Erlang podporuje nedočkavé hodnocení, jediný úkol, a dynamické psaní.
Bylo to původně proprietární software v rámci Ericsson, vyvinutý společností Joe Armstrong Robert Virding a Mike Williams v roce 1986,[6] ale byl propuštěn jako bezplatný open source software v roce 1998.[7][8] Erlang / OTP je podporován a udržován produktovou jednotkou Open Telecom Platform (OTP) na adrese Ericsson.
Dějiny
Název Erlang, připisovaný Bjarne Däcker, předpokládali ti, kdo pracují na telefonních přepínačích (pro které byl jazyk určen), odkaz na dánského matematika a inženýra Agner Krarup Erlang a a slabičná zkratka „Ericsson Language“.[6][9][je zapotřebí objasnění ] Erlang byl navržen s cílem zlepšit vývoj telefonních aplikací.[Citace je zapotřebí ] Počáteční verze Erlangu byla implementována v Prolog a byl ovlivněn programovacím jazykem PLEX používané v dřívějších burzách Ericsson. V roce 1988 Erlang dokázal, že je vhodný pro prototypování telefonních ústředen, ale tlumočník Prolog byl příliš pomalý. Jedna skupina v rámci společnosti Ericsson odhadovala, že aby byla vhodná pro produkční použití, bude muset být 40krát rychlejší. V roce 1992 byly zahájeny práce na PAPRSEK virtuální stroj (VM), který kompiluje Erlang do C pomocí kombinace nativně kompilovaného kódu a závitový kód dosáhnout rovnováhy mezi výkonem a prostorem na disku.[10] Podle Armstronga se jazyk po zhroucení nové generace dostal od laboratorního produktu ke skutečným aplikacím Telefonní ústředna AX pojmenovaný AX-N v roce 1995. V důsledku toho byl Erlang vybrán pro příští asynchronní režim přenosu (ATM) výměna AXD.[6]
V roce 1998 společnost Ericsson oznámila přepínač AXD301, který obsahuje více než milion linek Erlang, a uvedl, že dosáhl hodnoty vysoká dostupnost z devět „9“.[11] Krátce nato společnost Ericsson Radio Systems zakázala interní používání Erlangu pro nové produkty s odvoláním na preferenci nechráněných jazyků. Zákaz způsobil, že Armstrong a další opustili Ericsson.[12] Na konci roku byla implementace otevřena.[6] Ericsson nakonec zrušil zákaz a v roce 2004 znovu najal Armstronga.[12]
V roce 2006 rodák symetrické více procesů podpora byla přidána do běhového systému a VM.[6]
Procesy
Joe Armstrong, spoluautor vynálezu Erlangu, shrnul principy procesů ve svém PhD teze:[13]
- Všechno je proces.
- Procesy jsou silně izolované.
- Vytváření a ničení procesů je lehká operace.
- Předávání zpráv je jediný způsob interakce procesů.
- Procesy mají jedinečné názvy.
- Pokud znáte název procesu, můžete mu poslat zprávu.
- Procesy nesdílejí žádné zdroje.
- Zpracování chyb není lokální.
- Procesy dělají to, co mají dělat nebo selhávají.
Joe Armstrong v rozhovoru pro Rackspace v roce 2013 poznamenal: „Pokud Jáva je 'napište jednou, běžte kamkoli „, pak Erlang zní„ napiš jednou, běž navždy “.“[14]
Používání
V roce 2014 Ericsson oznámil, že Erlang byl používán v jeho podpůrných uzlech a v GPRS, 3G a LTE mobilní sítě po celém světě a také Nortel a T-Mobile.[15]
Tak jako Tim Bray, ředitel Web Technologies ve společnosti Sun Microsystems, vyjádřený ve své hlavní řeči na adrese O'Reilly Open Source Convention (OSCON) v červenci 2008:
Kdyby za mnou někdo přišel a chtěl mi zaplatit spoustu peněz za vybudování rozsáhlého systému pro zpracování zpráv, který by musel být neustále vzhůru, nikdy by si nemohl dovolit jít celé roky dolů, bez váhání bych zvolil Erlang, aby zabudovat to.
Erlang je programovací jazyk používaný ke kódování WhatsApp.[16]
Od svého vydání jako open source se společnost Erlang šíří mimo Telecoms a etablovala se v dalších odvětvích, jako jsou FinTech, Gaming, Healthcare, Automotive, IoT a Blockchain. Kromě WhatsApp existují další společnosti uvedené jako příběhy o úspěchu Erlangu: Vocalink (společnost MasterCard), Goldman Sachs, Nintendo, AdRoll, Grindr, BT Mobile, Samsung, OpenX, SITA.[17][18]
Příklady funkčního programování
Faktoriální
A faktoriál algoritmus implementovaný v Erlangu:
-modul(skutečnost). % Toto je soubor 'fact.erl', modul a název souboru se musí shodovat-vývozní([fac/1]). % Tím se exportuje funkce 'fac' arity 1 (1 parametr, žádný typ, žádný název)fac(0) -> 1; % Pokud 0, pak vraťte 1, jinak (všimněte si středníku; to znamená „else“)fac(N) když N > 0, is_integer(N) -> N * fac(N-1).% Rekurzivně určit, pak vrátit výsledek% (všimněte si období, což znamená 'endif' nebo 'end funkce')%% Tato funkce se zhroutí, pokud je zadáno cokoli jiného než nezáporné celé číslo.%% Ilustruje filozofii „Let it crash“ společnosti Erlang.
Fibonacciho sekvence
Ocasní rekurzivní algoritmus, který produkuje Fibonacciho sekvence:
%% Deklarace modulu se musí shodovat s názvem souboru "series.erl" -modul(série).%% Výpis exportu obsahuje seznam všech těchto funkcí, které tvoří%% veřejné API modulu. V tomto případě tento modul vystavuje jediný%% funkce zvaná fib, která bere 1 argument (I.E. má arity 1)%% Obecná syntaxe pro -export je seznam obsahující jméno a%% arity každé veřejné funkce-vývozní([fib/1]).%% ---------------------------------------------------------------------%% Public API%% ---------------------------------------------------------------------%% Zpracovává případy, kdy fib / 1 přijímá konkrétní hodnoty%% Pořadí, ve kterém jsou deklarovány tyto podpisy funkcí, je zásadní%% část funkčnosti tohoto modulu%% Pokud je fib / 1 předáno přesně celé číslo 0, pak vrátí 0fib(0) -> 0;%% Pokud fib / 1 obdrží záporné číslo, vrátí atom err_neg_val%% Za normálních okolností se takové obranné kódování nedoporučuje kvůli Erlangově Letfilozofie %% it Crash; v tomto případě bychom však měli výslovně%% zabrání situaci, která způsobí selhání runtime modulu Erlangfib(N) když N < 0 -> err_neg_val;%% Pokud je fib / 1 předáno celé číslo menší než 3, pak vraťte 1%% Předchozí dva podpisy funkcí zpracovávají všechny případy, kdy N <1,%%, takže tento podpis funkce zpracovává případy, kdy N = 1 nebo N = 2fib(N) když N < 3 -> 1;%% U všech ostatních hodnot volejte soukromou funkci fib_int / 3 k provedení%% výpočtufib(N) -> fib_int(N, 0, 1).%% ---------------------------------------------------------------------%% soukromé API%% ---------------------------------------------------------------------%% Pokud fib_int / 3 obdrží 1 jako svůj první argument, pak jsme hotovi, takže%% vrací hodnotu v argumentu B. Protože nás nezajímá%% hodnoty druhého argumentu, označíme to pomocí _ k označení a%% "nezáleží" na hodnotěfib_int(1, _, B) -> B;%% Pro všechny ostatní kombinace argumentů rekurzivně volejte fib_int / 3%%, kde každý hovor provádí následující:%% - čítač úbytků N%% - Vezměte předchozí hodnotu fibonacci v argumentu B a předejte ji jako%% argument A%% - Vypočítejte hodnotu aktuálního čísla fibonacciho a předejte jej%% jako argument Bfib_int(N, A, B) -> fib_int(N-1, B, A+B).
Tady je stejný program bez vysvětlujících komentářů:
-modul(série).-vývozní([fib/1]).fib(0) -> 0;fib(N) když N < 0 -> err_neg_val;fib(N) když N < 3 -> 1;fib(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 v Erlangu, pomocí seznam s porozuměním:[19]
%% qsort: qsort (seznam)%% Třídit seznam položek-modul(qsort). % Toto je soubor 'qsort.erl'-vývozní([qsort/1]). % Je exportována funkce 'qsort' s 1 parametrem (bez typu, bez názvu)qsort([]) -> []; % Pokud je seznam [] prázdný, vraťte prázdný seznam (nic k seřazení)qsort([Pivot|Zbytek]) -> % Vytvořit rekurzivně seznam s „Předem“ pro všechny prvky, které by měly být před „Pivotem“ %, pak „Pivot“, potom „Zpět“ pro všechny prvky, které by měly být po „Pivot“ qsort([Přední || Přední <- Zbytek, Přední < Pivot]) ++ [Pivot] ++ qsort([Zadní || Zadní <- Zbytek, Zadní >= Pivot]).
Výše uvedený příklad rekurzivně vyvolá funkci qsort
dokud nic nezbývá na třídění. Výraz [Přední || Přední <- Opěrka, Přední
Přední
takhle Přední
je členem Zbytek
, a Přední
je méně než Pivot
." ++
je operátor zřetězení seznamu.
Kvůli čitelnosti lze u složitějších struktur použít srovnávací funkci.
Následující kód by seřadil seznamy podle délky:
% Toto je soubor 'listsort.erl' (překladač je vytvořen tímto způsobem)-modul(seznamy).% Export 'by_length' s 1 parametrem (nezáleží na typu a názvu)-vývozní([podle_délky/1]).podle délky(Seznamy) -> % Použijte 'qsort / 2' a jako parametr poskytuje anonymní funkci qsort(Seznamy, zábava(A,B) -> délka(A) < délka(B) konec).qsort([], _)-> []; % Pokud je seznam prázdný, vraťte prázdný seznam (ignorujte druhý parametr)qsort([Pivot|Zbytek], Menší) -> % Seznam oddílů s prvky „Menší“ před prvky „Pivot“ a ne „Menší“ % po 'Pivot' a seřadit seznamy. qsort([X || X <- Zbytek, Menší(X,Pivot)], Menší) ++ [Pivot] ++ qsort([Y || Y <- Zbytek, ne(Menší(Y, Pivot))], Menší).
A Pivot
je převzato z prvního parametru zadaného do qsort ()
a zbytek Seznamy
je pojmenován Zbytek
. Všimněte si, že výraz
[X || X <- Zbytek, Menší(X,Pivot)]
se neliší ve formě od
[Přední || Přední <- Zbytek, Přední < Pivot]
(v předchozím příkladu) s výjimkou použití srovnávací funkce v poslední části, která říká „Sestavit seznam prvků X
takhle X
je členem Zbytek
, a Menší
je pravda ", s Menší
byl definován dříve jako
zábava(A,B) -> délka(A) < délka(B) konec
The anonymní funkce je pojmenován Menší
v seznamu parametrů druhé definice qsort
aby na něj bylo možné v rámci této funkce odkazovat tímto jménem. Není pojmenován v první definici qsort
, který se zabývá základním případem prázdného seznamu, a proto tuto funkci nepotřebuje, natož název.
Typy dat
Erlang má osm primitiv typy dat:
- Celá čísla
- Celá čísla se zapisují jako sekvence desetinných číslic, například 12, 12375 a -23427 jsou celá čísla. Celočíselná aritmetika je přesná a je omezena pouze dostupnou pamětí v počítači. (Tomu se říká aritmetika s libovolnou přesností.)
- Atomy
- Atomy se používají v programu k označení rozlišených hodnot. Jsou psány jako řetězce po sobě jdoucích alfanumerických znaků, přičemž první znak je malý. Atomy mohou obsahovat libovolný znak, pokud jsou uzavřeny v jednoduchých uvozovkách a existuje úniková konvence, která umožňuje použití libovolného znaku v atomu. Atomy se nikdy neshromažďují a měly by se používat opatrně, zvláště pokud se používá generování dynamických atomů.
- Plováky
- Čísla s plovoucí desetinnou čárkou používají 64bitová reprezentace IEEE 754.
- Reference
- Odkazy jsou globálně jedinečné symboly, jejichž jedinou vlastností je, že je lze porovnávat pro rovnost. Jsou vytvořeny hodnocením primitivu Erlang
make_ref ()
. - Binární soubory
- Binární soubor je posloupnost bajtů. Binární soubory poskytují prostorově efektivní způsob ukládání binárních dat. Erlangové primitivy existují pro skládání a rozkládání binárních souborů a pro efektivní vstup / výstup binárních souborů.
- Pids
- Pid je zkratka identifikátor procesu - Pid je vytvořen primitivem Erlang
potěr(...)
Pids jsou odkazy na procesy Erlang. - Přístavy
- Porty se používají ke komunikaci s vnějším světem. Porty jsou vytvářeny pomocí vestavěné funkce
otevřený_port
. Zprávy lze odesílat a přijímat z portů, ale tyto zprávy se musí řídit takzvaným „portovým protokolem“. - Funs
- Funs jsou funkce uzávěry. Funs are created by expressions of the form:
zábava (...) -> ... konec
.
A tři složené datové typy:
- N-tice
- Tuples jsou kontejnery pro pevný počet datových typů Erlang. Syntaxe
{D1, D2, ..., Dn}
označuje n-tici, jejíž argumenty jsouD1, D2, ... Dn.
Argumenty mohou být primitivní datové typy nebo složené datové typy. K jakémukoli prvku n-tice lze přistupovat v konstantním čase. - Seznamy
- Seznamy jsou kontejnery pro proměnný počet datových typů Erlang. Syntaxe
[Dh | Dt]
označuje seznam, jehož první prvek jeDh
, a jejichž zbývajícími prvky jsou seznamDt
. Syntaxe[]
označuje prázdný seznam. Syntaxe[D1, D2, .., Dn]
je zkratka pro[D1 | [D2 | .. | [Dn | []]]]
. K prvnímu prvku seznamu lze přistupovat v konstantním čase. První prvek seznamu se nazývá hlava seznamu. Zbytek seznamu, když byla odstraněna jeho hlava, se nazývá ocas seznamu. - Mapy
- Mapy obsahují proměnný počet přidružení klíč – hodnota. Syntaxe je
# {Key1 => Hodnota1, ..., KeyN => HodnotaN}
.
Dvě formy syntaktický cukr jsou poskytovány:
- Struny
- Řetězce jsou psány jako dvojnásobně citované seznamy znaků. Toto je syntaktický cukr pro seznam celého čísla Unicode body kódu pro znaky v řetězci. Například řetězec „kočka“ je zkratka pro
[99,97,116]
.[20] - Evidence
- Záznamy poskytují pohodlný způsob přidružení značky ke každému z prvků v řazené kolekci členů. To umožňuje odkazovat se na prvek n-tice jménem a nikoli pozicí. Předkompilátor převezme definici záznamu a nahradí ji příslušným odkazem na n-tici.
Erlang nemá žádnou metodu k definování tříd, i když existují externí knihovny dostupný.[21]
Styl kódování „Let It Crash“
Ve většině ostatních programovacích jazyků byly softwarové pády vždy (a často stále jsou) považovány za vysoce nežádoucí situace, kterým je třeba se za každou cenu vyhnout. V důsledku toho existují propracované mechanismy zpracování výjimek, které tyto situace zachycují a poté zmírňují jejich účinky. Tato filozofie designu existuje, protože mnoho základních principů návrhu softwaru bylo definováno v době, kdy počítače byly jednoprocesorové stroje. Za těchto podmínek byly softwarové pády skutečně fatální. Vzhledem k tomuto základnímu omezení bylo proto zcela přirozené vyvinout programovací styly, ve kterých byla velká část kódu věnována detekci a následnému řešení chybových situací. To zase vedlo přímo k stále široce populárnímu stylu kódování známému jako obranné programování.
Konstruktéři Erlangu si však uvědomili, že navzdory jejich nežádoucím účinkům jsou softwarové pády podobné smrti a daním - to je nevyhnutelné. Proto namísto toho, aby se s havárií zacházelo jako s krizovou situací, která dočasně pozastaví veškerou normální práci, dokud nebude nalezeno řešení, usoudili, že by dávalo mnohem větší smysl zacházet s havárií přesně stejným způsobem jako s jakoukoli jinou normální běhovou událostí. V důsledku toho, když dojde k chybě procesu Erlang, je tato situace hlášena jako jen jiný typ zprávy přicházející do poštovní schránky procesu.
Tato realizace vedla k tomu, že designéři společnosti Erlang vytvořili jazyk s následujícími základními rysy:
- Erlang nemá koncept globální paměti; vzájemně tedy jsou všechny procesy izolované prostředí pro provádění
- Procesy Erlang mohou:
- být vytvořen velmi levně
- komunikovat pouze pomocí předávání zpráv
- navzájem se sledovat. To umožňuje procesy uspořádat do hierarchií známých jako „stromy správce“.
- Proces by měl plnit svůj úkol nebo selhat
- Selhání procesu je hlášeno jednoduše jako zpráva
Styl kódování „Let It Crash“ je proto praktickým důsledkem práce v jazyce, který funguje na těchto principech.
Stromy dohledu
Typická aplikace Erlang je napsána ve formě stromu supervizora. Tato architektura je založena na hierarchii procesů, ve kterých je proces nejvyšší úrovně známý jako „supervizor“. Supervizor poté vytvoří několik podřízených procesů, které fungují buď jako pracovníci, nebo více supervizorů na nižší úrovni. Takové hierarchie mohou existovat do libovolných hloubek a prokázaly, že poskytují vysoce škálovatelné a odolné prostředí, v němž lze implementovat funkčnost aplikace.
Ve stromu supervizora jsou všechny procesy supervizora zodpovědné za správu životního cyklu jejich podřízených procesů, což zahrnuje i řešení situací, ve kterých tyto podřízené procesy selhávají. Jakýkoli proces se může stát supervizorem nejprve vytvořením podřízeného procesu a následným voláním erlang: monitor / 2
na tom procesu. Pokud monitorovaný proces poté selže, supervizor obdrží zprávu obsahující n-tici, jejíž prvním členem je atom 'DOLŮ'
. Supervizor je odpovědný jednak za poslech těchto zpráv a jednak za přijetí příslušných opatření k nápravě chybového stavu.
Výsledkem „Let it Crash“ je styl kódování, který obsahuje malý obranný kód, což má za následek menší aplikace.
Souběžnost a distribuční orientace
Hlavní silnou stránkou společnosti Erlang je podpora pro konkurence. Má malou, ale výkonnou sadu primitiv pro vytváření procesů a komunikaci mezi nimi. Erlang je koncepčně podobný jazyku occam, i když přepracovává myšlenky komunikující sekvenční procesy (CSP) ve funkčním rámci a používá asynchronní předávání zpráv.[22] Procesy jsou primárním prostředkem ke strukturování aplikace Erlang. Nejsou ani jedno ani druhé operační systém procesy ani vlákna, ale odlehčené procesy, které jsou naplánovány BEAM. Stejně jako procesy operačního systému (ale na rozdíl od vláken operačního systému) nesdílejí mezi sebou žádný stav. Odhadovaná minimální režie pro každou z nich je 300 slova.[23] Lze tedy vytvořit mnoho procesů bez snížení výkonu. V roce 2005 byl úspěšně proveden benchmark s 20 miliony procesů s 64bitovým Erlangem na stroji s 16 GB paměť s náhodným přístupem (RAM; celkem 800 bajtů / proces).[24] Erlang podporuje symetrické více procesů od vydání R11B v květnu 2006.
Zatímco vlákna Potřebujete podporu externí knihovny ve většině jazyků, Erlang poskytuje funkce na úrovni jazyka pro vytváření a správu procesů s cílem zjednodušit souběžné programování. Ačkoli je veškerá souběžnost v Erlangu explicitní, procesy komunikují pomocí předávání zpráv místo sdílených proměnných, což odstraňuje potřebu explicitních zámky (schéma uzamčení je stále interně používáno VM).[25]
Meziprocesová komunikace funguje přes a sdílené nic asynchronní předávání zpráv systém: každý proces má „poštovní schránku“, a fronta zpráv, které byly odeslány jinými procesy a dosud nebyly spotřebovány. Proces používá dostávat
primitivní k načtení zpráv, které odpovídají požadovaným vzorům. Rutina zpracování zpráv testuje zprávy postupně proti každému vzoru, dokud se jedna z nich neshoduje. Když je zpráva spotřebována a odstraněna z poštovní schránky, proces pokračuje v provádění. Zpráva může obsahovat jakoukoli strukturu Erlang, včetně primitiv (celá čísla, plováky, znaky, atomy), n-tic, seznamů a funkcí.
Níže uvedený příklad kódu ukazuje integrovanou podporu pro distribuované procesy:
% Vytvořit proces a vyvolat funkční web: start_server (Port, MaxConnections) ServerProcess = potěr(web, start_server, [Přístav, MaxConnections]), % Vytvořte vzdálený proces a vyvolajte funkci % web: start_server (port, MaxConnections) na stroji RemoteNode RemoteProcess = potěr(RemoteNode, web, start_server, [Přístav, MaxConnections]), % Odeslat zprávu ServerProcess (asynchronně). Zpráva se skládá z n-tice % s atomem „pauza“ a číslem „10“. ServerProcess ! {pauza, 10}, % Příjem zpráv odeslaných do tohoto procesu dostávat zpráva -> dělej něco; {data, DataContent} -> Rukojeť(DataContent); {Ahoj, Text} -> io:formát(„Mám ahoj zprávu: ~ s", [Text]); {Ahoj, Text} -> io:formát(„Mám sbohem zprávu: ~ s", [Text]) konec.
Jak ukazuje příklad, procesy lze vytvářet na vzdálených uzlech a komunikace s nimi je transparentní v tom smyslu, že komunikace se vzdálenými procesy funguje přesně jako komunikace s místními procesy.
Souběžnost podporuje primární metodu zpracování chyb v Erlangu. Když se proces zhroutí, úhledně se ukončí a odešle zprávu řídícímu procesu, který pak může přijmout opatření, například zahájit nový proces, který převezme úlohu starého procesu.[26][27]
Implementace
Oficiální referenční implementace Erlang používá BEAM.[28] BEAM je součástí oficiální distribuce Erlang, která se nazývá Erlang / OTP. BEAM provede bytecode který je převeden na závitový kód v době načítání. Zahrnuje také kompilátor nativního kódu na většině platforem vyvinutý High Performance Erlang Project (HiPE) at Univerzita v Uppsale. Od října 2001 je systém HiPE plně integrován do systému Ericsson Open Source Erlang / OTP.[29] Podporuje také tlumočení přímo ze zdrojového kódu pomocí abstraktní syntaxový strom, prostřednictvím skriptu od vydání R11B-5 Erlang.
Načítání horkého kódu a moduly
Erlang podporuje jazykovou úroveň Dynamická aktualizace softwaru. K implementaci je kód načten a spravován jako jednotky „modulu“; modul je a kompilační jednotka. Systém může uchovávat dvě verze modulu v paměti současně a procesy mohou současně spouštět kód z každé. Verze se označují jako „nová“ a „stará“ verze. Proces se nebude přesouvat do nové verze, dokud neprovede externí volání svého modulu.
Příklad mechanismu načítání horkého kódu:
%% Proces, jehož jediným úkolem je udržovat počítadlo. %% První verze -modul(čelit). -vývozní([Start/0, kódový spínač/1]). Start() -> smyčka(0). smyčka(Součet) -> dostávat {přírůstek, Počet} -> smyčka(Součet+Počet); {čelit, Pid} -> Pid ! {čelit, Součet}, smyčka(Součet); code_switch -> ?MODUL:kódový spínač(Součet) % Vynutit použití 'codeswitch / 1' z nejnovější verze MODULE konec. kódový spínač(Součet) -> smyčka(Součet).
U druhé verze přidáme možnost vynulovat počet.
%% Druhá verze -modul(čelit). -vývozní([Start/0, kódový spínač/1]). Start() -> smyčka(0). smyčka(Součet) -> dostávat {přírůstek, Počet} -> smyčka(Součet+Počet); resetovat -> smyčka(0); {čelit, Pid} -> Pid ! {čelit, Součet}, smyčka(Součet); code_switch -> ?MODUL:kódový spínač(Součet) konec. kódový spínač(Součet) -> smyčka(Součet).
Pouze při příjmu zprávy skládající se z atomu code_switch
provede smyčka externí volání na kódový spínač / 1 (?MODUL
je makro preprocesoru pro aktuální modul). Pokud existuje nová verze čelit modul v paměti, pak bude vyvolána jeho funkce codewitch / 1. Praxe s konkrétním vstupním bodem do nové verze umožňuje programátorovi transformovat stav na to, co je v novější verzi potřeba. V příkladu je stav uchován jako celé číslo.
V praxi jsou systémy postaveny na principech návrhu z Open Telecom Platform, což vede k návrhům s možností upgradování kódu. Úspěšné načítání horkého kódu je náročné. Aby bylo možné využívat zařízení společnosti Erlang, je třeba kód psát opatrně.
Rozdělení
V roce 1998 společnost Ericsson uvedla společnost Erlang na trh bezplatný open source software zajistit jeho nezávislost na jediném prodejci a zvýšit povědomí o jazyce. Erlang, společně s knihovnami a distribuovanou databází v reálném čase Mnesia, tvoří OTP sbírku knihoven. Ericsson a několik dalších společností podporuje společnost Erlang komerčně.
Od vydání open source používá Erlang několik firem po celém světě, včetně Nortel a T-Mobile.[30] Ačkoli byl Erlang navržen tak, aby vyplnil mezeru a po většinu své existence zůstal nejasným jazykem, jeho popularita roste kvůli poptávce po souběžných službách.[31][32]Erlang našel nějaké použití v chytání masivně multiplayerová online hra na hrdiny (MMORPG) servery.[33]
Viz také
- Elixír - funkční, souběžný, univerzální programovací jazyk, který běží na BEAM
- Luerl - Lua on the BEAM, navržený a implementovaný jedním z tvůrců Erlangu.
- Lisp ochucený Erlang (LFE) - programovací jazyk založený na Lispu, který běží na BEAM
- Mix (nástroj pro sestavení)
- Phoenix (webový rámec)
Reference
- ^ „Releases - erlang / otp“. Citováno 2. října 2020 - přes GitHub.
- ^ Konference, N. D. C. (4. června 2014). „Joe Armstrong - funkční programování dlouhé cesty k osvícení: historický a osobní příběh“. Vimeo.
- ^ „Erlang - úvod“. erlang.org.
- ^ Armstrong, Joe; Däcker, Bjarne; Lindgren, Thomas; Millroth, Håkan. „Open-source Erlang - bílá kniha“. Archivovány od originál dne 25. října 2011. Citováno 31. července 2011.
- ^ Stopařova prohlídka BEAMU - Robert Virding http://www.erlang-factory.com/upload/presentations/708/HitchhikersTouroftheBEAM.pdf
- ^ A b C d E Armstrong, Joe (2007). Historie Erlangu. HOPL III: Sborník ze třetí konference ACM SIGPLAN o historii programovacích jazyků. ISBN 978-1-59593-766-7.
- ^ „Jak technologičtí giganti šíří lásku k open source programování - CIO.com“.
- ^ „Erlang / OTP Released as Open Source, 1998-12-08“. Archivovány od originál dne 9. října 1999.
- ^ „Erlang, matematik?“.
- ^ Armstrong, Joe (srpen 1997). "Vývoj Erlangu". Oznámení ACM SIGPLAN. 32 (8): 196–203. doi:10.1145/258948.258967. ISBN 0897919181.
- ^ "Programování zaměřené na souběžnost v Erlangu" (PDF). 9. listopadu 2002.
- ^ A b „otázka ohledně Erlangovy budoucnosti“. 6. července 2010.
- ^ http://erlang.org/download/armstrong_thesis_2003.pdf
- ^ McGreggor, Duncan (26. března 2013). Rackspace se podívá na programovací jazyk Erlang pro distribuované výpočty (Video). Rackspace Studios, SFO. Citováno 24. dubna 2019.
- ^ „Ericsson“. Ericsson.com. 4. prosince 2014. Citováno 7. dubna 2018.
- ^ „Inside Erlang, vzácný programovací jazyk za úspěchem WhatsApp“. fastcompany.com. 21. února 2014. Citováno 12. listopadu 2019.
- ^ „Které společnosti používají Erlang a proč? #MyTopdogStatus“. erlang-solutions.com. 11. září 2019. Citováno 15. března 2020.
- ^ „Které nové společnosti používají Erlang a Elixir? #MyTopdogStatus“. erlang-solutions.com. 2. března 2020. Citováno 24. června 2020.
- ^ „Erlang - seznam s porozuměním“. erlang.org.
- ^ "Řetězcové a znakové literály". Citováno 2. května 2015.
- ^ „ect - Transformace třídy Erlang - přidání objektově orientovaného programování do Erlang - Google Project Hosting“. Citováno 2. května 2015.
- ^ Armstrong, Joe (Září 2010). „Erlang“. Komunikace ACM. 53 (9): 68–75. doi:10.1145/1810891.1810910.
Erlang je koncepčně podobný programovacímu jazyku occam, ačkoli přepracovává myšlenky CSP ve funkčním rámci a používá asynchronní předávání zpráv.
- ^ „Průvodce efektivitou Erlang - procesy“. Archivovány od originál dne 27. února 2015.
- ^ Wiger, Ulf (14. listopadu 2005). „Stres-testing erlang“. comp.lang.functional.misc. Citováno 25. srpna 2006.
- ^ „Fronta zpráv bez uzamčení“. Citováno 23. prosince 2013.
- ^ Armstrong, Joe. „Erlang robustnost“. Archivovány od originál dne 23. dubna 2015. Citováno 15. července 2010.
- ^ „Principy Erlang Supervision“. Archivovány od originál dne 6. února 2015. Citováno 15. července 2010.
- ^ „Erlang - kompilace a načítání kódu“. erlang.org. Citováno 21. prosince 2017.
- ^ „High Performance Erlang“. Citováno 26. března 2011.
- ^ „Kdo používá Erlang pro vývoj produktů?“. Často kladené otázky o Erlangu. Citováno 16. července 2007.
Největším uživatelem Erlangu je (překvapení!) Ericsson. Ericsson jej používá k psaní softwaru používaného v telekomunikačních systémech. Využilo jej mnoho desítek projektů, zvláště velkým je extrémně škálovatelný přepínač ATM AXD301. Mezi další komerční uživatele uvedené v části Nejčastější dotazy patří: Nortel, Deutsche Flugsicherung (německý státní příslušník) kontrola letového provozu organizace) a T-Mobile.
- ^ „Programování Erlang“. Citováno 13. prosince 2008.
Prakticky všechny jazyky používají sdílenou státní souběžnost. To je velmi obtížné a vede to ke strašlivým problémům, když zvládnete selhání a rozšiřujete systém ... Některé docela rychle se rozvíjející startupy ve finančním světě se přidaly k Erlangu; například švédská www.kreditor.se.
- ^ „Erlang, další Java“. Archivovány od originál dne 11. října 2007. Citováno 8. října 2008.
Nevěřím, že jiné jazyky mohou Erlang tak brzy dohnat. Bude pro ně snadné přidat jazykové funkce, které budou jako Erlang. Bude jim trvat dlouho, než vytvoří tak vysoce kvalitní virtuální počítač a vyspělé knihovny pro souběžnost a spolehlivost. Erlang je tedy připraven na úspěch. Pokud chcete v příštích několika letech vytvořit vícejádrovou aplikaci, měli byste se podívat na Erlang.
- ^ Clarke, Gavin (5. února 2011). „Pro online hraní her potřebují veterináři Battlestar Galactica“. Hudba a média. Reg. Citováno 8. února 2011.
Další čtení
- Armstrong, Joe (2003). „Vytváření spolehlivých distribuovaných systémů za přítomnosti softwarových chyb“ (PDF). Disertační práce. Královský technologický institut, Stockholm, Švédsko. Archivovány od originálu dne 23. března 2015. Citováno 13. února 2016. Citovat deník vyžaduje
| deník =
(Pomoc)CS1 maint: BOT: stav původní adresy URL neznámý (odkaz) - Armstrong, Joe (2007). "Historie Erlangu". Sborník příspěvků ze třetí konference ACM SIGPLAN o historii programovacích jazyků - HOPL III. s. 6–1. doi:10.1145/1238844.1238850. ISBN 978-1-59593-766-7.
- Raná historie Erlangu autor: Bjarne Däcker
- Mattsson, H .; Nilsson, H .; Wikstrom, C. (1999). "Mnesia - distribuovaný robustní DBMS pro telekomunikační aplikace". První mezinárodní seminář o praktických aspektech deklarativních jazyků (PADL '99): 152–163.
- Armstrong, Joe; Virding, Robert; Williams, Mike; Wikstrom, Claes (16. ledna 1996). Souběžné programování v Erlangu (2. vyd.). Prentice Hall. p. 358. ISBN 978-0-13-508301-7. Archivovány od originál dne 6. března 2012.
- Armstrong, Joe (11. července 2007). Programování Erlang: Software pro souběžný svět (1. vyd.). Pragmatická knihovna. p.536. ISBN 978-1-934356-00-5.
- Thompson, Simon J .; Cesarini, Francesco (19. června 2009). Erlang Programování: Souběžný přístup k vývoji softwaru (1. vyd.). Sebastopol, Kalifornie: O'Reilly Media, Inc. str. 496. ISBN 978-0-596-51818-9.
- Logan, Martin; Merritt, Eric; Carlsson, Richard (28. května 2010). Erlang a OTP v akci (1. vyd.). Greenwich, CT: Manning Publications. p. 500. ISBN 978-1-933988-78-8.
- Martin, Brown (10. května 2011). „Úvod do programování v Erlangu, část 1: Základy“. developerWorks. IBM. Citováno 10. května 2011.
- Martin, Brown (17. května 2011). „Úvod do programování v Erlangu, část 2: Používání pokročilých funkcí a funkcí“. developerWorks. IBM. Citováno 17. května 2011.
- Wiger, Ulf (30. března 2001). „Čtyřnásobné zvýšení produktivity a kvality: funkční programování v průmyslových odvětvích u produktů telekomunikační třídy“ (PDF). Nasazení FEmSYS 2001 na distribuovaných architekturách. Ericsson Telecom AB. Citováno 16. září 2014.