Clojure ou Scala pour la bioinformatique/biostatistique / recherche médicale [fermé]


Je ne suis pas un programmeur professionnel (mon domaine est la recherche médicale), mais je suis tout à fait capable en C/C++, et divers langages de script. Il y a quelque temps, j'ai été intrigué par Lisp, mais je n'ai jamais eu le temps de l'apprendre sérieusement. Après une brève exposition à R j'ai décidé d'investir plus de temps dans un langage de programmation fonctionnel.

Je voudrais l'aspect pratique d'un langage JVM et donc réduit à Clojure et Scala. D'après ce que je comprends, les deux peuvent utiliser Java déjà existant les bibliothèques et données au code critique des performances peuvent être déléguées à Java, ont le potentiel de fonctionner relativement aussi bien.

Comment ces langues se comparent - elles dans l'espace d'application pour lequel j'en ai besoin? Existe-t-il des projets réels en bioinformatique utilisant l'un ou l'autre?

Le code déjà existant serait un plus sérieux, tout comme une bonne documentation et une courbe d'apprentissage assez douce. En outre, comment le modèle de concurrence des deux se compare-t-il?

Tout avantages/inconvénients significatifs que quelqu'un a?

Author: Peter Mortensen, 2011-03-09

9 answers

Je peux personnellement garantir que Clojure est un excellent outil pour ce genre de travail. (Je crois que Scala serait génial aussi, j'ai juste moins d'expérience avec elle).

Ma recherche personnelle est dans le domaine de la modélisation prédictive / apprentissage automatique et est très intensive en calcul - donc je pense qu'elle a de nombreux parallèles avec la bioinformatique ou la biostatistique.

Mon approche / configuration personnelle comprend:

  • Incanter utilisé principalement comme un outil de visualisation des données. Idéal pour produire des visualisations rapides qui ne sont généralement que des doublures 1 au REPL. Il y a aussi beaucoup d'outils de traitement statistique et numérique qui, je crois, utilisent la bibliothèque Colt sous le capot. Je ne suis pas un expert en R mais je comprends que Incanter est à peu près "R traduit en Clojure/Lisp".

  • Exploiter un certain nombre de bibliothèques Java au besoin. Certains d'entre eux sont les miens, par exemple des algorithmes que j'ai écrits en Java afin d'obtenir le meilleur possible performances affinées de la JVM. Mais vous pouvez également facilement utiliser l'une des autres grandes bibliothèques Java disponibles, car appeler Java à partir de Clojure est très simple (.Nom de méthode objet param1 param2)

  • Beaucoup de fonctions supérieures pour automatiser mon flux de travail. Par exemple, j'ai une fonction d'ordre supérieur qui exécutera un algorithme d'optimisation de tout type dans une boucle pendant un laps de temps spécifié, puis produira un graphique Incanter de l'amélioration à chaque itération. Pas rocket science, mais vraiment facile à coder en quelques lignes de Clojure.

  • Jamais vraiment avoir à se soucier de la performance. Vous pouvez faire en sorte que Clojure aille assez vite si vous le souhaitez (par exemple avec des indices de type, un support arithmétique primitif, etc.) mais normalement, ce n'est pas pertinent car vous allez passer 99%+ de vos cycles dans du code de bibliothèque bien optimisé de toute façon. Par conséquent, un peu de surcharge dans le code "glue" est négligeable - je sens que je gagne beaucoup plus en termes de productivité personnelle en ayant une dynamique, langage fonctionnel de haut niveau pour travailler.

  • Utilisation majeure des fonctionnalités de concurrence de Clojure - cela doit être l'une des fonctionnalités les plus fortes de Clojure. J'ai tendance à utiliser le STM pour coder des processus simultanés avec des transactions qui ne peuvent pas interférer les unes avec les autres, puis lancer des calculs de longue durée à l'avenir afin que je puisse poursuivre d'autres tâches et attendre la notification du résultat.

  • Une collection de macros en croissance lente pour " étendre le langage" en cas de besoin. En fait, j'utilise moins de macros que je ne le pensais (les fonctions d'ordre supérieur sont souvent un meilleur choix). Mais quand vous en avez besoin, ils sont inestimables - c'est là que vous appréciez vraiment la valeur d'une langue homoiconique. Comme ils vous permettent efficacement d'ajouter une nouvelle syntaxe au langage lui-même, ils sont très puissants lorsqu'ils sont utilisés correctement pour construire le DSL dont vous avez besoin.

En bref-Je ne pense pas que vous pouvez vous tromper avec Clojure en tant que chercheur.

La seule chose pour laquelle je ne l'utiliserais probablement pas (encore) est d'écrire une nouvelle bibliothèque numérique - ce serait probablement mieux fait en Scala ou en Java pur car vous voudriez probablement adopter un style plus impératif / OOP.

 29
Author: mikera, 2011-03-09 21:19:42

Je ne suis pas sûr de la bioinformatique et de la biostatistique en soi, mais je fais fréquemment des analyses de données scientifiques et j'apprécie que Scala me permette d'écrire aussi vite que du code Java avec une relative facilité. Je crois que c'est souvent possible à Clojure maintenant, mais je n'ai pas vu les repères pour étayer cela. Pour le moment, je pense que la chose prudente à supposer est qu'ils font pas aussi bien. Voir, par exemple, la Langages Informatiques de Référence de Jeu, où Scala est plus rapide que Clojure dans chaque test. (Ignorez l'horrible résultat "pidigits" pour Clojure Sc Scala (et Java) appellent la bibliothèque GMP écrite en C, ce que Clojure pourrait faire mais à cause d'un détail technique nécessitant un emballage différent pour la bibliothèque, n'est pas actuellement autorisé dans le jeu). Regarder comparaisons multicœurs n'améliore pas l'affichage de Clojure, et notez que le code Clojure n'est pas plus court pour ce genre de tâches algorithmiques de bas niveau.

Clojure est en avance pour le moment avec des collections parallèles, bien que la prochaine version 2.9 de Scala devrait faire une grande partie de la différence. Ni l'un ni l'autre n'a une courbe d'apprentissage douce en venant de C++; Scala est peut-être un peu plus facile étant donné que la syntaxe semble extérieurement un peu plus familière. Je crois qu'il existe de bons matériaux pour apprendre chacun d'eux.


Edit: PS Vous pouvez appeler R depuis Java (et donc depuis Clojure ou Scala) en utilisant rJava (en particulier le JRI interface). Modifier pour modifier: et, ces jours-ci, rScala.

Edit #2: Scala était plus rapide que Clojure dans tout au moment de la rédaction; à partir de cette édition, Clojure est un peu en avance dans un (au prix d'une énorme quantité de code) but mais de toute façon, le point global est. (Et l'implémentation de Scala sur ce test pourrait être accélérée.)

 21
Author: Rex Kerr, 2016-05-27 21:00:36

Si vous aimez R, essayez Incanter! C'est R pour Clojure.

Scala est orienté vers être syntaxiquement facile pour les personnes venant de Java, qui était destiné à être syntaxiquement facile pour les personnes venant de C bien qu'avec deux niveaux d'indirection comme celui-ci, l'avantage peut être perdu.

Clojure obtient beaucoup de traction dans l'espace Big Data et cartographie très bien surHadoop jobs pour les données énormes. Je pense que ce serait un gros avantage dans le monde de la bioinformatique.

Vraiment, ces choses sont en grande partie de goût personnel alors essayez les deux et voyez qui vous rend heureux:)

Si vous cherchez à vous faire une idée de Clojure sans beaucoup de" surcharge intellectuelle", puis-je vous suggérer d'utiliser leiningen pour démarrer rapidement un projet de test?

 16
Author: Arthur Ulfeldt, 2016-01-16 23:52:04

Pour construire sur la réponse de Rex, je voudrais ajouter quelques bibliothèques/produits Scala qui peuvent vous intéresser:

 11
Author: oluies, 2016-01-30 13:49:49

Je ne connais pas Scala, donc je ne peux pas offrir de comparaison, mais j'utilise activement Clojure dans des projets de bioinformatique.

L'intégration Java est excellente, et je n'ai eu aucun problème à utiliser les bibliothèques BioJava.

Où le modèle de concurrence de Clojure brille est dans les types de données par défaut immuables et la programmation fonctionnelle avec l'abstraction seq .

Dans mon travail bioinformatique, je me retrouve très souvent avec beaucoup de données d'entrée (disons gene séquences) qui doivent être soumises à la même analyse. Une fois que j'ai ma fonction d'analyse, je peux map sur une séquence d'entrées (avec les résultats générés paresseusement). J'ai obtenu l'utilisation complète d'un grand serveur 48 cœurs simplement en changeant cela {[1] } en a pmap.

La parallélisation à grande échelle avec un seul changement de caractère est difficile à battre!

Bien sûr, pmap n'est pas une solution miracle et n'aide que lorsque la fonction d'analyse domine sur le plan informatique, mais le fait que map et pmap puissent simplement être branchés et déconnectés montre l'élégance et la simplicité permises par le design de Clojure.

 8
Author: Alex Stoddard, 2016-01-26 23:12:27

Je ne connais que passablement Scala, donc le mieux que je puisse faire est d'évangéliser un peu pour Clojure. C'est une excellente langue, mais prenez tous ces conseils avec un grain de sel car ils viennent d'un passionné.

Si vous recherchez la concurrence, Clojure est fantastique à la fois pour la facilité de programmation et pour les performances. Les structures de données immuables signifient qu'il est trivial de travailler avec un instantané cohérent du monde sans aucun verrouillage manuel et sujet aux erreurs; la STM le rend assez simple pour modifier les données de manière sensible aux threads sans casser les instantanés de quiconque.

Ma compréhension est que Scala a beaucoup des bons outils fonctionnels que Clojure fait, mais Clojure gagnera toujours syntaxiquement en vertu d'être un Lisp. Si vous cherchez à faire des trucs spécialisés en bioinformatique, Clojure est capable de cacher les bits de Lisp que vous ne voulez pas et d'élever vos propres constructions au même niveau que les constructions de langage intégrées. Je ne trouve pas la référence non maintenant, mais il y a une citation bien connue sur Lisp qui va comme:

Lisp n'est pas le langage parfait pour n'importe quel programme. Mais c'est le langage parfait pour construire le langage parfait pour chaque programme.

C'est horriblement paraphrasé, mais dans mon expérience, c'est vrai. Il semble que vous vouliez un ensemble d'outils assez spécialisés, et aucun langage ne les rendra aussi naturels qu'un Lisp.

 6
Author: amalloy, 2011-03-09 18:59:03

Vous devez vous demander à quel point la programmation fonctionnelle est importante pour vous. Vous connaissez C++ donc vous connaissez probablement OO. Je dirais qu'il est plus facile de faire FP dans Clojure (parce que vous ne pouvez pas vraiment revenir au style OO) dans Scala, vous finirez probablement par laisser tomber FP et faire plus de style OO.

Je ne peux vraiment rien dire sur votre espace d'application.

Puisque vous avez mentionné R, il existe une bibliothèque Clojure de type R pour les statistiques appeléeIncanter . Je ne connais pas d'autres existants projets dans votre espace d'application.

Il y a beaucoup d'informations sur les deux langues, donc cela ne devrait pas être un problème. La courbe d'apprentissage est assez raide avec les deux langues. Clojure est un langage beaucoup plus petit et puisque vous connaissez déjà certains lisp, il ne devrait pas être difficile d'apprendre les choses importantes. Scala a un système de type qui sera difficile à prendre en compte d'autant plus que votre expérience principale est avec C/C++.

Les deux langues ont d'excellents modèles de concurrence et vous probablement être heureux avec les deux.

 4
Author: nickik, 2011-03-10 01:24:24

J'ai une certaine expérience en Scala et peu de connaissances en Clojure, mais j'ai programmé Lisp il y a de nombreuses années.

Lisp est un beau langage, mais il n'est jamais arrivé au monde, car il était trop limité. Je crois que vous avez besoin d'un langage typé statiquement pour développer des systèmes robustes. Le système de type de Scala n'est pas difficile à maîtriser pour en bénéficier. Si vous voulez faire des choses très avancées avec elle pour rendre vos bibliothèques idiotes, vous pouvez, mais vous devrez alors étudier le type système un peu plus.

Scala privilégie les types immuables, mais vous pouvez utiliser des mutables sans aucun problème, ce dont vous avez parfois besoin. La concurrence dans Scala est très bien implémentée et des frameworks comme akka étendent et améliorent ces possibilités.

Scala a de meilleures chances de devenir une langue dominante car c'est une langue plus complète. Je crains que Clojure ressemble trop à Lisp (mais réimplémenté sur la JVM). J'aimais beaucoup Lisp, mais il avait trop d'inconvénients pour la vie réelle programme. Avec Scala, je pense que nous avons le meilleur des deux mondes (OO et fonctionnel) dans un mariage propre. En plus de cela, Scala semble vraiment attraper sur le marché.

 2
Author: Bart Van den Bosch, 2016-01-26 23:16:15

Nous avons travaillé sur du code expérimental dans le projet Rudolf/BioClojure sur GitHub. Regardez aussi le projet BioClojure de Jan Aert qui est plus structuré.

De plus, un projet BioCaml est en cours...

 1
Author: jayunit100, 2016-01-26 23:18:33