it-swarm.dev

Lernen Erlang vs Lernen node.js

Ich sehe online viel Mist darüber, wie Erlang node.js in nahezu jede denkbare 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 gehe nicht annähernd so schnell.

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

41
Noli

Zunächst stimme ich der Antwort von NUR MEINER RICHTIGEN MEINUNG bezüglich des Lernens von Erlang zu. Es ist eine größtenteils funktionale Sprache (obwohl Parallelität eine große Rolle spielt), und alle ihre Funktionen wurden hinzugefügt, um Fehlertoleranz und Robustheit zu erreichen, was in erster Linie nicht genau die gleichen Designziele wie Javascript ist.

Zweitens ist es etwas verlegt, Node.js zu verlassen, um nach Erlang zu gelangen. Node.js ist ein einzelner Server/Framework, der alles mithilfe von Rückrufen ereignisgesteuert erledigt. 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 den Betrachter) als Intro-Lesung, 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 Hauptunterschiede. Das Modell von Node.js basiert auf Rückrufen, die an Ereignisse gebunden sind. Erlang basiert auf Nachrichtenwarteschlangen und selektivem Empfang. Was sind die Auswirkungen dort?

Zuallererst, wenn Sie Dinge auf Callback-basierter Weise tun, besteht die einzige Möglichkeit, den Status herumzutragen, darin, ihn entweder global zu haben oder sich mit der fortlaufenden Programmierung zu befassen. Zweitens müssen Sie sich selbst um die vollständige Ereignismatrix kümmern. Ein Beispiel hierfür ist, dass wir uns eine sehr einfache Finite-State-Maschine vorstellen: ein ereignisgesteuertes Mutex-Semaphor.

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

  • Der Mutex ist kostenlos und Sie bitten um das Schloss
  • Der Mutex wird 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. eine Zeitüberschreitung, um Deadlocks zu vermeiden:

  • Der Mutex wurde gesperrt und Sie haben zu lange gewartet, ein Timer, um das Feuer aufzugeben
  • Der Mutex wurde gesperrt und Sie haben einfach zu lange gewartet, die Sperre erhalten und dann das Timeout ausgelöst

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

  • sie haben den Mutex gerade gesperrt, während ein Mitarbeiter erwartet hat, dass er kostenlos ist. Jetzt muss die Abfrage des Arbeitnehmers in die Warteschlange gestellt werden, damit sie, wenn sie kostenlos ist, zurück bearbeitet wird
  • Sie müssen die gesamte Arbeit asynchron machen

Die Ereignismatrix wird sehr schnell komplex. Unser FSM hat hier nur 2 Staaten. 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 bitten um das Schloss
  • Der Mutex wird 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 Timer werden in den gleichen Fällen behandelt, in denen der Empfang erfolgt, und für alles, was mit "Warten bis es frei ist" zu tun hat, werden die Nachrichten automatisch in die Warteschlange gestellt: Der Mitarbeiter muss nur auf eine Antwort warten. Das Modell ist in diesen Fällen viel, viel einfacher.

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

Mit selektiven Empfängen können Sie sich normalerweise nur auf eine Untergruppe aller potenziellen Ereignisse konzentrieren und in diesem Fall weitaus einfacher über Ereignisse nachdenken. Beachten Sie, dass Erlang ein Verhalten (Entwurfsmuster/Framework-Implementierung) von etwas hat, das gen_event Genannt wird. Mit der Implementierung von gen_event können Sie einen Mechanismus verwenden, der dem in node.js verwendeten 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 es kooperativ macht. Erlang eignet sich eher für einige sehr große Anwendungen (Distribution und alle), aber Node.js und seine Community sind in der Regel webfähiger und kennen den neuesten Webtrend besser. Es ist eine Frage der Auswahl des besten Tools. Dies hängt von Ihrem Hintergrund, Ihrer Art des Problems und Ihren Vorlieben ab. In meinem Fall passt Erlangs Modell einfach sehr gut zu meiner Denkweise. Dies ist nicht unbedingt bei jedem der Fall.

Hoffe das hilft.

Erlang ist nicht kompliziert zu lernen, es ist nur fremd für die Denkweise, die die Chambers Constant (99,44%) der Programmierer gelernt haben, wie die Programmierung funktioniert. 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 Merkmale von Erlang, die einen typischen Programmierer beißen werden:

  • Erlang ist eine (meistens) funktionale Programmiersprache. Die meisten gängigen Programmiersprachen sind fast militant zwingend erforderlich.
  • Erlangs Parallelitätsmodell ist das Actor-Modell. Die meisten gängigen Programmiersprachen verwenden entweder sperrenbasiertes Threading oder einen auf "Reaktoren" basierenden Ansatz zur Parallelität. (Ich denke, Node.js ist das letztere, aber ruf mich nicht an - ich habe kein Interesse an JavaScript auf irgendeiner Seite der Client/Server-Beziehung.)
  • Erlang verfolgt einen "Let it Crash" -Ansatz für die Codierung mit leistungsstarken Laufzeitfunktionen, mit denen diese Abstürze abgefangen, diagnostiziert und während des System-Hot-Patches gepatcht 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 hirnrissigen Bibliothek häufig verwendeter Architekturen für zuverlässige und stabile Server (OTP) verbunden. (Es gibt einen Grund, warum Erlang normalerweise als Erlang/OTP bezeichnet wird.) Außerdem basiert diese Bibliothek auf den zuvor erwähnten Alien-Funktionen und ist daher für Neulinge undurchsichtig. Die meisten Programmiersprachen verfügen über weniger umfassende Bibliotheken (trotz Java EE), mit denen sie arbeiten können, und diese Bibliotheken basieren natürlich auf Konzepten, die den meisten Programmierern besser bekannt sind.

Das Erlernen von Erlang wird 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 jedoch, sobald Sie die konzeptionelle Barriere überwunden haben, gehe ich davon aus, dass die Erlang-Codierung weniger komplex sein wird als die entsprechende Node.js-Codierung. Dies hat mehrere Gründe:

  • Das Erlang-Parallelitätsmodell macht den Logikfluss viel klarer als die typische Parallelität im "Reaktor" -Stil und macht die Parallelität weitaus stabiler und korrekter als die typische sperrenbasierte Parallelität. Es ist fast kein Problem für einen Erlang-Programmierer, buchstäblich Tausende Prozesse in einem typischen Programm zu löschen, während Tausende von Threads beispielsweise in Java wäre ein Albtraum der Auseinandersetzung (ganz zu schweigen vom Speicher- und CPU-Overhead) und das Äquivalent zur Aufrechterhaltung von Tausenden von separaten Zuständen in einem "Reaktor" -basierten Setup wäre ein Albtraum zum Lesen.
  • Erlang ist eine (meistens) funktionale Sprache und ein Setup, bei dem man sieht, was man bekommt. Einmal festgelegte Variablen ändern sich nicht. Je. Es gibt keine "OOP" gruselige Aktion in der Ferne ", die Sie verwirren könnte: Alles, mit dem Sie arbeiten, wird explizit vor Ihnen ausgelegt. 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. (Dieser letztere Punkt ist nicht zu 100% wahr, aber in einer so überwältigenden Anzahl von Fällen, dass er für Ihre Lernphase gut genug ist.)
  • Die leistungsstarken Funktionen, die Erlang zur Behandlung von Fehlern bietet, bedeuten, dass Sie Ihren Code mit weniger defensiver Programmierung überladen, wodurch die Logik klarer und der Code klein bleibt.
  • Die OTP-Bibliothek ist ein unglaublich leistungsfähiger Stapel von allgemeinem Code, der Ihre gesamte Anwendung regelmäßig hält und viele der Probleme und Anwendungsfälle langlebiger Server abdeckt, an die Sie wahrscheinlich erst denken werden, 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 Lernen Sie etwas Erlang zum Wohle für eine sanfte und (meistens-) lustige Einführung in Erlangs Konzepte.

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, sodass die Inbetriebnahme normalerweise viel einfacher ist. Erlang hat für die meisten eine oft seltsame und ungewohnte Syntax, und obwohl eine Sprache viel einfacher als Javascript ist, ist sie aufgrund ihrer Einzigartigkeit etwas gewöhnungsbedürftiger

Das zweite ist, dass Erlang ein ganz bestimmtes gemeinsames Nichts-Parallelitätsmodell hat. Es erfordert, dass Sie anders denken, um Probleme zu lösen, was eine gute Sache ist (TM).

Das letzte wichtige ist, dass Erlang von einem kommerziellen Unternehmen entwickelt und Open-Source-bezogen wurde, nachdem es erst vor ungefähr 2 Jahren war, dass die Leute tatsächlich einzelne Commits in der Quellcodeverwaltung sehen konnten, und selbst jetzt glaube ich nicht, dass alle erlang-Entwickler umgezogen sind an die Öffentlichkeit Github Repo für ihre Entwicklung. node.js wurde von Anfang an innerhalb 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 zum Aufstehen.

Mit Node können Sie unterhaltsame Dinge ziemlich schnell und relativ schmerzfrei programmieren. Bei großen Anwendungen, die erlang seit langem gelöst hat, treten immer mehr Probleme auf. Erlang wird die Art und Weise, wie Sie programmieren, ändern und (imo) Sie zu einem besseren Programmierer machen, aber es wird Ihnen das Leben am Anfang nicht leicht machen. Beide machen auf unterschiedliche Weise Spaß.

10
Dale Harvey