Frage

Wenn Sie sich in das funktionale Programmierparadigma gekauft haben, besteht die Chancen, dass Sie sowohl Erlang als auch Haskell mögen. Beide haben rein funktionelle Kerne und andere Güte, wie z. B. leichte Fäden, die sie zu einer Multicore -Welt gut machen. Aber es gibt auch einige Unterschiede.

Erlang ist eine kommerziell nachgewiesene fehlertolerante Sprache mit einem ausgereiften Verteilungsmodell. Es hat eine scheinbar eindeutige Funktion in seiner Fähigkeit, seine Version zur Laufzeit über das Laden von Hotcode zu verbessern. (Viel cool!)

Haskell hingegen hat das anspruchsvollste Typ -System jeder Mainstream -Sprache. (Wo ich 'Mainstream' definiere, ist eine Sprache, in der ein O'Reilly -Buch veröffentlicht wird. Haskell zählt also.) Seine geradlinige Single -Thread -Performance sieht Erlangs und seinen leichten Threads überlegen aus.

Ich versuche, eine Entwicklungsplattform für zusammenzustellen Der Rest meines Codierungslebens und fragte sich, ob es möglich war, Erlang und Haskell zu mischen, um eine Best -of -Breed -Plattform zu erreichen. Diese Frage hat zwei Teile:

  1. Ich möchte Erlang als eine Art Fehler -toleranter MPI verwenden, um GHC -Laufzeitinstanzen zusammen zu kleben. Es würde einen Erlang -Prozess pro GHC -Laufzeit geben. Wenn "das Unmögliche passiert ist" und die GHC -Laufzeit starb, würde der Erlang -Prozess das irgendwie feststellen und sterben. Erlangs Lade- und Verteilungsfunktionen von Hot Code würden einfach weiter funktionieren. Die GHC -Laufzeit kann so konfiguriert werden, dass nur einen Kern oder alle Kerne auf der lokalen Maschine oder eine beliebige Kombination dazwischen verwendet werden. Sobald die Erlang -Bibliothek geschrieben wurde, sollte der Rest des Codes der Erlang -Ebene rein kesselplatten und automatisch auf der Basis pro Anwendung generiert werden. (Vielleicht durch eine Haskell -DSL zum Beispiel.) Wie erreicht man zumindest einige dieser Dinge?
  2. Ich möchte, dass Erlang und Haskell den gleichen Garabage -Sammler teilen können. (Dies ist eine viel weitere Idee als 1.) Sprachen, die auf dem JVM und der CLR laufen, erreichen eine größere Masse, indem sie eine Laufzeit teilen. Ich verstehe, dass es auf dem JVM oder der CLR technische Einschränkungen beim Ausführen von Erlang (Hotcode -Laden) und Haskell (höheren Polymorphismus) gibt. Aber was ist mit dem Entbündeln nur dem Müllsammler? (Eine Art Beginn einer Laufzeit für funktionale Sprachen.) Die Allokation müsste offensichtlich immer noch sehr schnell sein, also muss dieses Bit möglicherweise statisch miteinander verbunden sein. Und es sollte einige Mechansim geben, um den veränderlichen Haufen vom unveränderlichen Heap zu unterscheiden ((unveränderliche Haufen Lazy schreiben, wenn das Speicher einmal Speicher ist), wie GHC dies braucht. Wäre es machbar, sowohl Hipe als auch GHC so zu ändern, dass die Müllsammler einen Haufen teilen können?

Bitte beantworten Sie alle Erfahrungen (positiv oder negativ), Ideen oder Vorschläge. In der Tat ist jedes Feedback (kurz vor einem geraden Missbrauch!) Gern geschehen.

Aktualisieren

Vielen Dank für alle bisher 4 Antworten - jeder hat mir mindestens eine nützliche Sache beigebracht, die ich nicht kannte.

Bezüglich der Rest des Codierungslebens Ding - ich habe es leicht in der Wange eingeschlossen, um Debatte zu entfachen, aber es ist tatsächlich wahr. Es gibt ein Projekt, an das ich im Sinn habe, an dem ich arbeiten möchte, bis ich sterbe, und es braucht eine stabile Plattform.

In der oben vorgeschlagenen Plattform, die ich oben vorgeschlagen habe, würde ich nur Haskell schreiben, da der Kesselplatten -Erlang automatisch generiert wird. Wie lange wird Haskell dauern? Nun, Lisp ist immer noch bei uns und sieht nicht so aus, als würde es bald verschwinden. Haskell ist BSD3 Open Source und hat eine kritische Masse erreicht. Wenn die Programmierung selbst in 50 Jahren noch da ist, würde ich erwarten, dass Haskell oder eine kontinuierliche Entwicklung von Haskell noch hier sein wird.

Update 2 als Reaktion auf den Beitrag von Rvirding

Einverstanden - Die Implementierung einer vollständigen "Erskell/Haslang" -Virtualmaschine ist möglicherweise nicht absolut unmöglich, aber es wäre in der Tat sicherlich sehr schwierig. Teilen Sie nur den Müllsammlerniveau als so etwas wie ein VM, während Sie noch schwierig, klingt für mich allerdings eine Größenordnung weniger schwierig. Beim Müllsammlungsmodell müssen funktionale Sprachen viel gemeinsam haben - die Unklarheiten unveränderlicher Daten (einschließlich Thunks) und die Anforderung für eine sehr schnelle Zuordnung. Die Tatsache, dass die Gemeinsamkeit mit monolithischen VMs eng gebündelt ist, scheint seltsam.

VMs helfen dabei, eine kritische Masse zu erreichen. Schauen Sie sich einfach an, wie "Lite" funktionale Sprachen wie F# und Scala abgenommen haben. Scala hat vielleicht nicht die absolute Fehlertoleranz gegenüber Erlang, bietet aber einen Fluchtweg für die sehr vielen Leute, die an die JVM gebunden sind.

Während ein einzelner Haufen die Nachricht sehr schnell macht, wird eine Reihe anderer Probleme eingeführt, hauptsächlich, dass GC schwieriger wird, da sie interaktiv und global nicht interruptiv sein muss, sodass Sie nicht die gleichen einfacheren Algorithmen wie die Per- verwenden können Prozesshaufenmodell.

Das macht für mich absolut Sinn. Die sehr klugen Leute im GHC -Entwicklungsteam scheinen zu versuchen, einen Teil des Problems mit einem parallelen "Stop the World" -GC zu lösen.

http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel-gc/par-gc-ismm08.pdf

(Offensichtlich würde "Stop the World" für General Erlang angesichts ihres Hauptanwendungsfalls nicht fliegen.) Aber selbst in den Anwendungsfällen, in denen "Stop the World" in Ordnung ist, scheinen ihre Beschleunigungen nicht universell zu sein. Ich stimme Ihnen also zu, es ist unwahrscheinlich, dass es einen allgemein besten GC gibt, weshalb ich in Teil 1 angegeben habe

Die GHC -Laufzeit kann so konfiguriert werden, dass nur einen Kern oder alle Kerne auf der lokalen Maschine oder eine beliebige Kombination dazwischen verwendet werden.

Auf diese Weise konnte ich für einen bestimmten Anwendungsfall nach dem Benchmarking den Erlang -Weg gehen und eine GHC -Laufzeit (mit einem SingleLethread GC) plus einen Erlang -Prozess pro Kern laufen lassen und Erlang kopieren. .

Alternativ kann das Benchmarking auf einer Dual -Prozessor -Maschine mit 4 Kernen pro Prozessor mit einer guten Speicherbandbreite auf dem Prozessor darauf hindeuten, dass ich eine GHC -Laufzeit (mit einem parallelen GC) plus einen Erlang -Prozess pro Prozessor ausführe.

In beiden Fällen wäre die Freigabe wahrscheinlich, wenn Erlang und GHC einen Haufen teilen könnten, wahrscheinlich an einen einzelnen OS -Thread gebunden, der irgendwie auf einem einzelnen Kern läuft. (Ich komme hier aus meiner Tiefe heraus, weshalb ich die Frage gestellt habe.)

Ich habe auch eine andere Agenda - Benchmarking funktionale Sprachen unabhängig von GC. Oft las ich die Ergebnisse von Benchmarks von Ocaml gegen GHC V Erlang V ... und frage mich, wie sehr die Ergebnisse durch die verschiedenen GCs verwechselt werden. Was wäre, wenn die Wahl von GC orthogonal für die Wahl der funktionalen Sprache sein könnte? Wie teuer ist GC überhaupt? Siehe diesen Blog -Beitrag für Teufel Advocates

http://john.freml.in/garbage-collection-harmful

Von meinem Lisp -Freund John Fremlin, den er bezaubernd hat, angesichts seines Post -Titels "Automated Müllkollektion ist Müll". Wenn John behauptet, dass GC langsam ist und nicht wirklich so viel beschleunigt hat, möchte ich mit einigen Zahlen entgegenwirken können.

War es hilfreich?

Lösung

Viele Leute von Haskell und Erlang interessieren sich für das Modell, in dem Erlang die Verteilung überwacht, während Haskell die gemeinsam genutzten Speicherknoten parallel ausführt, um die gesamte Zahlen knirschen/logisch zu machen.

Ein Start in Richtung ist die Haskell-Erlang-Bibliothek: http://hackage.haskell.org/package/erlang

Und wir haben ähnliche Anstrengungen in Ruby Land über Hybris: http://github.com/mwotton/hubris/tree/master

Die Frage ist nun, jemanden zu finden, der tatsächlich durch die Interop -Interop von Erlang / Haskell drückt, um die schwierigen Probleme herauszufinden.

Andere Tipps

Sie werden eine interessante Zeit haben, um GC zwischen Haskell und Erlang zu mischen. Erlang verwendet einen pro-Prozesshaufen und kopiert Daten zwischen den Prozessen-da Haskell nicht einmal ein Konzept von Prozessen hat, bin ich mir nicht sicher, wie Sie diesen "universellen" GC zwischen den beiden abbilden würden. Darüber hinaus verwendet Erlang für die beste Leistung eine Vielzahl von Allokatoren, von denen jeweils leicht verhaltensweisen, dass ich sicher das GC-Subsystem beeinflussen würde.

Wie bei allen Dingen in der Software ist die Abstraktion mit Kosten verbunden. In diesem Fall vermute ich eher, dass Sie so viele Schichten einführen müssten, um beide Sprachen über ihre Impedanz -Missverhältnis zu bringen, die Sie mit einer nicht sehr leistungsstärksten (oder nützlichen) gemeinsamen VM aufnehmen würden.

Fazit - Umfassen Sie den Unterschied! Es gibt enorme Vorteile, nicht alles im selben Prozess auszuführen, insbesondere aus Sicht zu Zuverlässigkeit. Ich denke auch, dass es ein wenig naiv ist, eine Sprache/VM zu erwarten, die Sie für den Rest Ihres Lebens (es sei denn, Sie planen eine.) Ein kurzer Zeit leben oder b.) Wenn Sie eine Art Codemönch werden, der nur auf einem funktioniert Einzelprojekt). Bei der Softwareentwicklung dreht sich alles um geistige Agilität und um bereit, die besten verfügbaren Tools zum Erstellen eines schnellen, zuverlässigen Code zu verwenden.

Obwohl dies ein ziemlich alter Thread ist, lohnt es sich, einen Blick darauf zu werfen, wenn die Leser noch interessiert sind Cloud Haskell, was den Erlang -Stil zu Parallelität und Verteilung in den GHC -Stall bringt.

Das bevorstehende Plattform verteilt Die Bibliothek fügt Unterstützung für OTP-ähnliche Konstrukte wie Gen_Servers, Überwachungsbäume und verschiedene andere "haskellgeschmackte" Abstraktionen hinzu, die von Erlang/OTP ausgeliehen und inspiriert sind.

  1. Sie können einen OTP -Gen_Supervisor -Prozess verwenden, um Haskell -Instanzen zu überwachen, die Sie mit Open_port () laichen. Abhängig davon, wie der "Port" ausging, können Sie ihn neu starten oder entscheiden, dass er absichtlich gestoppt wurde und auch den entsprechenden Erlang -Prozess sterben lässt.

  2. Fugheddaboudit. Sogar diese sprachunabhängigen VMs, von denen Sie sprechen, haben manchmal Probleme mit Daten, die zwischen den Sprachen übergeben wurden. Sie sollten nur irgendwie Daten zwischen den beiden serialisieren: Datenbank, XML-RPC, so ähnlich.

Übrigens ist die Idee einer einzelnen Plattform für den Rest Ihres Lebens wahrscheinlich auch unpraktisch. Computertechnologie und Mode ändern sich zu oft, um zu erwarten, dass Sie für immer nur eine Sprache verwenden können. Ihre Frage zeigt dies: Niete eine Sprache alles, was wir uns vielleicht auch heute wünschen.

Wie Dizzyd in seinem Kommentar erwähnt, werden nicht alle Daten in Nachrichten kopiert, aber außerhalb des Prozesses gibt es große Binärdateien und werden nicht kopiert.

Die Verwendung einer anderen Speicherstruktur, um eine separate Pro-Prozess-Haufen zu vermeiden, ist sicherlich möglich und wurde in einer Reihe früherer Implementierungen durchgeführt. Während eines einzelnen Haufens macht die Nachricht vorbei sehr Schnell wird eine Reihe anderer Probleme eingeführt, hauptsächlich, dass GC schwieriger wird, da es interaktiv und global nicht interpretpivierend sein muss, sodass Sie nicht die gleichen einfacheren Algorithmen wie das pro-prozess-Heap-Modell verwenden können.

Solange wir unterwegs sind, gibt es kein Problem mit Robustheit und Sicherheit. Die Entscheidung, welche Speicher- und GC-Modelle verwendet werden sollen, ist ein großer Kompromiss und leider das universell beste Modell.

Während Haskell und Erlang beide funktionale Sprachen sind, sind sie in vielerlei Hinsicht sehr unterschiedliche Sprachen und haben sehr unterschiedliche Implementierungen. Es würde schwierig, eine "Erskell" (oder Haslang) zu entwickeln, die beide Sprachen effizient verarbeiten könnte. Ich persönlich denke, es ist viel besser, sie getrennt zu halten und sicherzustellen, dass Sie eine wirklich gute Schnittstelle zwischen ihnen haben.

Der CLR unterstützt die Schwanz -Anrufoptimierung mit einem expliziten tail Opcode (wie von F#verwendet), das der JVM nicht (noch) ein Äquivalent hat, was die Implementierung eines solchen Sprachstils einschränkt. Die Verwendung von getrennten AppDomainS erlaubt dem CLR den Hot-Swap-Code (siehe zB. Dieser Blog -Beitrag zeigen, wie es gemacht werden kann).

Da Simon Peyton Jones nur den Korridor von Don Syme und dem F# -Team von Microsoft Research entlang arbeitet, wäre es eine große Enttäuschung, wenn wir nicht irgendwann einen Ironhaskell mit einem offiziellen Status sehen würden. Ein Ironerlang wäre ein interessantes Projekt-die größte Arbeit wäre wahrscheinlich, den Scheduler für den Green-Threading zu portieren, ohne so schwer wie die Windows-Workflow-Engine zu werden oder einen Strahl-VM auf der CLR zu betreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top