J'ai commencé à travailler sur FP récemment après avoir lu de nombreux blogs et articles sur les avantages de FP pour l'exécution simultanée et les performances. Mon besoin de FP a été largement influencé par l'application que je développe, mon application est un injecteur de données basé sur l'état dans un autre sous-système où le timing est très crucial (près de 2 millions de transactions par seconde). J'ai quelques ces sous-systèmes qui doivent être testés. J'envisage sérieusement d'utiliser FP pour son parallélisme et je veux adopter la bonne approche, de nombreux articles sur SO parlent des inconvénients et avantages de Scala, Haskell et Clojure par rapport aux constructions de langage, aux bibliothèques et à la prise en charge de la JVM. Du point de vue de la langue, je suis d'accord pour apprendre n'importe quelle langue tant que cela m'aidera à atteindre le résultat.
Certains articles favorisent Haskell pour la correspondance des modèles et la simplicité du langage, la JVM basée FP lang ont un gros avantage par rapport à l'utilisation des bibliothèques Java Java. JaneStreet est un grand Supporteur OCAML mais je ne suis vraiment pas sûr du support développeur et des forums d'aide pour OCAML.
Si quelqu'un a travaillé sur la gestion de données aussi volumineuses, veuillez partager votre expérience.
Voulez-vous rapide ou voulez-vous facile ?
Si vous voulez rapide, vous devez utiliser C++, même si vous utilisez FP principes pour aider à l'exactitude. Étant donné que le timing est crucial, le support de soft (et hard, si besoin est) réel La programmation en temps réel sera importante. Vous pouvez décider exactement quand et comment vous avez le temps de récupérer de la mémoire, et ne consacrer que le temps dont vous disposez à cette tâche.
Les trois langages que vous avez indiqués sont tous ~ 2-3x plus lents que le C++ réglé à la main de manière presque optimale , puis uniquement lorsqu'ils sont utilisés d'une manière impérative plutôt traditionnelle. Ils utilisent tous la collecte des ordures, ce qui entraînera des retards aléatoires incontrôlés dans vos transactions.
Maintenant, cela dit, c'est beaucoup de travail pour que cela fonctionne de manière pare-balles avec C++. L'application des principes FP nécessite beaucoup plus de passe-partout (même en C++ 11), et la plupart des bibliothèques sont modifiables par défaut. (Edit: Rust devient un bon alternative, mais il est hors de la portée de cette réponse de décrire Rust suffisamment en détail.)
Peut-être que vous n'avez pas le temps et que vous pouvez vous permettre de revenir sur d'autres spécifications. Si ce n'est pas le timing mais le débit qui est crucial, par exemple, alors vous probablement voulez Scala sur Clojure (voir le Computer Languages Benchmark Game , où Scala gagne tous les tests de référence au moment de l'écriture et a une taille de code inférieure dans presque tous les cas (Edit: CLBG n'est pas utile à cet égard plus, bien que vous puissiez trouver des archives soutenant ces déclarations sur les archives Web)); OCaml et Haskell devraient être choisis pour d'autres raisons (scores de référence similaires, mais ils ont une syntaxe et une interopérabilité différentes, etc.).
En ce qui concerne le système qui a le meilleur support de concurrence, Haskell, Clojure et Scala sont tous très bien alors qu'OCaml est un peu manquant.
Cela se réduit à peu près à Haskell et Scala. Avez-vous besoin d'utiliser Java? Scala. Avez-vous besoin d'utiliser des bibliothèques C? Probablement Haskell. N'avez-vous pas besoin des deux? Ensuite, vous pouvez choisir l'une ou l'autre sur la base de celle que vous préférez stylistiquement sans avoir trop à vous soucier d'avoir rendu votre vie beaucoup plus difficile en choisissant la mauvaise.
Je l'ai fait avec Clojure, qui s'est avéré assez efficace pour les raisons suivantes:
Je ne peux pas parler avec autant d'expérience des autres langues, mais mon impression d'une expérience pratique de Haskell et Scala est:
Dans l'ensemble, je pense que vous pourriez être satisfait de tout cela. Cela dépendra probablement de la façon dont vous vous souciez de la JVM et de votre vision des systèmes de type.