Es geht viel weniger um das Schauspieler-Modell als vielmehr darum, wie schwierig es ist, etwas Analoges zu OTP in C ++ richtig zu schreiben. Außerdem bieten verschiedene Betriebssysteme radikal unterschiedliche Debugging- und System-Tools, und Erlangs VM und verschiedene Sprachkonstrukte unterstützen eine einheitliche Methode, um herauszufinden, was all diese Prozesse vorhaben, was auf einheitliche Weise sehr schwierig (oder vielleicht auch schwierig) wäre überhaupt) über mehrere Plattformen hinweg. (Es ist wichtig, sich daran zu erinnern, dass Erlang / OTP vor dem aktuellen Trend über den Begriff "Akteurmodell" liegt. In einigen Fällen werden bei solchen Diskussionen Äpfel und Pterodaktylen verglichen. Großartige Ideen sind anfällig für unabhängige Erfindungen.)
All dies bedeutet, dass Sie sicherlich eine "Schauspieler-Modell" -Suite von Programmen in einer anderen Sprache schreiben können (ich weiß, ich habe dies in Python, C und Guile lange Zeit getan, ohne es zu merken, bevor ich auf Erlang gestoßen bin, einschließlich einer Form von Monitore und Links, und bevor ich jemals den Begriff "Akteurmodell" gehört hatte), zu verstehen, wie die Prozesse, die Ihr Code tatsächlich erzeugt, und was zwischen ihnen geschiehtist extrem schwierig. Erlang setzt Regeln durch, die ein Betriebssystem ohne größere Kernelüberholungen einfach nicht kann - Kernelüberholungen, die insgesamt wahrscheinlich nicht vorteilhaft wären. Diese Regeln äußern sich sowohl in allgemeinen Einschränkungen für den Programmierer (die immer umgangen werden können, wenn Sie es wirklich brauchen) als auch in grundlegenden Versprechungen, die das System dem Programmierer garantiert (die absichtlich gebrochen werden können, wenn Sie es wirklich brauchen).
Beispielsweise wird erzwungen, dass zwei Prozesse den Status nicht gemeinsam nutzen können, um Sie vor Nebenwirkungen zu schützen. Dies bedeutet nicht, dass jede Funktion in dem Sinne "rein" sein muss, dass alles referenziell transparent ist (offensichtlich nicht, obwohl es ein klares Entwurfsziel der meisten Erlang-Projekte ist, so viel von Ihrem Programm referenziell transparent wie praktisch zu machen), sondern dass zwei Prozesse schaffen nicht ständig Rennbedingungen, die sich auf den gemeinsamen Zustand oder die Konkurrenz beziehen. (Dies ist übrigens eher das, was "Nebenwirkungen" im Kontext von Erlang bedeuten. Wenn Sie wissen, dass dies Ihnen helfen kann, einen Teil der Diskussion zu entschlüsseln, in der Sie sich fragen, ob Erlang im Vergleich zu "reinen" Haskell- oder Spielzeugsprachen "wirklich funktionsfähig oder nicht" ist .)
Andererseits garantiert die Erlang-Laufzeit die Zustellung von Nachrichten. Dies wird in einer Umgebung, in der Sie nur über nicht verwaltete Ports, Pipes, gemeinsam genutzten Speicher und allgemeine Dateien kommunizieren müssen, die nur vom Betriebssystemkern verwaltet werden, schmerzlich übersehen (und die Verwaltung dieser Ressourcen im Betriebssystemkern ist im Vergleich zu Erlang notwendigerweise äußerst gering Laufzeit bietet). Dies bedeutet nicht, dass Erlang RPC garantiert (ohnehin ist die Nachrichtenübergabe weder RPC noch ein Methodenaufruf!), Es verspricht nicht, dass Ihre Nachricht korrekt adressiert ist, und es verspricht nicht, dass Sie ein Prozess sind Der Versuch, eine Nachricht an exist zu senden oder lebt. Es garantiert nur die Lieferung, wenn die Sache, an die Sie senden, gerade gültig ist.
Aufbauend auf diesem Versprechen ist das Versprechen, dass Monitore und Links korrekt sind. Und basierend darauf lässt die Erlang-Laufzeit das gesamte Konzept des "Netzwerkclusters" irgendwie dahinschmelzen, sobald Sie verstehen, was mit dem System los ist (und wie erl_connect verwendet wird ...). Auf diese Weise können Sie bereits über eine Reihe kniffliger Fälle von Parallelität springen, was Ihnen einen großen Vorsprung bei der Codierung des erfolgreichen Falls verschafft, anstatt sich in den Sumpf von Abwehrtechniken zu verstricken, die für nackte gleichzeitige Programmierung erforderlich sind.
Es geht also nicht wirklich darum , Erlang, die Sprache, die Laufzeit und das bereits vorhandene OTP zu benötigen , auf ziemlich saubere Weise ausgedrückt zu werden und alles, was ihm nahe steht, in einer anderen Sprache zu implementieren, was äußerst schwierig ist. OTP ist nur schwer zu befolgen. Ebenso brauchen wir C ++ auch nicht wirklich , wir könnten uns einfach an die rohe Binäreingabe Brainfuck halten und Assembler als unsere Hochsprache betrachten. Wir brauchen auch keine Züge oder Schiffe, da wir alle laufen und schwimmen können.
Trotzdem ist der Bytecode der VM gut dokumentiert, und es sind eine Reihe alternativer Sprachen entstanden, die kompiliert werden oder mit der Erlang-Laufzeit arbeiten. Wenn wir die Frage in einen Sprach- / Syntaxteil ("Muss ich Moon Runes verstehen, um Parallelität zu betreiben?") Und einen Plattformteil ("Ist OTP die ausgereifteste Methode, um Parallelität zu betreiben, aufteilen) und wird es mich durch die schwierigsten führen , die häufigsten Fallstricke in einer gleichzeitig verteilten Umgebung? ") Dann lautet die Antwort (" nein "," ja ").