27 votes

Langage de programmation pour le parallélisme fonctionnel: F # vs Haskell

La programmation fonctionnelle est immuable structures de données et aucun effet secondaire qui sont intrinsèquement adapté pour la programmation parallèle. J'ai étudier comment exploiter multicœur calcul dans un langage fonctionnel, et de la cible de production de code pour certaines applications numériques.

F# a Microsoft derrière son dos, et ses constructions parallèles tels que PLINQ, TPL, Async Flux de travail ont été bien documentés et montré un certain potentiel. Cependant, la recherche sur le parallélisme en Haskell est très actif en ce moment, et il possède de nombreuses fonctionnalités intéressantes qui n'ont pas été pris en charge par le F# encore:

Ma question est quelle langue je dois choisir fonctionnelle du parallélisme? Si F# est choisi, il y a tous les pointeurs de construire ce qu'ils ont actuellement en Haskell?

Mise à JOUR:

J'ai choisi de Simon réponse, car elle fait ressortir des belle discussion sur le collecteur d'ordures, l'allocation de la mémoire et du cache miss. Je m'en tiendrai à F#, et je pense que ces réponses sont utiles pour moi, l'étude fonctionnelle de parallélisme.

47voto

Simon Marlow Points 9153

Si le type de code que vous avez en tête alloue de la mémoire lourdement, alors vous pourriez trouver que le GHC garbage collector échelles de mieux que la .NET garbage collector. Il y a quelques anedcodal la preuve que l' .NET GC devient un goulet d'étranglement lorsque plusieurs threads sont l'allocation fortement, et c'est aussi une épine dans le côté de la plupart des Java collectionneurs aussi. D'autre part, nous avons payé beaucoup d'attention à l'amélioration de la localité et de l'évolutivité dans le GHC garbage collector - principalement parce que nous n'avons pas le choix, la plupart des idiomatiques du code Haskell alloue fortement de toute façon. J'ai des repères qui répartissent comme un fou et en gardant mise à l'échelle au-delà de 24 cœurs.

En Haskell noter que vous obtenez une garantie de déterminisme du type de système, que vous n'obtenez pas en F#.

Vous avez mentionné Parallèle des Données Haskell: une mise en garde, il n'est pas prêt pour une utilisation en production à l'heure actuelle, bien que le DPH équipe attendons à ce que la prochaine GHC 7.2.1 de presse aura stable DPH mise en œuvre.

20voto

Tomas Petricek Points 118959

Tout d'abord, je suis d'accord avec les autres qu'il n'y a pas de réponse objective.

Cependant, je pense que l'idée de la fonctionnelle de parallélisme est un peu surfait. Sûrement, vous pouvez facilement trouver les dépendances de données dans votre programme et si vous êtes du traitement des lots de données, vous pouvez utiliser certaines données-bibliothèque parallèle facilement et en toute sécurité paralléliser il. Cependant, ce qui peut être fait en C# (à l'aide de TPL et PLINQ) si vous êtes un peu attention à ce que vous écrivez.

Le problème, c'est que la plupart des programmes n'ont pas besoin d'être parallélisée, tout simplement parce qu'ils ne font pas assez de CPU-intensive de travail. Par exemple, F#, async en résout (je pense) plus important problème de l'activation asynchronous I/O, qui est la raison pour la plupart des "blocages" dans les applications connectées. Je pense que la popularité de Node.js illustre cette importance tout à fait bien.

La valeur réelle des langages fonctionnels est dans l'expressivité de la langue, vous pouvez facilement définir des abstractions pour votre problème, écrivez le code dans une de manière plus succincte et plus facile à comprendre, raisonner et de test. Vous obtenez ceci dans les deux F# et Haskell.

Pour répondre à votre question spécifique à propos de parallélisme - je crois que le statut de parallélisme de soutien en F# est plus stable (mais alors, je suis une F# personne). Vous pouvez choisir entre async, TPL et (Erlang-inspiré) F# agents (qui sont tous très stable bibliothèques). Sur le Haskell côté, il y a encore beaucoup de l'évolution en cours. Le travail le plus récent, est à seulement quelques semaines. Je trouve aussi qu'il est plus facile d'utiliser le parallélisme dans un langage clairement spécifié modèle d'évaluation, mais qui est peut-être juste ma préférence personnelle.

18voto

Jonathan Dursi Points 25143

Je vais me faire downvoted pour cela, mais laissez-moi être le curmudgeon.

Les langages fonctionnels sont grands. Ils changent la façon dont vous pensez de la décomposition de problèmes, et ils correspondent très bien à certains types de problèmes. Chaque programmeur doit être familier avec au moins un langage de programmation fonctionnel. Mais "les langages fonctionnels sont fondamentalement bons pour la programmation parallèle" n'est probablement pas la raison.

Il est intéressant de noter que ce qui est incontestablement la plus réussie de l'parallèle fonctionnelle de la langue de tous les temps, Erlang, utilise complètement bog-norme de transmission de message pour mettre en œuvre son parallélisme, et le lien entre sa nature fonctionnelle et son parallélisme est indirecte au mieux.

Vingt-cinq ans, il y avait un énorme push pour les langages fonctionnels, parce que l'argument semblait alors très convaincant aussi bien -- langages fonctionnels semblait un choix naturel pour le de plus en plus architectures parallèles de l'époque. L'argument était que les compilateurs et les exécutables automatiquement d'être en mesure de mettre en œuvre le parallélisme, en raison de l'effet de bord libre de la nature des langues. De SISAL, qui, même alors, peut être compilé dans un partagés et distribués de la mémoire (!) les exécutables a été développé à cette époque, comme Haskell, comme ce fut ML, le prédécesseur de Objective CAML et les autres lanaguages dans la ML de la famille.

C'est tout simplement offert un peu de perspective historique. Littéralement, un quart de siècle, fonctionnelle défenseurs du langage, y compris certains des esprits les plus brillants dans le domaine, ont dit que les langages fonctionnels journée dans le soleil était juste autour du coin, et qu'il va l'être de l'applicabilité de parallélisme qui est la "killer app". Et pourtant, nous sommes ici, sans même avoir entendu parler de SISAL, et je devine que la plupart des lecteurs de ce post, pensez à Haskell comme une nouvelle langue.

Il pourrait bien être, bien sûr, que maintenant avec multicœur considérations, les choses ont finalement obtenu de si urgent que les langages fonctionnels sont vraiment briller, ou que cette année sera l'année où il ya une certaine percée, je ne peux même pas imaginer ce qui change complètement le paysage. Cette année pourrait bien être différent de chacun des 25 années précédentes. Mais il ne pourrait pas, trop.

La grande, grande, grande majorité des parallèles et simultanées code existant aujourd'hui et dans un futur proche, n'est pas écrit dans les langages fonctionnels. Si vous cherchez à apprendre à propos de parallélisme, par tous les moyens d'explorer les mécanismes disponibles en F#, Haskell, etc; mais ne vous limitez pas à ceux-ci, est tout ce que je dis.

12voto

ildjarn Points 38377

La réponse simple est que, comme les deux langues ont un support solide pour le parallélisme et la concurrence, cela ne devrait pas être un facteur dans votre décision sur la langue à utiliser. C'est-à-dire qu'il y a des facteurs beaucoup plus importants à prendre en considération pour une décision comme celle-là.

8voto

Don Stewart Points 94361

Il n'y a pas de réponse objective. Pour Haskell, il existe un grand nombre de travaux actifs, et aucune approche «taille unique». Au lieu de cela, dans Haskell, de nombreux outils différents pour réaliser le parallélisme sont fournis. Quel est l'état de la programmation multicœur dans Haskell?

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