Sur les Performances de Java et de l'Interopérabilité: Clojure vs Scala
J'ai déjà lu des différents comptes de Clojure vs Scala et alors que je me rends compte que les deux ont leur place. Il ya quelques considérations que je n'ai pas acquis une explication complète quand il s'agit de comparer les deux Clojure avec Scala:
1.) Lequel des deux langues est généralement plus rapide? Je me rends compte que cela peut varier d'un langage à l'autre, mais une évaluation générale de la performance serait utile. Par exemple: je sais que Python dictionnaires sont vraiment rapide. Mais dans l'ensemble, c'est un beaucoup langage plus lent que Java. Je ne veux pas aller avec Clojure et d'exécuter ce problème en bas de la route.
2.) Comment est l'interopérabilité avec Java? Tout ce que j'ai lu jusqu'à présent est que la Scala a native des collections de types qui font qu'il est un peu maladroit de s'intégrer à un grand Java à base de code, alors que Clojure suit un simple objet iterable/Itérateur centrée sur le moyen d'inter-opérer avec les classes Java. Plus de pensées/de détails sur cette?
En fin de compte, si elle est assez proche de tirage entre clojure et scala, je pourrais essayer les deux. Une chose à propos de Clojure est la langue semble très simple. Mais là encore, Scala a une très flexible type de système. Mais, je sais que Scala est rapide (basé sur de multiples comptes personnels). Donc, si Clojure est significativement plus lente: je voudrais savoir plutôt tôt que tard.
- Avec Clojure 1.2 Clojure peut appeler java sans surcharge. Regardez assembla.com/wiki/show/clojure/Datatypes et assembla.com/wiki/show/clojure/New_new. Ceci est fait parce que Clojure veut être proche de Java, mais mis en œuvre en Clojure.
Vous devez vous connecter pour publier un commentaire.
Je pense que l'une ou l'autre langue sera assez rapide pour vous. Lors de la comparaison de Python et Java, il semble un peu déraisonnable de blâmer la langue de la différence de vitesse. Java est compilé JIT (sauf sur les appareils mobiles*) alors que Python est interprété. Juste parce que les deux utilisent un bytecode ne signifie pas que les implémentations ont même à distance des performances comparables. Mais les deux Scala et Clojure sont JVM de langues, de sorte qu'ils devraient avoir le même rendement.
Scala a un peu de la mise en œuvre des avantages sur Clojure et je m'attends à un peu plus de performance. Bien que la Scala de typage statique devrait normalement se traduire par un avantage de vitesse sur Clojure du duck-typing, Clojure ne d'un support de type hinting ce qui peut accélérer code considérablement. Éventuellement, ordinaire Scala est plus rapide qu'à l'ordinaire Clojure, mais vous avez seulement besoin d'optimiser les goulets d'étranglement. Plus d'un programme du temps d'exécution est générée par une petite quantité de code.
Concernant l'interopérabilité w/Java, Scala est plus proche de Java, mais je suis sûr que les deux langues fonctionnent bien. Dans Programmation Clojure Stuart Halloway écrit: "[vous pouvez accéder à] tout ce que vous pouvait atteindre à partir du code Java.".
Et depuis Scala auteur Martin Odersky a écrit du Soleil compilateur Java, je pense que pas de balles, ont été abandonnées sur la Scala de côté, soit. 🙂
Vous sera difficile de choisir deux de mieux les langues, bien que j'aime Ruby aussi. Pourquoi êtes-vous inquiet au sujet de qui on essayer? Pourquoi ne pas essayer les deux? Scala est plus susceptible d'être "la prochaine Java", alors qu'il est difficile d'imaginer que Lisp va enfin décoller, après ne pas le faire pour les plus de 50 ans. Mais il est clair que Lisp est sur son propre niveau d'abstraction, et Clojure est assez simple, Scala + Clojure ne sera pas beaucoup plus difficile que de simplement (assez complexe) Scala et je suis sûr que vous serez heureux vous avez fait.
Et qu'elles interagissent...
* dalvik (android JVM) a obtenu un compilateur JIT dans la version 2.2 en 2010
Avec le présent JVM Scala a un avantage sur le compte de statiquement typé, comme la JVM de soutien pour le typage dynamique -- réflexion -- est lente. En fait, on Scala caractéristique qui doit être mis en œuvre par les mêmes techniques, les types de construction, est souvent mis en garde contre pour cette raison.
Aussi, Scala accepte mutable objets, il suffit de bien, et certains algorithmes sont juste plus rapide à mettre en œuvre avec la mutabilité.
Comme Scala et Java sont essentiellement basées sur la classe de langues, qu'elles interagissent de plus en plus facilement. Ou, peut-être, de manière plus harmonieuse. Une classe Java est une classe à la Scala, et un Scala classe est une classe Java. Des problèmes peuvent surgir quand il s'agit de la Scala de singletons ou Java statique membres, en particulier quand il y a un cadre impliqués attend des choses à travailler d'une certaine façon.
Donc j'irais avec Scala sur les deux ces comptes. Clojure est, à bien des égards, une meilleure langue, et il a certainement des caractéristiques très intéressantes présente pas (pour l'instant) sur Scala, mais vous récolter les bénéfices en prenant pleinement fonctionnelle. Si vous avez l'intention de le faire, alors Clojure est très probablement mieux. Si vous ne le faites pas, alors vous devriez probablement rester avec Scala.
Noter que Clojure et Scala sont deux totalement différents types de langages de programmation - Clojure est une fonctionnelle le langage Lisp-comme la langue, il est pas orientée objet. Scala est un langage orienté objet qui a la programmation fonctionnelle dispose d'.
À mon avis, les fonctionnalités et les concepts d'une langue (fonctionnelle, OO, ...) sont beaucoup plus importants critères de choix d'une langue que la performance (d'un particulier de la mise en œuvre de cette langue) - bien que je comprends que vous ne voulez pas m'enfermer dans une langue qui n'est pas performant de mise en œuvre disponibles.
J'irais pour Scala, parce qu'il est orienté objet, mais vous permet aussi d'apprendre la programmation fonctionnelle (si vous êtes intéressés). D'autre part, si vous n'avez pas de soins sur OO et vous voulez apprendre "pure" de la programmation fonctionnelle, essayez de Clojure.
Les statistiques produites par le "Le Langage De L'Ordinateur De Référence De Jeu" sont sur le meilleur, vous allez probablement trouver.
Ils sont en profondeur et vous pouvez comparer plusieurs langues. Le problème, c'est qu'ils ne couvrent pas Clojure 🙁
Cela dit, il est assez facile de soumettre quoi que ce soit-c'est tout l'open source.
Les stats ne disent que la Scala est sacrément rapide.
Si votre code est temps critique ou de l'espace-critique tout au long, bâton de Java. Mais il n'est pas, même si vous pensez qu'il est.
La le Langage de l'Ordinateur de Référence de Jeu apporte peu de lumière sur Clojure est vrai coût des ressources. Pas de Clojure structures de données sont utilisées. Fonctionnelle et la séquence des abstractions n'apparaissent pas.
Clojure peut paraître simple. Il n'est pas, mais il est expressif. Il peut s'exécuter cinq fois plus lent que Java, mais la source est cinq fois plus petite (YMMV). Pour la plupart de 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 de la Clojure langue, je crois qu'il est possible de dire à l'avance si votre problème s'uniront proprement dans une partie qui peut être succinctement et de manière adéquate (en termes de performances) exprimé en Clojure et une partie qui doit être fait en Java.
certaines des raisons de concision, une syntaxe qui est plus facile sur les yeux, et d'un ensemble cohérent
quoique complexe système de type.
Clojure est tout à fait inutile. Tout ce que vous allez obtenir est lent Java c'est dur
pour comprendre, car il coupe à travers le grain des idiomes utilisés pour
l'exprimer.
Scala a été dit d'être Java fait. Clojure est rien comme Java. Vous pourriez dire que c'est Lisp fait - gras, certains diraient absurde, demande - qui est peut-être vrai.
Sur l'interopérabilité, je ne peux pas parler pour Clojure, mais je m'attends à être dans une situation similaire à celle de la Scala.
Il est trivial à l'appel Java Scala.
Il est facile d'appeler Scala à partir de Java, tant que vous vous conformez votre API externe pour les points communs entre Scala et Java. Par exemple, un Scala objet est utilisé, à certains égards, comme statique méthodes en Java, mais ce n'est pas la même chose. Scala classes peut les compiler en un nombre de classes avec les noms drôle en Java.
Vous n'aurez pas envie de mélanger et assortir beaucoup. Bâtiment Scala ou Clojure qui utilise beaucoup de bibliothèques Java est très faisable. Vous pouvez bien sûr un appel dans ce composant à partir de Java, mais ce que vous n'allez pas vouloir faire est d'essayer de consommer une API Scala prévu pour une utilisation par Scala de programmes à partir de Java.
SVN prétend être "le CVS de fait la droite". De mon point de vue, la Scala est Java fait la droite.
La Numéro de novembre 2010 de PragPub discute Clojure-Java interopérabilité. L'appel de méthodes de Java est simple, mais l'extension des classes Java/interfaces est tout à fait différent.
Scala, en revanche, est beaucoup plus proche de Java. Scala-Java interopérabilité est élaboré à http://www.codecommit.com/blog/java/interop-between-java-and-scala
L'appel de code Java et de l'extension des classes Java/interfaces fonctionne de la même manière que l'appel à la Scala de code. Certains points de la douleur peut-être certains cas bord de traiter avec les generics de Java, car Scala type de système est beaucoup plus fort que de Java. La création de getters et setters à la suite de la Java Bean convention nécessite une annotation.
L'appel de la Scala à partir de Java est la plupart du temps simple, mais par exemple Scala compagnon des objets de savoir comment ils sont compilés en bytecode. Aussi à l'aide de traits avec les méthodes abstraites de Java devrait être compliqués, et de l'appel de méthodes avec des caractères spéciaux aurait besoin de savoir comment ils sont codés dans le bytecode.
C'est maintenant (en Mai 2010) d'une valeur de loking à la dernière branche 1.2 de Clojure - cela inclut beaucoup de soutien supplémentaire pour les types primitifs et le typage statique (par le biais de diverses préconisations et protocoles).
Ma compréhension est que vous pouvez utiliser ces fonctions lorsque vous en avez besoin pour obtenir la vitesse équivalent à l'écriture exactement le même code en Java pur.
@specialized
technique dans la prochaine Scala 2.8 est d'apporter un analogue de l'amélioration de la Scala bibliothèques. Et comme une langue, c'est la disposition de tous le code, pas juste de la bibliothèque standard.