Learning Erlang vs learning node.js [geschlossen]

41

Ich sehe online eine Menge Mist darüber, wie Erlang node.js in fast jeder denkbaren Kategorie in den Arsch tritt. Ich würde gerne Erlang lernen und es ausprobieren, aber hier ist das Problem. Ich stelle fest, dass es mir viel schwerer fällt, Erlang aufzunehmen als node.js. Mit node.js konnte ich ein relativ komplexes Projekt auswählen, und an einem Tag funktionierte etwas. Mit Erlang stoße ich auf Barrieren und fahre nicht annähernd so schnell.

Also .. für diejenigen mit mehr Erfahrung, ist Erlang kompliziert zu lernen, oder fehle ich nur etwas? Node.js ist vielleicht nicht perfekt, aber ich scheine in der Lage zu sein, Dinge damit zu erledigen.

Noli
quelle
9
Vielleicht fehlt mir etwas, aber ist node.js keine JavaScript-Bibliothek und Erlang eine völlig andere Sprache? Wie sind sie überhaupt vergleichbar?
FrustratedWithFormsDesigner
3
@FrustratedWithFormsDesigner, node.js ist Teil eines aktuellen Trends / Hype, Javascript auf der Serverseite zu bekommen, mit einem Multithread-Ansatz, so dass sie vergleichbar sind
lurscher
5
@lurscher: Sie können Erlang (Sprache) nicht mit Node.js (serverseitiges JavaScript) vergleichen. Das wäre wie ein Vergleich von Java (Sprache) mit Django (Serverpython). Ganz zu schweigen von Erlang und JS.
Josh K
10
Als jemand, der sowohl Erlang als auch Node verwendet, sind sie in den von ihnen gelösten Problemen definitiv vergleichbar
Dale Harvey,
3
@ Noli gibt es einen Unterschied zwischen node.js und erlang. Sie meinten einen Vergleich zwischen node.js und erlang-basierten Webservern. Erlang hat viele Benutzer außerhalb von Webservern.
Raynos

Antworten:

46

Zuallererst stimme ich der Antwort von JUST MY correct OPINION in Bezug auf das Erlernen von Erlang zu. Es ist eine hauptsächlich funktionale Sprache (obwohl die Nebenläufigkeit eine große Rolle spielt), und alle Funktionen wurden hinzugefügt, um Fehlertoleranz und Robustheit zu gewährleisten, was nicht genau die gleichen Entwurfsziele wie bei Javascript darstellt.

Zweitens ist es etwas verlegt, Node.js zu verlassen, um in Erlang einzusteigen. Node.js ist ein einzelner Server / Framework, mit dem mithilfe von Callbacks alles ereignisgesteuert erledigt werden kann. Erlang hat ein eigenes Framework (OTP), aber es ist überhaupt nicht auf der gleichen Ebene.

Wenn Sie Erlang lernen möchten, empfehle ich meinen Blogeintrag Ein offener Brief an den Erlang-Anfänger (oder Onlooker) als Einführung, bevor Sie in Tutorials eintauchen .


Das einzige, in dem Sie Erlang und Node.js in Bezug auf Muster und Verwendung vergleichen können, ist, wie sie ereignisgesteuert sind. Hier gibt es jedoch zwei große Unterschiede. Das Modell von Node.js basiert auf Rückrufen, die an Ereignisse gebunden sind. Erlang basiert auf Nachrichtenwarteschlangen und empfängt selektiv. Welche Implikationen ergeben sich daraus?

Erstens, wenn Sie Dinge auf Callback-Basis erledigen, ist die einzige Art, wie Sie den Status herumtragen, entweder global zu sein oder in die fortlaufende Stilprogrammierung einzusteigen. Zweitens müssen Sie sich selbst um die vollständige Ereignismatrix kümmern. Ein Beispiel hierfür ist, wenn wir uns eine sehr einfache endliche Zustandsmaschine vorstellen: ein ereignisgesteuertes Mutex-Semaphor.

Das Mutex-Semaphor hat zwei Zustände: gesperrt und frei. Wenn eine bestimmte Recheneinheit (Worker, Prozess, Funktion oder Thread) Zugriff auf den Mutex erhalten möchte, muss sie ein Ereignis auslösen, das besagt, dass ich interessiert bin. Jetzt müssen Sie sich um folgende Arten von Ereignissen kümmern:

  • Der Mutex ist kostenlos und Sie fordern die Sperre an
  • Der Mutex ist von einer anderen Person gesperrt und Sie möchten die Sperre erhalten
  • Der Mutex ist von Ihnen selbst gesperrt und Sie möchten den Mutex freigeben

Dann müssen Sie zusätzliche Ereignisse berücksichtigen, z. B. Zeitüberschreitung, um Deadlocks zu vermeiden:

  • Der Mutex wurde gesperrt und Sie haben zu lange darauf gewartet, dass ein Timer zum Aufgeben ausgelöst wird
  • Der Mutex wurde gesperrt und Sie haben einfach zu lange gewartet, die Sperre erhalten und dann die Zeitüberschreitung ausgelöst

Dann haben Sie auch die Out-of-Bound-Ereignisse:

  • Sie haben gerade den Mutex gesperrt, während ein Arbeiter damit gerechnet hat, dass er frei ist. Jetzt muss die Anfrage des Arbeitnehmers in die Warteschlange gestellt werden, damit sie, wenn sie frei ist, wieder bearbeitet wird
  • Sie müssen die gesamte Arbeit asynchron machen

Die Ereignismatrix wird sehr schnell komplex. Unsere FSM hat hier nur 2 Zustände. Im Fall von Erlang (oder einer Sprache mit selektivem Empfang und Asynchronität mit potenziell synchronen Ereignissen) müssen Sie sich um einige Fälle kümmern:

  • Der Mutex ist kostenlos und Sie fordern die Sperre an
  • Der Mutex ist von einer anderen Person gesperrt und Sie möchten die Sperre erhalten
  • Der Mutex ist von Ihnen selbst gesperrt und Sie möchten den Mutex freigeben

Und das ist es. Die Zeitgeber werden in den gleichen Fällen behandelt wie die Empfangsvorgänge, und für alles, was mit "Warten bis es frei ist" zu tun hat, werden die Nachrichten automatisch in eine Warteschlange gestellt: Der Mitarbeiter muss nur auf eine Antwort warten. Das Modell ist in diesen Fällen sehr viel einfacher.

Dies bedeutet, dass in der Regel CPS- und Callback-basierte Modelle wie das in node.js Sie entweder auffordern, sehr geschickt mit Ereignissen umzugehen, oder Sie auffordern, sich vollständig um eine komplexe Ereignismatrix zu kümmern, weil Sie müssen bei jedem unwichtigen Fall zurückgerufen werden, der aus seltsamen Timing-Problemen und Statusänderungen resultiert.

Selektive Empfänge ermöglichen es Ihnen normalerweise, sich nur auf eine Untergruppe aller potenziellen Ereignisse zu konzentrieren, und ermöglichen es Ihnen, Ereignisse in diesem Fall weitaus einfacher zu beurteilen. Beachten Sie, dass Erlang ein Verhalten (Entwurfsmuster / Framework-Implementierung) von etwas hat, das aufgerufen wird gen_event. Mit der Implementierung von gen_event können Sie einen Mechanismus verwenden, der dem in node.js sehr ähnlich ist, wenn Sie dies wünschen.


Es wird andere Punkte geben, die sie unterscheiden; Erlang hat eine präventive Zeitplanung, während node.js kooperativ ist. Erlang eignet sich eher für einige sehr umfangreiche Anwendungen (Distribution und alle), aber Node.js und seine Community sind in der Regel besser mit dem neuesten Webtrend vertraut. Es ist eine Frage der Wahl des besten Werkzeugs, und dies hängt von Ihrem Hintergrund, Ihrer Art von Problem und Ihren Vorlieben ab. In meinem Fall passt das Modell von Erlang einfach sehr gut zu meiner Denkweise. Dies ist nicht unbedingt für alle der Fall.

Hoffe das hilft.

Ich gebe schreckliche Ratschläge
quelle
Mehr zum reaktiven Programmieren und dazu in JS: blog.flowdock.com/2013/01/22/…
Bart
"Weil Sie in jedem unwichtigen Fall, der aus seltsamen Timing-Problemen und Zustandsänderungen resultiert, zurückgerufen werden müssen." - In Erlang müssen Sie immer noch mit Timern umgehen, und die Tatsache, dass Sie dies "in den gleichen Fällen wie beim Empfangen" tun, ändert (überhaupt) nichts an der Komplexität. Aus meiner Sicht (als Architekt von Systemen, die Milliarden von Anfragen pro Tag verarbeiten) sind die einzigen realistischen Unterschiede zwischen selektivem Empfang und node.js-Stil (a) die Frage "Was möchten wir standardmäßig tun" (mit node.js) Standardmäßig werden Ereignisse verarbeitet und Ereignisse werden von Erlang verschoben , sofern keine Übereinstimmung vorliegt.
No-Bugs Hare
... und (b) Lesbarkeit, einschließlich der Anzahl der Boilerplates (was in klassischen node.js ziemlich schlecht ist, aber mit dem neu eingeführten wait-Operator viel besser - und IMNSHO besser als der von Erlang - geworden ist) ... und auf jeden Fall Diese Unterschiede sind ziemlich kosmetisch (trotz der Eiferer auf beiden Seiten, die anders predigen).
No-Bugs Hare
38

Das Erlernen von Erlang ist nicht kompliziert, es ist nur für die Denkweise fremd, die die Chambers Constant (99,44%) der Programmierer bei der Arbeitsweise des Programmierens gelernt haben. Das Problem, mit dem Sie konfrontiert sind, ist wahrscheinlich eher eine konzeptionelle Desorientierung als eine tatsächliche Komplexität.

Hier sind einige der außerirdischen Eigenschaften von Erlang, die einen typischen Programmierer beißen werden:

  • Erlang ist eine (meist) funktionale Programmiersprache. Die meisten gängigen Programmiersprachen sind fast zwingend erforderlich.
  • Erlang's Concurrency-Modell ist das Actor-Modell. Die meisten gängigen Programmiersprachen verwenden entweder sperrenbasiertes Threading oder einen auf "Reaktoren" basierenden Ansatz zur gleichzeitigen Verwendung. (Ich denke, Node.js ist das letztere, aber ruf mich nicht an - ich habe kein Interesse an JavaScript auf jeder Seite der Client / Server-Beziehung.)
  • Erlang bietet einen "Let It Crash" -Ansatz für die Codierung mit leistungsstarken Laufzeitfunktionen, mit denen diese Abstürze abgefangen, diagnostiziert und während des Systembetriebs per Hot-Patch behoben werden können. Die meisten gängigen Programmiersprachen unterstützen einen stark defensiven Programmierstil.
  • Erlang ist fast, aber nicht ganz untrennbar mit einer großen und leicht verwirrenden Bibliothek häufig verwendeter Architekturen für zuverlässige und stabile Server (OTP) verbunden. (Es gibt einen Grund, warum Erlang in der Regel als Erlang / OTP bezeichnet wird.) Außerdem baut diese Bibliothek auf den bereits erwähnten Alien-Funktionen auf und ist daher für Neulinge undurchsichtig. Die meisten Programmiersprachen verfügen über weniger umfassende Bibliotheken (trotz Java EE), und diese Bibliotheken basieren natürlich auf Konzepten, die den meisten Programmierern besser bekannt sind.

Daher wird das Erlernen von Erlang für die meisten Programmierer eine größere Herausforderung sein als das Erlernen von Node.js - insbesondere, wenn der Programmierer bereits mit JavaScript vertraut ist. Am Ende gehe ich jedoch davon aus, dass die Erlang-Codierung weniger komplex sein wird als die entsprechende Node.js-Codierung , sobald Sie die konzeptionelle Barriere überwunden haben. Dies hat mehrere Gründe:

  • Das Parallelitätsmodell von Erlang macht den Logikfluss viel klarer als die typische Parallelität im "Reaktor" -Stil und macht die Parallelität viel stabiler und korrekter als die typische sperrenbasierte Parallelität. Es ist fast kein Problem für einen Erlang-Programmierer, buchstäblich Tausende von Prozessen in einem typischen Programm zu verwerfen, während Tausende von Threads in Java verworfen werden Das Äquivalent von Tausenden von getrennten Zuständen in einer "Reaktor" -basierten Konfiguration wäre ein Albtraum zu lesen.
  • Als (meistens) funktionale Sprache ist Erlang ein Setup, bei dem man sieht, was man bekommt. Einmal gesetzte Variablen ändern sich nicht. Je. Es gibt keine OOP "spukhafte Aktion auf Distanz", die Sie verwirren könnte: Alles, mit dem Sie arbeiten, ist explizit vor Ihnen angeordnet. Es gibt keine geerbten Variablen von X und keine Klassenvariablen von Y und keine globalen Variablen von Z, mit denen Sie sich befassen müssen. (Letzterer Punkt ist nicht zu 100% zutreffend, aber er trifft in einer so überwältigenden Anzahl von Fällen zu, dass er für Ihre Lernphase gut genug ist.)
  • Die leistungsstarken Funktionen von Erlang für die Fehlerbehandlung bedeuten, dass Sie Ihren Code mit weniger defensiver Programmierung überladen, wodurch die Logik klarer und der Code klein gehalten wird.
  • Die OTP-Bibliothek ist ein unglaublich leistungsfähiger Stapel gängiger Codes, der Ihre gesamte Anwendung regelmäßig verwaltet und viele der Probleme und Anwendungsfälle langlebiger Server abdeckt, an die Sie wahrscheinlich erst denken, wenn es zu spät ist. Die OTP-Bibliothek selbst ist IM (ns) HO ein guter Grund, Erlang zu lernen.

Machen Sie weiter mit Erlang, wenn Sie können, und wenn Sie es noch nicht getan haben, besuchen Sie Learn You Some Erlang for Great Good, um eine sanfte und (meistens) lustige Einführung in Erlang's Konzepte zu erhalten.

Nur meine richtige Meinung
quelle
Vielen Dank für diesen Beitrag. Ich lese gerade Erlang durch und bin in der Mitte des Buches, aber ich habe das Gefühl, dass ich alles wissen muss, bevor ich wirklich anfangen kann, etwas Mäßiges zu tun signifikant, und nicht nur Stück für Stück
Noli
1
Sobald Sie sich mit den Parallelitätsteilen des Buches befasst haben, werden Sie tatsächlich in der Lage sein, mäßig wichtige Dinge leicht genug zu tun.
NUR MEINE STELLUNGNAHME
"Erlang's Nebenläufigkeitsmodell macht den Logikfluss viel klarer als die typische" Reaktor "-ähnliche Nebenläufigkeit. Ich würde argumentieren, dass die asynchrone Verarbeitung von Reaktoren in der Tat jahrzehntelang ein Chaos war, mit dem Aufkommen von Zukünften und insbesondere von Warten auf den Operator ist es nicht das Fall mehr. Mit await können Sie Ihre ultraleichten Coroutinen so machen, als wären sie ein bisschen Threads (und ich bin mir nicht sicher, was JS angeht). In C ++ ist co_await so aufgebaut, dass es nicht nur auf Tausende, sondern auf Milliarden von herausragenden skaliert Coroutinen).
No-Bugs Hare
"Es ist der Denkweise fremd, dass die Chambers-Konstante (99,44%)" - und für jedes Industrieprojekt gilt dies als Big-Fat-Problem. Dieses Big Fat Problem würde bestehen, selbst wenn es keinen objektiven Grund für die Unbeliebtheit funktionaler Sprachen gäbe (mit denen ich nicht einverstanden bin, aber dies ist eine ganz andere und lange Geschichte).
No-Bugs Hare
10

Es gibt einige signifikante Unterschiede zwischen Erlang und Node

Der erste ist, dass der Knoten Javascript ist, was bedeutet, dass es sich um eine sehr verbreitete Sprache handelt, die viele Merkmale mit Sprachen teilt, mit denen mehr Menschen vertraut sind, so dass es in der Regel viel einfacher ist, sich in Betrieb zu nehmen. Erlang hat für die meisten eine oft seltsame und ungewohnte Syntax, und obwohl eine Sprache viel einfacher ist als Javascript, ist sie aufgrund ihrer Einzigartigkeit etwas gewöhnungsbedürftiger

Das zweite ist, dass Erlang ein ganz bestimmtes Modell der gemeinsamen Nutzung von nichts hat. Es erfordert, dass Sie auf eine andere Art und Weise denken, um Probleme zu lösen. Das ist eine gute Sache (TM).

Der letzte wichtige Punkt ist, dass Erlang von einem kommerziellen Unternehmen entwickelt und später als Open-Source-Unternehmen genutzt wurde. Es war erst etwa zwei Jahre her, dass die Leute tatsächlich einzelne Commits in der Quellcodeverwaltung sehen konnten, und selbst jetzt denke ich nicht, dass alle Erlang-Entwickler umgezogen sind an die Öffentlichkeit Github Repo für ihre Entwicklung. node.js wurde von Anfang an in der Community erstellt. Dies bedeutet, dass die Community-Unterstützung weitaus besser ist. Es gibt bereits weitaus mehr Bibliotheken für node, mehr Community-Dokumentation, mehr Live-Beispiele, einen allgegenwärtigen Paketmanager usw. usw. Erlang holt auf In dieser Hinsicht ist es aber immer noch eine viel größere Rampe, um aufzustehen.

Mit Node können Sie lustige Dinge ziemlich schnell und relativ schmerzfrei programmieren. Bei großen Anwendungen, die erlangt hat und die seit langer Zeit gelöst wurden, treten immer größere Probleme auf. Erlang wird die Art und Weise, wie Sie programmieren, verändern und Sie (imo) zu einem besseren Programmierer machen, aber es wird Ihnen das Leben am Anfang nicht leicht machen. Beides macht auf unterschiedliche Weise Spaß.

Dale Harvey
quelle
2
Erwähnenswert ist, dass die Node-Threads auch "nichts gemeinsam haben".
Tamlyn