52 votes

Mélanger Erlang et Haskell

Si vous avez acheté dans le paradigme de la programmation fonctionnelle, les chances sont que vous voulez à la fois Erlang et Haskell. Les deux ont purement fonctionnelle des noyaux et des autres la bonté comme léger threads qui en font un bon choix pour un multicœur monde. Mais il ya quelques différences.

Erlang est un commercialement prouvé à tolérance de pannes langue avec une mature modèle de distribution. Il a une apparence unique dans sa capacité à mettre à niveau sa version au moment de l'exécution par le hot code de chargement. (Cool!)

Haskell, à l'inverse, a le plus sophistiqué système de type de toute langue dominante. (Où je définis le "courant dominant" toute langue qui a publié O'Reilly livre Haskell compte.) Son linéaire mono-thread performance semble supérieure à Erlang et son poids léger de threads look encore plus léger aussi.

Je suis en train de mettre ensemble une plate-forme de développement pour le reste de ma codage de la vie et je me demandais s'il était possible de mélanger Erlang et Haskell pour atteindre un meilleur de race plate-forme. Cette question est en deux parties:

  1. Je voudrais utiliser Erlang comme une sorte de tolérance de pannes MPI de la colle GHC runtime ensemble d'instances. Il y aurait un processus Erlang par GHC moment de l'exécution. Si "l'impossible est arrivé" et le GHC runtime est mort, puis l'Erlang processus permettrait de détecter que quelque part, et mourir. Erlang est chaud code de chargement et de distribution de caractéristiques voudrais juste continuer à travailler. Le GHC d'exécution peut être configuré pour utiliser un seul core, ou tous les cœurs sur la machine locale, ou toute combinaison entre les deux. Une fois l'Erlang bibliothèque a été écrite, le reste de l'Erlang niveau de code devrait être purement réutilisable et générés automatiquement sur une application par application. (Peut-être par un Haskell DSL par exemple.) Comment atteindre au moins certaines de ces choses?
  2. J'aimerais Erlang et Haskell pour être en mesure de partager la même garabage collector. (C'est beaucoup plus à l'idée que 1.) Les langues qui s'exécutent sur la JVM et le CLR parvenir à une plus grande masse par le partage d'un moment de l'exécution. Je sais qu'il existe des limites techniques à l'exécution d'Erlang (chaud code de chargement) et Haskell (supérieur kinded polymorphisme) sur la JVM ou le CLR. Mais qu'en dégroupage juste le garbage collector? (En quelque sorte le début d'un environnement d'exécution pour les langages fonctionnels.) L'Allocation serait évidemment encore être très rapide, alors peut-être que le bit doit être lié statiquement. Et il devrait y avoir un mecanisme de distinguer les mutable tas de l'immuable tas (y compris paresseux écrire une fois de mémoire) que GHC besoins. Serait-il possible de modifier à la fois HYPE et GHC, de sorte que les ramasseurs d'ordures pourrait partager un tas de?

Veuillez répondre à toutes les expériences (positives ou négatives), des idées ou des suggestions. En fait, tous les commentaires (à court de droite de l'abus!) est la bienvenue.

Mise à jour

Merci pour tous les 4 réponses à ce jour - chaque m'a appris au moins une chose utile que je ne connaissais pas.

Concernant le reste de codage de vie de la chose - j'ai inclus un peu de la langue dans la joue, à susciter le débat, mais c'est vrai. Il y a un projet que j'ai dans l'esprit que j'ai l'intention de travailler jusqu'à ce que je meurs, et il a besoin d'une plate-forme stable.

Dans la plate-forme que j'ai proposé ci-dessus, je tiens seulement à écrire Haskell, comme le standard Erlang serait généré automatiquement. Donc, combien de temps Haskell? Bien Lisp est toujours avec nous et ne regarde pas comme il est près de disparaître. Haskell est BSD3 open source et a atteint une masse critique. Si la programmation elle-même est encore là dans 50 ans, je m'attends à Haskell, ou certains de l'évolution continue des Haskell, seront toujours là.

Mise à jour 2 en réponse à rvirding post

Convenu - la mise en œuvre complète "Erskell/Haslang" machine virtuelle universelle peut-être pas absolument impossible, mais il serait certainement très difficile en effet. Le partage juste le garbage collector niveau que quelque chose comme une machine virtuelle, bien que toujours difficile, les sons d'un ordre de grandeur moins difficile pour moi. Lors de la collecte des ordures modèle, les langages fonctionnels devez avoir beaucoup en commun - la unbiquity de données immuables (y compris les thunks) et l'exigence de très allocation rapide. Donc, le fait que le dénominateur commun est livré étroitement avec monolithique VMs semble bizarre.

VMs ne aider à atteindre une masse critique. Il suffit de regarder comment "lite" langages fonctionnels comme F# et Scala ont décollé. Scala ne peut pas avoir l'absolue tolérance de pannes de Erlang, mais il offre une voie de sortie pour le très beaucoup de gens qui sont attachés à la JVM.

Tout en ayant un seul tas fait message en passant très vite, c' introduit un certain nombre d'autres problèmes, surtout que cela GC devient de plus en plus difficile, car il doit être interactif et globalement non interruptive de sorte que vous ne pouvez pas utiliser le même plus simple des algorithmes comme le nombre de tas modèle.

Tout à fait, c'est parfaitement logique pour moi. Les gens très intelligents sur le GHC équipe de développement semble être en train d'essayer de résoudre une partie du problème, en parallèle avec "stop the world" GC.

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

(Évidemment, "stop the world" ne serait pas la mouche pour le général Erlang compte tenu de ses principaux cas d'utilisation.) Mais même dans le cas d'utilisation où "stop the world" est OK, leurs accélérations ne semblent pas être universelle. Je suis d'accord avec vous, il est peu probable qu'il y est universellement meilleur GC, qui est la raison que j'ai précisé dans la partie 1. de ma question que

Le GHC d'exécution peut être configuré pour n'utiliser qu'un seul core, ou tous les cœurs machine locale, ou n'importe quelle combinaison entre.

De cette façon, pour un cas d'utilisation, j'ai pu, après évaluation, choisir d'aller de l'Erlang façon, et d'exécuter l'une de GHC d'exécution (avec un single thread GC), plus un Erlang processus par cœur et laissez Erlang copie de la mémoire entre les cœurs de bonne localité.

Sinon, sur un double processeur de la machine avec 4 cœurs par processeur avec une bonne bande passante de la mémoire du processeur, l'analyse comparative pourrait suggérer que je lance l'une de GHC d'exécution (en parallèle avec une GC), plus un Erlang processus par processeur.

Dans les deux cas, si Erlang et GHC pourrait partager un segment, le partage serait probablement lié à un seul OS thread en cours d'exécution sur un seul cœur en quelque sorte. (Je suis sortir de ma profondeur, et c'est pourquoi j'ai posé la question.)

J'ai aussi un autre ordre du jour d'évaluation comparative des langages fonctionnels indépendamment de la GC. Souvent, je lis des résultats de benchmarks de OCaml v GHC v Erlang v ... et me demande combien les résultats sont confondus par les différents GCs. Que faire si le choix de la cg pourrait être orthogonale à choix de la fonctionnelle de la langue? Combien coûte la GC de toute façon? Voir ce diable défenseurs post de blog

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

par mon Lisp ami John Fremlin, dont il a, délicieusement, compte tenu de son titre du post "Automatisé de collecte des ordures est de la foutaise". Quand Jean prétend que GC est lent et n'a pas vraiment accéléré que beaucoup, je voudrais être en mesure de contrer avec quelques chiffres.

31voto

Don Stewart Points 94361

Beaucoup de Haskell et Erlang de gens sont intéressés par le modèle d'Erlang supervise la distribution, tout en Haskell pistes de la mémoire partagée nœuds en parallèle de faire tous les calculs/logique.

Un début vers ce qui est le haskell-erlang bibliothèque: http://hackage.haskell.org/package/erlang

Et nous avons les mêmes efforts en Ruby terre, par Orgueil: http://github.com/mwotton/Hubris/tree/master

La question maintenant est de trouver quelqu'un pour fait pousser par le biais de l'Erlang / Haskell interop à savoir les questions délicates.

5voto

hyperthunk Points 91

Même si c'est un assez vieux thread, si les lecteurs sont encore intéressé, alors il vaut la peine de prendre un coup d'oeil à Nuage Haskell, qui apporte Erlang style de la simultanéité et de la distribution pour le GHC stable.

La prochaine distribués-processus-de la plateforme de la bibliothèque ajoute le support pour OTP-esque des constructions comme les gen_servers, la supervision des arbres et de divers autres "haskell aromatisé" abstractions emprunté et inspirées par Erlang/OTP.

4voto

Warren Young Points 16324
  1. Vous pouvez utiliser un OTP gen_supervisor processus de surveillance de Haskell instances que vous frayer avec open_port(). Selon la façon dont le "port" est sorti, vous serait alors en mesure de le redémarrer ou de décider qu'il s'est arrêté sur le but et de laisser le correspondant Erlang processus de mourir, aussi.

  2. Fugheddaboudit. Même ces indépendants de la langue VMs vous parler d'avoir des ennuis avec les données transmises entre les langues, parfois. Vous devriez vous contenter de sérialiser les données entre les deux en quelque sorte: base de données, XML-RPC, quelque chose comme ça.

Par ailleurs, l'idée d'une seule plate-forme pour le reste de votre vie est probablement irréaliste, trop. Le calcul de la technologie et de la mode de changer trop souvent de s'attendre à ce que vous puissiez continuer à utiliser une seule langue pour toujours. Votre question points: aucune langue qui fait tout ce qu'on peut souhaiter, même aujourd'hui.

4voto

rvirding Points 13019

Comme dizzyd mentionné dans son commentaire n'est pas toutes les données dans les messages de copie de gros fichiers binaires existent en dehors du processus des tas et ne sont pas copiés.

À l'aide d'une mémoire différente de la structure pour éviter d'avoir séparé par processus tas est certainement possible et qui a été fait dans un certain nombre de les implémentations précédentes. Tout en ayant un seul tas fait de la transmission de message très rapide, il présente un certain nombre d'autres problèmes, surtout que cela GC devient de plus en plus difficile, car il doit être interactif et globalement non interruptive de sorte que vous ne pouvez pas utiliser le même plus simple des algorithmes comme le nombre de tas modèle.

Aussi longtemps que nous utilisons ont des données immuables-structures il n'y a pas de problème avec la robustesse et la sécurité. De décider de la mémoire et de la GC modèles à utiliser est un grand compromis, et, malheureusement, il n'y universellement meilleur modèle.

Tout en Haskell et Erlang sont à la fois les langages fonctionnels, ils sont à bien des égards très différentes langues et sont très différentes implémentations. Il serait difficile de trouver un "Erskell" (ou Haslang) de la machine qui pourrait manipuler les deux langues de manière efficace. Personnellement, je pense qu'il est préférable de les garder séparés et assurez-vous que vous avez une très bonne interface entre eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X