Learning Erlang vs learning node.js [chiuso]

41

Vedo un sacco di cazzate online su come Erlang calci il culo di node.js in quasi ogni categoria immaginabile. Quindi mi piacerebbe imparare Erlang e dargli una possibilità, ma ecco il problema. Sto scoprendo che ho un tempo molto più difficile a raccogliere Erlang di quanto ho fatto raccogliendo node.js. Con node.js, potevo scegliere un progetto relativamente complesso, e in un giorno avevo qualcosa di funzionante. Con Erlang, mi imbatto in barriere e non sto andando quasi altrettanto rapidamente.

Quindi .. per chi ha più esperienza, Erlang è complicato da imparare o mi manca qualcosa? Node.js potrebbe non essere perfetto, ma mi sembra di poterlo fare.

    
posta Noli 21.06.2011 - 23:19
fonte

3 risposte

46

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.

    
risposta data 22.06.2011 - 04:14
fonte
38

Erlang non è complicato da imparare, è semplicemente estraneo alla mentalità che la costante di Chambers (99,44%) dei programmatori ha imparato come funziona la programmazione. Il problema che stai affrontando è probabilmente solo disorientamento concettuale piuttosto che effettiva complessità.

Ecco alcune delle caratteristiche aliene di Erlang che stanno per mordere un tipico programmatore:

  • Erlang è un linguaggio di programmazione (per lo più) funzionale. I linguaggi di programmazione più comuni sono quasi militarmente indispensabili.
  • Il modello di concorrenza di Erlang è il modello di attore. I linguaggi di programmazione più comuni utilizzano threading basato su lock o qualche forma di approccio basato sul reattore alla concorrenza. (Penso che Node.js sia l'ultimo, ma non chiamarmi su di esso - Non ho alcun interesse per JavaScript su qualsiasi lato della relazione client / server.)
  • Erlang ha un approccio "lascia che si blocca" alla codifica con potenti funzionalità di runtime disponibili per catturare questi arresti anomali, diagnosticarli e correggerli a caldo mentre il sistema è in esecuzione. I linguaggi di programmazione più comuni supportano uno stile di programmazione strongmente difensivo.
  • Erlang è quasi, ma non del tutto, inestricabilmente abbinato a una libreria ampia e moderatamente cerebrale di architetture di uso comune per server affidabili e stabili (OTP). (C'è una ragione per cui Erlang viene in genere chiamato Erlang / OTP.) Inoltre questa libreria è costruita sulle caratteristiche aliene menzionate in precedenza ed è quindi opaca per i nuovi arrivati. La maggior parte dei linguaggi di programmazione ha meno librerie onnicomprensive (nonostante Java EE) con cui lavorare e tali librerie sono, naturalmente, costruite su concetti che sono più familiari alla maggior parte dei programmatori.

Quindi, l'apprendimento di Erlang sarà più una sfida per la maggior parte dei programmatori rispetto all'apprendimento di Node.js - specialmente se il programmatore ha già familiarità con JavaScript. Alla fine, tuttavia, una volta superata la barriera concettuale, ritengo che la codifica di Erlang sarà less complessa rispetto alla codifica Node.js equivalente. Questo è per diversi motivi:

  • Il modello di concorrenza di Erlang rende il flusso logico molto più chiaro rispetto alla tipica concorrenza in stile "reattore" e rende la concorrenza molto più stabile e corretta rispetto alla concorrenza tipica basata su lock. Non è quasi affatto un problema per un programmatore di Erlang far cadere letteralmente migliaia di processi in un programma tipico mentre si fanno cadere migliaia di thread, per esempio, Java sarebbe un incubo di contese (per non parlare della memoria e il sovraccarico della CPU coinvolti) e l'equivalente di mantenere migliaia di stati separati in una configurazione basata sul "reattore" sarebbe un incubo da leggere.
  • Essendo un linguaggio (per lo più) funzionale, Erlang è decisamente una configurazione "ciò che vedi è ciò che ottieni". Le variabili, una volta impostate, non cambiano. Mai. Non c'è OOP "azione spettrale a distanza" per confonderti: tutto ciò con cui lavori è esplicitamente disposto di fronte a te. Non ci sono variabili ereditate da X e nessuna variabile di classe da Y e nessuna variabile globale da Z con cui occuparsi. (Quest'ultimo punto non è vero al 100%, ma è vero in un numero così grande di casi che è abbastanza buono per la tua fase di apprendimento.)
  • Le potenti funzionalità di Erlang per la gestione degli errori ti consentono di ingombrare il tuo codice con una programmazione meno difensiva, mantenendo così la logica più chiara e mantenendo il codice ridotto.
  • La libreria OTP, una volta terminata, è una pila incredibilmente potente di codice comune che mantiene l'intera applicazione regolare e copre molti dei problemi e utilizza casi di server di lunga durata a cui probabilmente non penserai finché non sarà troppo tardi. La libreria OTP stessa è, IM (ns) HO una ragione sufficiente per imparare Erlang.

Continua ad allontanarti da Erlang se puoi, e se non lo hai ancora fatto, vai a visitare Impara alcuni Erlang per il grande bene per un'introduzione gentile e (soprattutto) divertente ai concetti di Erlang.

    
risposta data 22.06.2011 - 03:42
fonte
9

Ci sono alcune differenze significative tra Erlang e Node

Il primo è che il nodo è Javascript, il che significa che è un linguaggio molto comune che condivide molti tratti con lingue a cui più persone hanno familiarità, quindi di solito è molto più facile da far funzionare. Erlang ha una sintassi spesso strana e sconosciuta per molti, e sebbene il linguaggio sia molto più semplice di javascript, ci vuole un po 'di tempo per abituarsi alla sua unicità

Il secondo è che Erlang ha un modello di concorrenza concorrente molto particolare, che richiede di pensare in un modo diverso per risolvere i problemi, che è una cosa buona (TM)

L'ultimo importante è che Erlang è stato sviluppato da una società commerciale e open source dopo il fatto, era solo 2 anni fa o giù di lì che le persone potevano effettivamente vedere singoli commit nel controllo del codice sorgente e anche ora non penso tutto gli sviluppatori si sono spostati al pubblico repo github per il loro sviluppo. node.js è stato creato all'interno della comunità sin dall'inizio, questo significa che il supporto della comunità è di gran lunga migliore, ci sono già molte più librerie per il nodo, più documentazione della comunità, più esempi dal vivo, un gestore di pacchetti onnipresente ecc. Erlang sta recuperando a questo proposito, ma è ancora una rampa molto più grande per alzarsi.

Il nodo ti consente di programmare cose divertenti in modo abbastanza rapido e relativamente privo di dolore, ma ha ancora dolori crescenti per quanto riguarda le applicazioni di grandi dimensioni che l'erlang ha risolto da molto tempo. Erlang cambierà il tuo modo di programmare e (imo) renderti un programmatore migliore, ma all'inizio non ti renderà la vita facile. Entrambi sono divertenti in diversi modi.

    
risposta data 22.06.2011 - 04:04
fonte

Leggi altre domande sui tag