Prima di tutto, sono d'accordo con SOLO LA MIA OPINIONE corretta sulla risposta all'apprendimento di Erlang. È un linguaggio prevalentemente funzionale (sebbene la concorrenza giochi un ruolo importante) e tutte le sue caratteristiche sono state aggiunte per andare verso la tolleranza agli errori e la robustezza, che non è esattamente gli stessi obiettivi di progettazione 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 tutto il possibile per fare tutto in modo guidato dagli eventi con l'aiuto di callback. Erlang ha il suo framework (OTP), ma non è affatto allo stesso livello.
Se hai intenzione di imparare Erlang, suggerisco il mio post di blog Una lettera aperta al principiante di Erlang (o spettatore) come lettura introduttiva prima di immergersi nei tutorial.
L'unica cosa in cui puoi confrontare Erlang e Node.js, in termini di modelli e utilizzo è il modo in cui sono guidati dagli eventi. Tuttavia, ci sono due grandi differenze qui. Il modello di Node.js si basa sui callback associati agli eventi. Erlang si basa sulle code dei messaggi e sulla ricezione selettiva. Quali sono le implicazioni lì dentro?
Prima di tutto, se fai le cose in un modo basato sulla richiamata, l'unico modo per portare lo stato in giro è quello di averlo globale o entrare nella programmazione di stile di passaggio di continuazione. In secondo luogo, devi occuparti tu stesso della matrice completa degli eventi. Un esempio di ciò è che se immaginiamo una macchina a stati finiti molto semplice: un semaforo mutex, guidato da eventi.
Il semaforo mutex ha due stati: bloccato e libero. Ogni volta che una determinata unità di calcolo (lavoratore, processo, funzione o thread) desidera accedere al mutex, deve generare un evento che gli dice "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 si desidera ottenere il blocco
- Il mutex è bloccato da solo e si desidera liberare il mutex
Quindi hai altri eventi da considerare, come il timeout per evitare deadlock:
- Il mutex è stato bloccato e hai aspettato troppo a lungo, un timer per smettere di sparare
- Il mutex è stato bloccato e hai aspettato troppo a lungo, ottenuto il blocco, quindi il timeout è stato attivato
Quindi hai anche gli eventi fuori limite:
- hai appena bloccato il mutex mentre un lavoratore si aspettava che fosse libero. Ora la query di quel lavoratore deve essere messa in coda in modo che, quando è libera, venga gestita
- Devi rendere 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 asincrono 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 si desidera ottenere il blocco
- Il mutex è bloccato da solo e si desidera liberare il mutex
E questo è tutto. I timer vengono gestiti negli stessi casi in cui sono stati ricevuti e per tutto ciò che ha a che fare con "aspetta fino a quando è gratuito", i messaggi vengono automaticamente messi in coda: il lavoratore deve solo attendere una risposta. Il modello è molto, molto più semplice in questi casi.
Ciò significa che in casi generali, CPS e modelli basati su callback come quello in node.js o ti chiedono di essere molto intelligente nel modo in cui gestisci gli eventi, o ti chiedono di occuparti completamente di una matrice di eventi complessa, perché devi essere richiamato su ogni caso irrilevante che deriva da strani problemi di temporizzazione e cambiamenti di stato.
Le ricevute selettive di solito ti consentono di concentrarti solo in un sottogruppo di tutti i potenziali eventi e ti permettono di ragionare con molta più facilità sugli eventi in quel caso. Si noti che Erlang ha un comportamento (modello di progettazione / implementazione del 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 su larga scala (distribuzione e tutto), ma Node.js e la sua comunità sono di solito più adatti al web e ben informati sull'ultima tendenza 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 di tutti.
Spero che sia di aiuto.