Prima di tutto, sono d'accordo con JUST MY la risposta corretta OPINION riguardo all'apprendimento di Erlang. È un linguaggio per lo più funzionale (sebbene la concorrenza abbia un ruolo importante) e tutte le sue funzionalità sono state aggiunte per andare verso tolleranza ai guasti e robustezza, che non sono esattamente gli stessi obiettivi di design di Javascript in primo luogo.
In secondo luogo, lasciare Node.js per entrare in Erlang è un po 'fuori luogo. Node.js è un singolo server / framework che fa il suo modo di fare tutto in un modo guidato dagli eventi con l'aiuto di callback. Erlang ha il suo framework (OTP), ma non è dello stesso livello.
Se hai intenzione di imparare Erlang, ti suggerisco di inserire il mio blog An Apri lettera al principiante di Erlang (o spettatore) come lettura introduttiva prima di immergerti nei tutorial.
L'unica cosa che puoi confrontare con Erlang e Node.js, in termini di modelli e utilizzo è il modo in cui sono guidati dagli eventi. Tuttavia, ci sono due grandi differenze principali qui. Il modello di Node.js è basato su callback legati agli eventi. Erlang si basa su code di messaggi e ricezioni selettive. Quali sono le implicazioni in là?
Prima di tutto, se fai cose in un modo basato su callback, l'unico modo in cui porti lo stato è di averlo globale o di entrare nella programmazione degli stili che passa continuamente. In secondo luogo, devi prenderti cura della matrice di eventi completa da solo. Un esempio di ciò è che se immaginiamo una macchina a stati finiti molto semplice: un semaforo mutex, event-driven.
Il semaforo mutex ha due stati: bloccato e libero. Ogni volta che una determinata unità di calcolo (lavoratore, processo, funzione o thread) vuole ottenere l'accesso al mutex, deve attivare un evento che indichi "Sono interessato". Ora devi occuparti dei seguenti tipi di eventi:
- Il mutex è gratuito e chiedi di ottenere il blocco
- Il mutex è bloccato da qualcun altro e tu vuoi ottenere il blocco
- Il mutex è bloccato da solo e tu vuoi liberare il mutex
Poi hai altri eventi da considerare, come il timeout per evitare deadlock:
- Il mutex è stato bloccato e hai aspettato troppo a lungo, un timer per spegnere gli incendi
- Il mutex è stato bloccato e hai aspettato troppo a lungo, ottenuto il blocco, quindi il timeout si è spento
Poi hai anche gli eventi fuori limite:
- hai appena bloccato il mutex mentre alcuni lavoratori si aspettavano che fosse libero. Ora la query di quel lavoratore deve essere accodata in modo che, quando è gratuita, venga gestita nuovamente
- Devi eseguire tutto il lavoro asincrono
La matrice degli eventi diventa complessa molto velocemente. Il nostro FSM qui ha solo 2 stati. Nel caso di Erlang (o di qualsiasi lingua con ricezione selettiva e asincrona con eventi potenzialmente sincroni), devi preoccuparti di alcuni casi:
- Il mutex è gratuito e chiedi di ottenere il blocco
- Il mutex è bloccato da qualcun altro e tu vuoi ottenere il blocco
- Il mutex è bloccato da solo e tu vuoi liberare il mutex
E questo è tutto. I timer vengono gestiti negli stessi casi in cui vengono eseguiti i ricevimenti e per tutto ciò che riguarda "aspetta fino a quando non è libero", i messaggi vengono automaticamente messi in coda: il lavoratore deve solo aspettare una risposta. Il modello è molto, molto più semplice in questi casi.
Ciò significa che, in generale, i modelli CPS e callback come quello in node.js ti chiedono di essere molto abile nel modo in cui gestisci gli eventi, o ti chiedono di occuparti di una matrice di eventi complessa in pieno, perché devi essere richiamato su ogni caso irrilevante che risulta da strani problemi di temporizzazione e cambiamenti di stato.
Le ricezioni selettive di solito consentono di concentrarsi solo su un sottogruppo di tutti gli eventi potenziali e consentono di ragionare con maggiore facilità sugli eventi in quel caso. Si noti che Erlang ha un comportamento (modello di progettazione / implementazione framework) di qualcosa chiamato gen_event
. L'implementazione gen_event ti consente di avere un meccanismo molto simile a quello che viene utilizzato in node.js se è quello che vuoi.
Ci saranno altri punti che li differenziano; Erlang ha una pianificazione preventiva mentre node.js lo rende cooperativo, Erlang è più adatto ad alcune applicazioni di grandi dimensioni (distribuzione e tutto), ma Node.js e la sua comunità sono solitamente più web-apt e ben informati sull'ultima tendenza del web. Si tratta di scegliere lo strumento migliore, e questo dipenderà dal tuo background, dal tuo tipo di problema e dalle tue preferenze. Nel mio caso, il modello di Erlang si adatta perfettamente al mio modo di pensare. Questo non è necessariamente il caso per tutti.
Spero che questo aiuti.