web-dev-qa-db-fra.com

Sur les performances et Java Interopérabilité: Clojure vs Scala

J'ai déjà lu divers récits de Clojure vs. Scala et même si je me rends compte que les deux ont leur place. Il y a quelques considérations sur lesquelles je n'ai pas acquis d'explication complète sur la comparaison à la fois Clojure avec Scala:

1.) Laquelle des deux langues est généralement plus rapide? Je me rends compte que cela variera d'une fonction linguistique à l'autre, mais une évaluation générale des performances serait utile. Par exemple: je sais que Python sont vraiment rapides. Mais dans l'ensemble, c'est un langage beaucoup plus lent que Java. Je ne veux pas y aller avec Fermez et rencontrez ce problème sur la route.

2.) Comment est l'interopérabilité avec Java? Tout ce que j'ai lu jusqu'à présent, c'est que Scala a des types de collections natives qui le rendent un peu maladroit à intégrer avec une grande base de code Java, tandis que Clojure suit un moyen simple d'interfonctionnement avec Iterable/Iterator avec les classes Java. Avez-vous d'autres idées/détails à ce sujet?

En fin de compte, si c'est un rapprochement assez étroit entre la clojure et la scala, je pourrais essayer les deux. Une chose à propos de Clojure est que le langage semble très simple. Mais là encore, Scala a un système de type très flexible. Mais, je sais que Scala est rapide (basé sur plusieurs comptes personnels). Donc, si Clojure est beaucoup plus lent: j'aimerais savoir le plus tôt possible.

81
Ryan Delucchi

Je pense que l'une ou l'autre langue sera assez rapide pour vous. En comparant Python et Java, il semble un peu déraisonnable de blâmer le langage pour la différence de vitesse. Java est compilé JIT (sauf sur les appareils mobiles *) alors que Python est interprété. Tout simplement parce que les deux utilisent un bytecode ne signifie pas que les implémentations auront même des performances comparables à distance. Mais les deux Scala et Clojure sont des langages JVM donc ils devrait avoir des performances similaires.

Scala a quelques avantages d'implémentation par rapport à Clojure et je m'attendrais à des performances légèrement supérieures. Bien que le typage statique de Scala se traduise normalement par un avantage de vitesse sur le typage de canard de Clojure, Clojure fait supporte les indications de type qui peuvent accélérer considérablement le code. Il est possible que l'ordinaire Scala soit plus rapide que Clojure ordinaire, mais il vous suffit d'optimiser les goulots d'étranglement. La plupart du temps d'exécution d'un programme est généré par une petite quantité de code réel.

Concernant l'interopérabilité avec Java, Scala est plus proche de Java mais je suis sûr que les deux langages interagissent bien. Dans Programmation Clojure Stuart Halloway écrit: "[vous pouvez accéder] tout ce que vous pouvez atteindre depuis Java.".

Et depuis Scala auteur Martin Odersky écrit Sun Java, je pense en quelque sorte qu'aucune balle n'a été lâchée sur le Scala, soit. :-)

Vous auriez du mal à choisir deux meilleures langues, bien que j'aime Ruby aussi. Pourquoi vous inquiétez-vous de savoir laquelle essayer? Pourquoi ne pas essayer les deux? Scala est plus susceptible d'être "le prochain Java", alors qu'il est difficile d'imaginer que LISP décollera finalement après ne pas l'avoir fait pendant plus de 50 ans. Mais il est clair que LISP est à son propre niveau d'abstraction unique, et Clojure est assez simple, donc Scala + Clojure ne sera pas beaucoup plus difficile que juste (le plutôt complexe) Scala et je suis sûr que vous serez content tu l'as fait.

Et d'ailleurs ils interagissent ...

* dalvik (JVM d'Android) a obtenu un compilateur JIT en version 2.2 en 2010

72
DigitalRoss

Avec la JVM actuelle Scala a un avantage sur le compte d'être typé statiquement, car le support JVM pour le typage dynamique - réflexion - est lent. En fait, un Scala fonctionnalité qui doit être implémentée à travers les mêmes techniques, types structurels, est souvent mise en garde pour cette raison même.

En outre, Scala accepte très bien les objets mutables, et certains algorithmes sont juste plus rapides à implémenter avec mutabilité.

Comme les deux Scala et Java sont essentiellement des langages basés sur des classes, ils interagissent plus facilement. Ou, peut-être, de manière plus transparente. A Java la classe est une classe pour Scala, et une classe Scala est une classe pour Java. Des problèmes peuvent survenir en ce qui concerne les singletons de Scala ou les membres statiques de Java, en particulier lorsqu'un cadre impliqué attend les choses à travailler d'une certaine manière.

J'irais donc avec Scala sur les deux ces comptes. Clojure est, à bien des égards, un meilleur langue, et il a certainement des fonctionnalités très intéressantes qui ne sont pas présentes (jusqu'à présent) sur Scala, mais vous tirez de tels avantages en devenant pleinement fonctionnel. Si vous avez l'intention de le faire, alors Clojure est probablement mieux. Si vous ne le faites pas, alors vous devriez probablement rester avec Scala.

32
Daniel C. Sobral

Notez que Clojure et Scala sont deux types de langages de programmation totalement différents - Clojure est un langage fonctionnel de type LISP, il est pas orienté objet. Scala est un langage orienté objet qui possède des fonctionnalités de programmation fonctionnelles.

À mon avis, les caractéristiques et les concepts d'un langage (fonctionnel, OO, ...) sont des critères beaucoup plus importants pour choisir un langage que les performances (d'une implémentation particulière de ce langage) - même si je comprends que vous ne le faites pas veulent être piégés dans un langage pour lequel aucune implémentation performante n'est disponible.

J'irais pour Scala, car il est orienté objet mais vous permet également d'apprendre la programmation fonctionnelle (si cela vous intéresse). D'un autre côté, si vous ne vous souciez pas de OO et que vous voulez apprendre la programmation fonctionnelle "pure", essayez Clojure.

21
Jesper

Les statistiques produites par le " Computer Language Benchmark Game " sont les meilleures que vous trouverez probablement.

Ils sont approfondis et vous pouvez comparer de nombreuses langues. Le problème est qu'ils ne couvrent pas Clojure :(

Cela dit, il est assez facile de soumettre quoi que ce soit - tout est open source.

Les statistiques disent que Scala est sacrément rapide.

15
Bill K
  1. idiomatique Scala est plus rapide que idiomatique Clojure, et le restera.
  2. Scala et Clojure se placent facilement au-dessus de Java. Ni l'un ni l'autre ne se trouve bien en dessous.

Si votre code est critique dans le temps ou dans l'espace, respectez Java. Mais ce n'est pas le cas, même si vous pensez que c'est le cas.

Le Computer Language Benchmark Game jette peu de lumière sur les coûts réels des ressources de Clojure. Aucune structure de données Clojure n'est utilisée. Les abstractions fonctionnelles et de séquence n'apparaissent pas.

Clojure peut sembler simple. Ce n'est pas le cas, mais c'est expressif. Il peut fonctionner cinq fois plus lentement que Java, mais la source est cinq fois plus petit (YMMV). Pour la plupart des applications, c'est une grande victoire. Mais pour certains, et pour certaines parties de beaucoup d'autres, c'est une perte dévastatrice.

Avec l'expérience du langage Clojure, je pense qu'il est possible de dire à l'avance si votre problème se clivera proprement en une partie qui peut être succinctement et adéquatement (en termes de performances) exprimée en Clojure et une partie qui doit être faite en Java.

  • Vous pouvez opter pour Scala lite: écriture Java idiomes dans Scala. Vous obtiendrez une certaine brièveté, une syntaxe plus agréable à l'œil et une cohérence bien que système de type complexe.
  • Il n'y a rien de tel que Clojure lite: écrire Java idiomes dans Clojure est totalement inutile. Tout ce que vous obtiendrez est lent Java c'est difficile à comprendre car il coupe le grain des idiomes utilisés pour l'exprimer.

Scala a été dit Java fait correctement. Clojure n'a rien à voir avec Java. Vous pourriez dire que c'est LISP bien fait - une affirmation audacieuse, certains diraient absurde - qui peut s'avérer être vraie.

15
Thumbnail

Concernant l'interopérabilité, je ne peux pas parler au nom de Clojure, mais je m'attendrais à ce qu'il se trouve dans une situation similaire à Scala.

Il est très simple d'appeler Java de Scala.

Il est facile d'appeler Scala from Java tant que vous conformez votre API externe aux points communs entre Scala et Java. Par exemple, un objet Scala est utilisé à certains égards comme les méthodes statiques en Java, mais ce n'est pas la même chose. Scala peuvent se compiler en un nombre de classes avec des noms qui semblent drôles en Java.

Vous ne voudrez pas mélanger et assortir beaucoup. Construire un composant dans Scala ou Clojure qui utilise beaucoup de bibliothèques Java est très faisable. Vous pouvez bien sûr appeler ce composant à partir de Java, mais ce que vous n'êtes pas va vouloir faire est d'essayer de consommer une Scala API destinée à être utilisée par Scala programmes de Java.

SVN prétend être "CVS bien fait". À mon avis, Scala is Java done right.

9
Kevin Peterson

Le numéro de novembre 2010 de PragPub traite de l'interopérabilité Clojure-Java. Appeler les méthodes Java est simple, mais étendre Java classes/interfaces est assez différent).

Scala, d'autre part, est beaucoup plus proche de Java. L'interopérabilité Scala-Java est élaborée à l'adresse http://www.codecommit.com/blog/Java/interop-between-Java-and-scala

Appeler Java code et étendre Java classes/interfaces fonctionne de la même manière que d'appeler Scala code. Certains points douloureux peuvent être certains cas Edge de traiter avec les génériques de Java, parce que le système de type de Scala est beaucoup plus fort que Java. Création de getters et setters suivant la Java convention Bean nécessite un annotation .

Appeler Scala from Java est la plupart du temps simple, mais par exemple les objets compagnons de Scala nécessitent de savoir comment ils sont compilés en bytecode. les méthodes abstraites de Java devraient être compliquées, et appeler des méthodes avec des caractères spéciaux nécessiterait de savoir comment elles sont encodées dans le bytecode.

3
Esko Luontola

Il vaut maintenant la peine (en mai 2010) de se familiariser avec la dernière branche 1.2 de Clojure - cela inclut beaucoup de prise en charge supplémentaire pour les types primitifs et le typage statique (via divers conseils de type et protocoles).

Ma compréhension est que vous pouvez utiliser ces fonctionnalités lorsque vous en avez besoin pour obtenir une vitesse équivalente à l'écriture exacte du même code en Java pur.

1
mikera