Erlang è un linguaggio di programmazione funzionale progettato per costruire sistemi scalabili e tolleranti ai guasti, in particolare nel dominio delle applicazioni concorrenti e distribuite. È stato originariamente sviluppato da Ericsson alla fine degli anni '80 per creare sistemi telecom robusti. Le caratteristiche uniche di Erlang includono il supporto per processi leggeri, concorrenza basata sul passaggio di messaggi, scambio di codice a caldo e una forte enfasi sull'affidabilità. Oggi è ampiamente utilizzato in settori che richiedono alta disponibilità e sistemi distribuiti, come telecomunicazioni, applicazioni di messaggistica e sistemi di database.
Erlang è stato creato alla fine degli anni '80 da Joe Armstrong, Robert Virding e Mike Williams presso Ericsson, principalmente per rispondere alle esigenze dell'industria delle telecomunicazioni. Il linguaggio è stato sviluppato per facilitare la costruzione di sistemi su larga scala e tolleranti ai guasti in grado di gestire più chiamate e connessioni simultaneamente.
All'inizio degli anni '90, Ericsson ha riconosciuto il potenziale di Erlang oltre le telecomunicazioni. Nel 1998, Erlang è stato rilasciato come open source, il che ha permesso a una comunità più ampia di sviluppatori di contribuire alla sua crescita. Il movimento open source ha portato allo sviluppo della macchina virtuale BEAM, che esegue codice Erlang e si è evoluta per supportare altri linguaggi.
Erlang è attualmente mantenuto dal team Erlang/OTP e ha una comunità dedicata. Il ciclo di rilascio di Erlang è diventato più coerente, con aggiornamenti e miglioramenti regolari focalizzati su prestazioni, nuove funzionalità e documentazione migliorata. Il linguaggio ha anche ispirato lo sviluppo di Elixir, un linguaggio di programmazione moderno che gira sulla VM di Erlang e incorpora molti dei suoi principi, fornendo al contempo funzionalità aggiuntive.
Erlang è principalmente un linguaggio funzionale, il che significa che le funzioni sono cittadini di prima classe e possono essere passate come variabili.
double(X) -> X * 2.
I processi leggeri di Erlang consentono la creazione di migliaia di processi concorrenti senza un sovraccarico significativo.
spawn(fun() -> io:format("Ciao da un processo!~n") end).
I processi in Erlang comunicano utilizzando il passaggio di messaggi, che consente una comunicazione sicura senza stato condiviso.
Pid = spawn(fun() -> receive
{msg, Content} -> io:format("Ricevuto: ~s~n", [Content])
end end),
Pid ! {msg, "Ciao!"}.
Erlang utilizza il pattern matching, una caratteristica potente che consente di scrivere codice chiaro e conciso.
match(X) when X > 0 -> io:format("Numero positivo: ~B~n", [X]);
match(X) -> io:format("Numero non positivo: ~B~n", [X]).
Erlang supporta la tolleranza ai guasti attraverso la sua filosofia "lascia che si rompa", consentendo ai processi di fallire e di essere riavviati senza influenzare il sistema.
start_process() ->
spawn(fun() -> crash() end).
Erlang consente agli sviluppatori di modificare il codice nei sistemi in esecuzione senza fermarli.
%% Versione vecchia
-module(example).
-export([hello/0]).
hello() -> io:format("Versione Vecchia~n").
%% Nuova versione
-module(example).
-export([hello/0]).
hello() -> io:format("Nuova Versione~n").
I dati in Erlang sono immutabili, portando a meno bug e a una più facile comprensione del codice.
List = [1, 2, 3],
NewList = [4 | List].
Erlang ha funzionalità che consentono una facile distribuzione dei processi su nodi diversi.
net_adm:start() ->
net_adm:ping('other_node@hostname').
Erlang supporta i tipi di record per creare tipi di dati strutturati.
-record(person, {name, age}).
Person = #person{name="Alice", age=30}.
Erlang consente comprensioni di lista per generare e manipolare liste in modo conciso.
Squares = [X*X || X <- [1,2,3]].
Erlang viene eseguito sulla macchina virtuale BEAM, progettata per eseguire applicazioni concorrenti e tolleranti ai guasti. BEAM ottimizza le prestazioni e consente funzionalità come lo scambio di codice a caldo.
Ci sono diversi ambienti di sviluppo per Erlang, con Emacs e IntelliJ IDEA (con il plugin Erlang) tra i più popolari. Altri strumenti degni di nota includono editor specifici per Erlang come Erlide.
Per creare un progetto Erlang, tradizionalmente si utilizza lo strumento rebar3
, che gestisce le dipendenze e le compilazioni. Ad esempio, per creare un nuovo progetto, si esegue:
rebar3 new app myapp
Poi, puoi compilare il progetto con:
rebar3 compile
Erlang è ampiamente utilizzato nelle telecomunicazioni, nei sistemi di messaggistica e nelle applicazioni in tempo reale. Applicazioni notevoli includono:
I principali punti di forza di Erlang risiedono nel suo modello di concorrenza e nella tolleranza ai guasti, che lo distinguono da linguaggi come:
Tradurre codice da e verso Erlang può essere complesso a causa dei suoi paradigmi unici. Esistono strumenti come erl2cpp
per alcune traduzioni, ma non c'è uno strumento automatizzato diffuso per tutti i linguaggi. La traduzione manuale può comportare: