Erlang (język programowania) - Erlang (programming language)
Paradygmaty | Wieloparadygmat : współbieżny , funkcjonalny |
---|---|
Zaprojektowany przez | |
Deweloper | Ericsson |
Po raz pierwszy pojawiły się | 1986 |
Wersja stabilna | |
Dyscyplina pisania | Dynamiczny , mocny |
Licencja | Licencja Apache 2.0 |
Rozszerzenia nazw plików | .erl, .hrl |
Strona internetowa | www |
Główne wdrożenia | |
Erlang | |
Wpływem | |
Lisp , PLEX , Prolog , Smalltalk | |
Pod wpływem | |
Akka , Clojure , Dart , Elixir , F # , Opa , Oz , Reia , Rust , Scala , Go | |
|
Erlang ( / ɜːr l ® ŋ / UR -lang ) jest ogólnego przeznaczenia , współbieżne , funkcjonalny język programowania i porządkowania pamięci układu wykonawczego . Termin Erlang jest używane zamiennie z Erlang / OTP lub Otwórz Telecom Platform (OTP), który składa się z Erlang układu wykonawczego , kilka gotowych do użycia komponentów (OTP) głównie napisanych w Erlang, i zbiór zasad projektowania dla Erlang programy.
Erlang System Runtime jest przeznaczony dla systemów z tych cech:
- Rozpowszechniane
- Odporne na uszkodzenia
- Miękkie w czasie rzeczywistym
- Wysoce dostępne , nieprzerwane aplikacje
- Hot swapping , gdzie kod można zmienić bez zatrzymywania systemu.
Język programowania Erlang ma niezmienne dane, dopasowywanie wzorców i programowanie funkcjonalne . Sekwencyjny podzbiór języka Erlang obsługuje przyspieszoną ocenę , pojedyncze przypisanie i dynamiczne pisanie .
Normalna aplikacja Erlang składa się z setek małych procesów Erlang.
Pierwotnie było to oprogramowanie zastrzeżone w firmie Ericsson , opracowane przez Joe Armstronga , Roberta Virdinga i Mike'a Williamsa w 1986 roku, ale zostało wydane jako bezpłatne oprogramowanie o otwartym kodzie źródłowym w 1998 roku. Erlang/OTP jest obsługiwany i utrzymywany przez Open Telecom Platform (OTP) jednostka produktu w firmie Ericsson .
Historia
Nazwa Erlang , przypisywana Bjarne'owi Däckerowi, została uznana przez osoby pracujące nad przełącznikami telefonii (dla których język został zaprojektowany) jako odniesienie do duńskiego matematyka i inżyniera Agnera Krarupa Erlanga oraz sylabicznego skrótu „język Ericsson”. Erlang został zaprojektowany z myślą o usprawnieniu rozwoju aplikacji telefonicznych. Pierwotna wersja Erlanga została zaimplementowana w Prologu i była pod wpływem języka programowania PLEX używanego we wcześniejszych centralach Ericssona. W 1988 roku Erlang udowodnił, że nadaje się do prototypowania central telefonicznych, ale interpreter Prologu był zbyt wolny. Jedna z grup w firmie Ericsson oszacowała, że musiałby być 40 razy szybszy, aby nadawał się do użytku produkcyjnego. W 1992 roku rozpoczęto prace nad maszyną wirtualną BEAM (VM), która kompiluje Erlang do C przy użyciu kombinacji natywnie skompilowanego kodu i kodu wątkowego, aby zachować równowagę między wydajnością a miejscem na dysku. Według Armstronga język przeszedł z produktu laboratoryjnego do rzeczywistych zastosowań po upadku centrali telefonicznej nowej generacji AX o nazwie AXE-N w 1995 roku. W rezultacie Erlang został wybrany jako następna centrala AXD w trybie transmisji asynchronicznej (ATM) .
W 1998 roku Ericsson ogłosił przełącznik AXD301, zawierający ponad milion linii Erlang i zgłaszane do osiągnięcia wysokiej dostępności z dziewięciu „9” s . Wkrótce potem firma Ericsson Radio Systems zakazała wewnętrznego używania języka Erlang w nowych produktach, powołując się na preferencje dla języków, które nie są prawnie zastrzeżone. Zakaz spowodował, że Armstrong i inni opuścili Ericsson. Wdrożenie zostało otwarte pod koniec roku. Ericsson ostatecznie zniósł zakaz i ponownie zatrudnił Armstronga w 2004 roku.
W 2006 r. do systemu wykonawczego i maszyny wirtualnej dodano natywną obsługę symetrycznego przetwarzania wieloprocesowego .
Procesy
Aplikacje Erlang są zbudowane z bardzo lekkich procesów Erlang w systemie uruchomieniowym Erlang. Procesy Erlanga można postrzegać jako „żywe” obiekty ( programowanie obiektowe ), z enkapsulacją danych i przekazywaniem komunikatów , ale zdolne do zmiany zachowania w czasie wykonywania. System runtime Erlang zapewnia ścisłą izolację procesów między procesami Erlang (obejmuje to zbieranie danych i śmieci, oddzielone indywidualnie przez każdy proces Erlang) oraz przejrzystą komunikację między procesami w różnych węzłach Erlang (na różnych hostach).
Joe Armstrong, współtwórca Erlang, podsumował zasady procesów w swojej pracy doktorskiej :
- Wszystko jest procesem.
- Procesy są silnie izolowane.
- Tworzenie i niszczenie procesów to lekka operacja.
- Przekazywanie wiadomości jest jedynym sposobem interakcji procesów.
- Procesy mają unikalne nazwy.
- Jeśli znasz nazwę procesu, możesz wysłać mu wiadomość.
- Procesy nie współdzielą zasobów.
- Obsługa błędów nie jest lokalna.
- Procesy robią to, co powinny lub zawodzą.
Joe Armstrong zauważył w wywiadzie dla Rackspace w 2013 roku: „Jeśli Java to ' napisz raz, uruchom gdziekolwiek ', to Erlang to 'napisz raz, uruchom w nieskończoność'”.
Stosowanie
W 2014 roku Ericsson poinformował , że Erlang był używany w swoich węzłach wsparcia, a także w sieciach komórkowych GPRS , 3G i LTE na całym świecie, a także przez Nortel i T-Mobile .
Jak Tim Bray , dyrektor ds. technologii internetowych w Sun Microsystems , wypowiedział się w swoim przemówieniu na konferencji O'Reilly Open Source Convention (OSCON) w lipcu 2008 roku:
Gdyby ktoś przyszedł do mnie i chciał zapłacić mi dużo pieniędzy za zbudowanie systemu obsługi wiadomości na dużą skalę, który naprawdę musiał być cały czas w górę, nigdy nie mógł sobie pozwolić na upadek przez lata, bez wahania wybrałbym Erlanga do wbuduj go.
Erlang to język programowania używany do kodowania WhatsApp .
Od czasu wydania jako open source Erlang wykroczył poza telekomunikację, ugruntowując swoją pozycję w innych branżach, takich jak FinTech, Gaming, Healthcare, Automotive, IoT i Blockchain. Oprócz WhatsApp na sukcesy Erlanga wymieniane są inne firmy: Vocalink (spółka MasterCard), Goldman Sachs , Nintendo , AdRoll, Grindr , BT Mobile , Samsung , OpenX , SITA .
Przykłady programowania funkcjonalnego
Factorial
Silnia algorytm zaimplementowany w Erlang:
-module(fact). % This is the file 'fact.erl', the module and the filename must match
-export([fac/1]). % This exports the function 'fac' of arity 1 (1 parameter, no type, no name)
fac(0) -> 1; % If 0, then return 1, otherwise (note the semicolon ; meaning 'else')
fac(N) when N > 0, is_integer(N) -> N * fac(N-1).
% Recursively determine, then return the result
% (note the period . meaning 'endif' or 'function end')
%% This function will crash if anything other than a nonnegative integer is given.
%% It illustrates the "Let it crash" philosophy of Erlang.
ciąg Fibonacciego
Ogonowy algorytm rekurencyjny, który tworzy ciąg Fibonacciego :
%% The module declaration must match the file name "series.erl"
-module(series).
%% The export statement contains a list of all those functions that form
%% the module's public API. In this case, this module exposes a single
%% function called fib that takes 1 argument (I.E. has an arity of 1)
%% The general syntax for -export is a list containing the name and
%% arity of each public function
-export([fib/1]).
%% ---------------------------------------------------------------------
%% Public API
%% ---------------------------------------------------------------------
%% Handle cases in which fib/1 receives specific values
%% The order in which these function signatures are declared is a vital
%% part of this module's functionality
%% If fib/1 is passed precisely the integer 0, then return 0
fib(0) -> 0;
%% If fib/1 receives a negative number, then return the atom err_neg_val
%% Normally, such defensive coding is discouraged due to Erlang's 'Let
%% it Crash' philosophy; however, in this case we should explicitly
%% prevent a situation that will crash Erlang's runtime engine
fib(N) when N < 0 -> err_neg_val;
%% If fib/1 is passed an integer less than 3, then return 1
%% The preceding two function signatures handle all cases where N < 1,
%% so this function signature handles cases where N = 1 or N = 2
fib(N) when N < 3 -> 1;
%% For all other values, call the private function fib_int/3 to perform
%% the calculation
fib(N) -> fib_int(N, 0, 1).
%% ---------------------------------------------------------------------
%% Private API
%% ---------------------------------------------------------------------
%% If fib_int/3 receives a 1 as its first argument, then we're done, so
%% return the value in argument B. Since we are not interested in the
%% value of the second argument, we denote this using _ to indicate a
%% "don't care" value
fib_int(1, _, B) -> B;
%% For all other argument combinations, recursively call fib_int/3
%% where each call does the following:
%% - decrement counter N
%% - Take the previous fibonacci value in argument B and pass it as
%% argument A
%% - Calculate the value of the current fibonacci number and pass it
%% as argument B
fib_int(N, A, B) -> fib_int(N-1, B, A+B).
Oto ten sam program bez komentarzy wyjaśniających:
-module(series).
-export([fib/1]).
fib(0) -> 0;
fib(N) when N < 0 -> err_neg_val;
fib(N) when 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).
Szybkie sortowanie
Szybkie sortowanie w Erlangu przy użyciu rozumienia listy :
%% qsort:qsort(List)
%% Sort a list of items
-module(qsort). % This is the file 'qsort.erl'
-export([qsort/1]). % A function 'qsort' with 1 parameter is exported (no type, no name)
qsort([]) -> []; % If the list [] is empty, return an empty list (nothing to sort)
qsort([Pivot|Rest]) ->
% Compose recursively a list with 'Front' for all elements that should be before 'Pivot'
% then 'Pivot' then 'Back' for all elements that should be after 'Pivot'
qsort([Front || Front <- Rest, Front < Pivot]) ++
[Pivot] ++
qsort([Back || Back <- Rest, Back >= Pivot]).
Powyższy przykład rekursywnie wywołuje funkcję, qsort
dopóki nic nie pozostanie do posortowania. Wyrażenie [Front || Front <- Rest, Front < Pivot]
jest listą składaną , co oznacza „Zbuduj listę elementów Front
, które Front
są członkami Rest
i Front
są mniejsze niż Pivot
”. ++
jest operatorem konkatenacji listy.
Funkcja porównania może być używana dla bardziej skomplikowanych struktur ze względu na czytelność.
Poniższy kod posortuje listy według długości:
% This is file 'listsort.erl' (the compiler is made this way)
-module(listsort).
% Export 'by_length' with 1 parameter (don't care about the type and name)
-export([by_length/1]).
by_length(Lists) -> % Use 'qsort/2' and provides an anonymous function as a parameter
qsort(Lists, fun(A,B) -> length(A) < length(B) end).
qsort([], _)-> []; % If list is empty, return an empty list (ignore the second parameter)
qsort([Pivot|Rest], Smaller) ->
% Partition list with 'Smaller' elements in front of 'Pivot' and not-'Smaller' elements
% after 'Pivot' and sort the sublists.
qsort([X || X <- Rest, Smaller(X,Pivot)], Smaller)
++ [Pivot] ++
qsort([Y || Y <- Rest, not(Smaller(Y, Pivot))], Smaller).
A Pivot
jest pobierane z pierwszego podanego parametru, qsort()
a reszta Lists
to nazwana Rest
. Zauważ, że wyrażenie
[X || X <- Rest, Smaller(X,Pivot)]
nie różni się formą od
[Front || Front <- Rest, Front < Pivot]
(w poprzednim przykładzie) z wyjątkiem użycia funkcji porównania w ostatniej części, mówiącej "Skonstruuj listę elementów X
takich, które X
są członkiem Rest
i Smaller
są prawdziwe", z Smaller
wcześniejszym zdefiniowaniem jako
fun(A,B) -> length(A) < length(B) end
Funkcja anonimowa nosi nazwę Smaller
na liście parametrów drugiej definicji, qsort
aby można było się do niej odwoływać pod tą nazwą w ramach tej funkcji. Nie jest nazwana w pierwszej definicji qsort
, która dotyczy przypadku bazowego pustej listy i dlatego nie potrzebuje tej funkcji, nie mówiąc już o jej nazwie.
Typy danych
Erlang ma osiem prymitywnych typów danych :
- Liczby całkowite
- Liczby całkowite są zapisywane jako ciągi cyfr dziesiętnych, na przykład 12, 12375 i -23427 są liczbami całkowitymi. Arytmetyka liczb całkowitych jest dokładna i ograniczona jedynie dostępną pamięcią w komputerze. (To się nazywa arytmetyka z arbitralną precyzją .)
- Atomy
- Atomy są używane w programie do oznaczania wyróżnionych wartości. Są zapisywane jako ciągi kolejnych znaków alfanumerycznych, przy czym pierwszym znakiem jest mała litera. Atomy mogą zawierać dowolny znak, jeśli są ujęte w pojedyncze cudzysłowy i istnieje konwencja ucieczki, która pozwala na użycie dowolnego znaku w atomie. Atomy nigdy nie są zbierane i powinny być używane z ostrożnością, zwłaszcza jeśli używasz dynamicznego generowania atomów.
- Pływa
- Liczby zmiennoprzecinkowe wykorzystują 64-bitową reprezentację IEEE 754 .
- Bibliografia
- Referencje to globalnie unikalne symbole, których jedyną właściwością jest to, że można je porównywać pod kątem równości. Są one tworzone przez ocenę prymitywu Erlanga
make_ref()
. - Binaria
- Plik binarny to sekwencja bajtów. Pliki binarne zapewniają oszczędny sposób przechowywania danych binarnych. Prymitywy Erlanga istnieją do komponowania i dekomponowania plików binarnych oraz do wydajnego wprowadzania/wyprowadzania plików binarnych.
- Pidowie
- Pid jest skrótem od identyfikatora procesu – Pid jest tworzony przez prymitywne Erlanga
spawn(...)
Pids są odniesieniami do procesów Erlanga. - Porty
- Porty służą do komunikacji ze światem zewnętrznym. Porty są tworzone za pomocą wbudowanej funkcji
open_port
. Wiadomości mogą być wysyłane i odbierane z portów, ale te wiadomości muszą być zgodne z tak zwanym „protokołem portu”. - Funs
- Funs to zamknięcia funkcji . Zabawy tworzą wyrażenia postaci:
fun(...) -> ... end
.
Oraz trzy złożone typy danych:
- Krotki
- Krotki to kontenery dla stałej liczby typów danych Erlang. Składnia
{D1,D2,...,Dn}
oznacza krotkę, której argumentami sąD1, D2, ... Dn.
Argumenty mogą być pierwotnymi typami danych lub złożonymi typami danych. Do każdego elementu krotki można uzyskać dostęp w stałym czasie. - Listy
- Listy to pojemniki na zmienną liczbę typów danych Erlang. Składnia
[Dh|Dt]
oznacza listę, której pierwszym elementem jestDh
, a pozostałymi elementami jest listaDt
. Składnia[]
oznacza pustą listę. Składnia[D1,D2,..,Dn]
jest skrótem od[D1|[D2|..|[Dn|[]]]]
. Dostęp do pierwszego elementu listy można uzyskać w stałym czasie. Pierwszy element listy jest nazywany głowica z listy. Pozostała część listy po usunięciu jej nagłówka nazywana jest końcem listy. - Mapy
- Mapy zawierają zmienną liczbę powiązań klucz-wartość. Składnia to
#{Key1=>Value1,...,KeyN=>ValueN}
.
Dostępne są dwie formy cukru syntaktycznego :
- Smyczki
- Ciągi są zapisywane jako podwójnie cytowane listy znaków. Jest to cukier składniowy dla listy całkowitych punktów kodowych Unicode dla znaków w łańcuchu. Na przykład ciąg „cat” jest skrótem nazwy
[99,97,116]
. - Dokumentacja
- Rekordy zapewniają wygodny sposób kojarzenia znacznika z każdym elementem w krotce. Dzięki temu można odwoływać się do elementu krotki według nazwy, a nie według pozycji. Prekompilator pobiera definicję rekordu i zastępuje ją odpowiednim odwołaniem do krotki.
Erlang nie ma metody definiowania klas, chociaż dostępne są biblioteki zewnętrzne .
Styl kodowania „Let it crash”
Erlang został zaprojektowany z mechanizmem, który ułatwia zewnętrznym procesom monitorowanie awarii (lub awarii sprzętu), a nie mechanizmem w procesie, takim jak obsługa wyjątków, używanym w wielu innych językach programowania. Awarie są zgłaszane jak inne wiadomości, co jest jedynym sposobem, w jaki procesy mogą się ze sobą komunikować, a podprocesy można tanio tworzyć. Filozofia „niech się zawiesza” woli, aby proces został całkowicie ponownie uruchomiony, niż próba odzyskania go po poważnej awarii. Chociaż nadal wymaga obsługi błędów, ta filozofia skutkuje mniejszą ilością kodu poświęconego programowaniu defensywnemu, gdzie kod obsługi błędów jest wysoce kontekstowy i specyficzny.
Nadzorca drzew
Typowa aplikacja Erlanga jest napisana w formie drzewa nadzorców. Ta architektura opiera się na hierarchii procesów, w której proces najwyższego poziomu jest nazywany „nadzorcą”. Nadzorca następnie tworzy wiele procesów podrzędnych, które działają jako pracownicy lub więcej, nadzorcy niższego poziomu. Takie hierarchie mogą istnieć do dowolnej głębokości i okazały się zapewniać wysoce skalowalne i odporne na błędy środowisko, w którym można zaimplementować funkcjonalność aplikacji.
W drzewie nadzorcy wszystkie procesy nadzorcy są odpowiedzialne za zarządzanie cyklem życia swoich procesów podrzędnych, co obejmuje obsługę sytuacji, w których te procesy podrzędne ulegają awarii. Każdy proces może zostać nadzorcą, najpierw tworząc proces podrzędny, a następnie wywołując erlang:monitor/2
ten proces. Jeśli monitorowany proces ulegnie awarii, nadzorca otrzyma wiadomość zawierającą krotkę, której pierwszym elementem jest atom 'DOWN'
. Przełożony jest odpowiedzialny po pierwsze za nasłuchiwanie takich komunikatów, a po drugie za podjęcie odpowiednich działań w celu naprawienia stanu błędu.
Współbieżność i orientacja na dystrybucję
Główną siłą Erlanga jest obsługa współbieżności . Ma mały, ale potężny zestaw prymitywów do tworzenia procesów i komunikowania się między nimi. Erlang jest koncepcyjnie podobny do języka occam , chociaż przekształca idee komunikowania procesów sekwencyjnych (CSP) w ramach funkcjonalnych i wykorzystuje asynchroniczne przekazywanie komunikatów. Procesy są podstawowym sposobem tworzenia struktury aplikacji Erlang. Nie są to ani procesy systemu operacyjnego, ani wątki , ale lekkie procesy zaplanowane przez BEAM. Podobnie jak procesy systemu operacyjnego (ale w przeciwieństwie do wątków systemu operacyjnego), nie współdzielą ze sobą stanu. Szacowany minimalny narzut dla każdego z nich to 300 słów . W ten sposób można stworzyć wiele procesów bez obniżania wydajności. W 2005 r. test z 20 milionami procesów został pomyślnie przeprowadzony z 64-bitowym Erlangiem na maszynie z 16 GB pamięci o dostępie swobodnym (RAM; łącznie 800 bajtów na proces). Erlang obsługuje symetryczne przetwarzanie wieloprocesorowe od wydania R11B z maja 2006 roku.
Podczas gdy wątki wymagają obsługi bibliotek zewnętrznych w większości języków, Erlang zapewnia funkcje na poziomie języka do tworzenia procesów i zarządzania nimi w celu uproszczenia programowania współbieżnego. Chociaż cała współbieżność jest jawna w Erlang, procesy komunikują się za pomocą przekazywania komunikatów zamiast wspólnych zmiennych, co eliminuje potrzebę jawnych blokad (schemat blokowania jest nadal używany wewnętrznie przez maszynę wirtualną).
Komunikacja między procesami działa za pośrednictwem asynchronicznego systemu przekazywania wiadomości bez współużytkowania : każdy proces ma „skrzynkę pocztową”, kolejkę wiadomości, które zostały wysłane przez inne procesy i jeszcze nie zostały wykorzystane. Proces używa prymitywu do pobierania komunikatów, które pasują do pożądanych wzorców. Procedura obsługi wiadomości testuje wiadomości po kolei pod kątem każdego wzorca, dopóki jeden z nich nie będzie pasował. Gdy wiadomość zostanie zużyta i usunięta ze skrzynki pocztowej, proces wznawia wykonywanie. Wiadomość może zawierać dowolną strukturę Erlanga, w tym elementy podstawowe (liczby całkowite, zmiennoprzecinkowe, znaki, atomy), krotki, listy i funkcje.
receive
Poniższy przykład kodu pokazuje wbudowaną obsługę procesów rozproszonych:
% Create a process and invoke the function web:start_server(Port, MaxConnections)
ServerProcess = spawn(web, start_server, [Port, MaxConnections]),
% Create a remote process and invoke the function
% web:start_server(Port, MaxConnections) on machine RemoteNode
RemoteProcess = spawn(RemoteNode, web, start_server, [Port, MaxConnections]),
% Send a message to ServerProcess (asynchronously). The message consists of a tuple
% with the atom "pause" and the number "10".
ServerProcess ! {pause, 10},
% Receive messages sent to this process
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.
Jak pokazuje przykład, procesy mogą być tworzone na zdalnych węzłach, a komunikacja z nimi jest transparentna w tym sensie, że komunikacja z procesami zdalnymi działa dokładnie tak samo, jak komunikacja z procesami lokalnymi.
Współbieżność obsługuje podstawową metodę obsługi błędów w Erlang. Gdy proces ulegnie awarii, starannie wychodzi i wysyła wiadomość do procesu kontrolującego, który może następnie podjąć działania, takie jak uruchomienie nowego procesu, który przejmuje zadanie starego procesu.
Realizacja
Oficjalna implementacja referencyjna Erlanga wykorzystuje BEAM. BEAM znajduje się w oficjalnej dystrybucji Erlanga o nazwie Erlang/OTP. BEAM wykonuje kod bajtowy, który jest konwertowany na kod wątkowy w czasie ładowania. Zawiera również natywny kompilator kodu dla większości platform, opracowany przez High Performance Erlang Project (HiPE) na Uniwersytecie w Uppsali . Od października 2001 system HiPE jest w pełni zintegrowany z otwartym systemem Erlang/OTP firmy Ericsson. Obsługuje również interpretację, bezpośrednio z kodu źródłowego za pomocą abstrakcyjnego drzewa składni , za pomocą skryptu od wersji R11B-5 Erlanga.
Ładowanie kodu i modułów na gorąco
Erlang obsługuje dynamiczne aktualizowanie oprogramowania na poziomie języka . Aby to zaimplementować, kod jest ładowany i zarządzany jako jednostki „modułów”; moduł jest jednostką kompilacyjną . System może jednocześnie przechowywać w pamięci dwie wersje modułu, a procesy mogą jednocześnie uruchamiać kod z każdej z nich. Wersje określane są jako „nowa” i „stara”. Proces nie przejdzie do nowej wersji, dopóki nie wykona połączenia zewnętrznego do swojego modułu.
Przykładowy mechanizm ładowania gorącego kodu:
%% A process whose only job is to keep a counter.
%% First version
-module(counter).
-export([start/0, codeswitch/1]).
start() -> loop(0).
loop(Sum) ->
receive
{increment, Count} ->
loop(Sum+Count);
{counter, Pid} ->
Pid ! {counter, Sum},
loop(Sum);
code_switch ->
?MODULE:codeswitch(Sum)
% Force the use of 'codeswitch/1' from the latest MODULE version
end.
codeswitch(Sum) -> loop(Sum).
W drugiej wersji dodajemy możliwość zresetowania licznika do zera.
%% Second version
-module(counter).
-export([start/0, codeswitch/1]).
start() -> loop(0).
loop(Sum) ->
receive
{increment, Count} ->
loop(Sum+Count);
reset ->
loop(0);
{counter, Pid} ->
Pid ! {counter, Sum},
loop(Sum);
code_switch ->
?MODULE:codeswitch(Sum)
end.
codeswitch(Sum) -> loop(Sum).
Dopiero po odebraniu wiadomości składającej się z atomu code_switch
pętla wykona zewnętrzne wywołanie codeswitch/1 ( ?MODULE
jest to makro preprocesora dla bieżącego modułu). Jeżeli w pamięci znajduje się nowa wersja modułu licznika , to zostanie wywołana jego funkcja codeswitch/1. Praktyka posiadania określonego punktu wejścia do nowej wersji pozwala programiście na przekształcenie stanu do tego, co jest potrzebne w nowszej wersji. W tym przykładzie stan jest przechowywany jako liczba całkowita.
W praktyce systemy są budowane przy użyciu zasad projektowania z platformy Open Telecom, co prowadzi do większej liczby projektów, które można aktualizować w kodzie. Pomyślne wczytywanie gorącego kodu jest wymagające. Kod musi być napisany z rozwagą, aby korzystać z udogodnień Erlanga.
Dystrybucja
W 1998 roku firma Ericsson wydała Erlang jako bezpłatne oprogramowanie o otwartym kodzie źródłowym, aby zapewnić mu niezależność od jednego dostawcy i zwiększyć świadomość tego języka. Erlang wraz z bibliotekami i rozproszoną w czasie rzeczywistym bazą danych Mnesia tworzy zbiór bibliotek OTP. Ericsson i kilka innych firm wspiera komercyjnie Erlang.
Od czasu wydania open source Erlang jest używany przez kilka firm na całym świecie, w tym Nortel i T-Mobile . Chociaż Erlang został zaprojektowany, aby wypełnić niszę i przez większość swojego istnienia pozostał mało znanym językiem, jego popularność rośnie ze względu na zapotrzebowanie na usługi równoczesne. Erlang znalazł pewne zastosowanie w udostępnianiu serwerów gier MMORPG (MMORPG).
Zobacz też
- Elixir – funkcjonalny, współbieżny język programowania ogólnego przeznaczenia, który działa na BEAM
- Luerl - Lua na BEAM, zaprojektowany i wdrożony przez jednego z twórców Erlanga.
- Lisp Flavored Erlang (LFE) – język programowania oparty na Lispie, który działa na BEAM
- Mix (narzędzie do budowania)
- Phoenix (struktura internetowa)
Bibliografia
Dalsza lektura
-
Armstrong, Joe (2003). „Tworzenie niezawodnych systemów rozproszonych w obecności błędów oprogramowania” (PDF) . Rozprawa doktorska. Królewski Instytut Technologiczny, Sztokholm, Szwecja. Zarchiwizowane z oryginału w dniu 23 marca 2015 roku . Źródło 13 lutego 2016 . Cytowanie dziennika wymaga
|journal=
( pomoc ) CS1 maint: bot: oryginalny status URL nieznany ( link ) - Armstrong, Joe (2007). „Historia Erlanga”. Materiały z trzeciej konferencji ACM SIGPLAN Historia języków programowania – HOPL III . s. 6–1. doi : 10.1145/1238844.1238850 . Numer ISBN 978-1-59593-766-7. S2CID 555765 .
- Wczesna historia Erlangu autorstwa Bjarne Däcker
- Mattsson, H.; Nilsson, H.; Wikstrom, C. (1999). „Mnesia – Rozproszony, solidny DBMS do zastosowań telekomunikacyjnych”. Pierwsze międzynarodowe warsztaty na temat praktycznych aspektów języków deklaratywnych (PADL '99) : 152–163 .
- Armstrong, Joe; Virding, Robert; Williamsa, Mike'a; Wikstrom, Claes (16 stycznia 1996). Programowanie współbieżne w Erlangu (2nd ed.). Sala urzędnicza . P. 358. Numer ISBN 978-0-13-508301-7. Zarchiwizowane od oryginału w dniu 6 marca 2012 r.
- Armstrong, Joe (11 lipca 2007). Programowanie Erlang: Oprogramowanie dla współbieżnego świata (1st ed.). Regał pragmatyczny . P. 536 . Numer ISBN 978-1-934356-00-5.
- Thompson, Simon J.; Cesarini, Francesco (19 czerwca 2009). Programowanie Erlanga: współbieżne podejście do tworzenia oprogramowania (1st ed.). Sebastopol, Kalifornia: O'Reilly Media , Inc. 496. ISBN 978-0-596-51818-9.
- Logan, Martin; Merritt, Eric; Carlsson, Richard (28 maja 2010). Erlang i OTP w akcji (wyd. 1). Greenwich, CT: Manning Publikacje . P. 500. ISBN 978-1-933988-78-8.
- Martin, Brown (10 maja 2011). „Wprowadzenie do programowania w Erlangu, część 1: Podstawy” . developerWorks . IBM . Źródło 10 maja 2011 .
- Martin, Brown (17 maja 2011). „Wprowadzenie do programowania w Erlangu, część 2: Wykorzystanie zaawansowanych funkcji i funkcjonalności” . developerWorks . IBM . Źródło 17 maja 2011 .
- Wiger, Ulf (30 marca 2001). „Czterokrotny wzrost wydajności i jakości: przemysłowe programowanie funkcjonalne w produktach klasy telekomunikacyjnej” (PDF) . FemSYS 2001 Wdrażanie na architekturach rozproszonych . Ericsson Telecom AB . Pobrano 16 września 2014 .