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:
- 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?
- 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.