Sobre el rendimiento y la interoperabilidad de Java: Clojure vs. Scala
performance jvm (8)
- Idiomatic Scala es más rápido que Clojure idiomático , y lo seguirá siendo.
- Tanto Scala como Clojure se sientan fácilmente encima de Java. Ninguno se sienta bien debajo de eso.
Si su código es crítico para el tiempo o es crítico para el espacio, adhiérase a Java. Pero no lo es, incluso si crees que lo es.
El Juego comparativo de idiomas por computadora arroja poca luz sobre los verdaderos costos de recursos de Clojure. No se emplean estructuras de datos Clojure. Las abstracciones funcionales y de secuencia no aparecen.
Clojure puede parecer simple. No lo es, pero es expresivo. Puede ejecutarse cinco veces más lento que Java, pero la fuente es cinco veces más pequeña (YMMV). Para la mayoría de las aplicaciones, esta es una gran victoria. Pero para algunos, y para algunas partes de muchos otros, es una pérdida devastadora.
Con la experiencia del lenguaje Clojure, creo que es posible saber con antelación si su problema se dividirá limpiamente en una parte que pueda ser sucinta y adecuada (en términos de rendimiento) expresada en Clojure y una parte que se necesite en Java.
- Puedes ir por Scala lite: escribir modismos de Java en Scala. Obtendrá cierta brevedad, una sintaxis que es más fácil para el ojo, y un sistema de tipo coherente aunque complejo.
- No existe tal cosa como Clojure lite: escribir modismos de Java en Clojure es completamente inútil. Todo lo que obtendrás es una Java lenta que es difícil de entender porque va más allá de las expresiones idiomáticas utilizadas para expresarla.
Se ha dicho que Scala es Java hecho bien . Clojure no se parece en nada a Java. Se podría decir que es Lisp bien hecho , un reclamo audaz, y algunos dirían absurdo, que puede ser cierto.
Ya leí varios relatos de Clojure vs. Scala y mientras me doy cuenta de que ambos tienen su lugar. Hay algunas consideraciones que no he adquirido una explicación completa cuando se trata de comparar tanto Clojure con Scala:
1.) ¿Cuál de los dos idiomas es generalmente más rápido ? Me doy cuenta de que esto variará de una función de idioma a otra, pero sería útil una evaluación general del rendimiento. Por ejemplo: sé que los diccionarios de Python son realmente rápidos. Pero en general, es un lenguaje mucho más lento que Java. No quiero ir con Clojure y encontrarme con este problema en el futuro.
2.) ¿Cómo es la interoperabilidad con Java? Todo lo que he leído hasta ahora es que Scala tiene tipos de colecciones nativas que hacen que sea un poco torpe integrar con una gran base de código Java, mientras que Clojure sigue una sencilla forma Iterable / Iterator-centrada para interoperar con las clases de Java. ¿Hay más pensamientos / detalles sobre esto?
En definitiva, si se trata de un empate lo suficientemente cercano entre Clojure y Scala, podría probar ambos. Una cosa sobre Clojure es que el lenguaje parece muy simple. Pero, de nuevo, Scala tiene un sistema de tipo muy flexible. Pero, sé que Scala es rápido (basado en múltiples cuentas personales). Entonces, si Clojure es significativamente más lento, me gustaría saber más temprano que tarde.
Ahora (en mayo de 2010) vale la pena consultar lo último en la rama 1.2 de Clojure: esto incluye una gran cantidad de soporte adicional para tipos primitivos y tipado estático (a través de varios tipos de sugerencias y protocolos).
Según entiendo, puede usar estas funciones cuando lo necesite para obtener una velocidad equivalente a escribir exactamente el mismo código en Java puro.
Con la JVM actual, Scala tiene una ventaja en la cuenta de estar tipeado estáticamente, ya que el soporte de JVM para el tipado dinámico - reflexión - es lento. De hecho, una característica de Scala que se debe implementar a través de las mismas técnicas, tipos estructurales, a menudo se advierte por esta misma razón.
Además, Scala acepta objetos mutables muy bien, y algunos algoritmos son más rápidos de implementar con mutabilidad.
Como Scala y Java son esencialmente idiomas basados en clases, interactúan más fácilmente. O, tal vez, más a la perfección. Una clase Java es una clase para Scala, y una clase Scala es una clase para Java. Pueden surgir problemas cuando se trata de los singletons de Scala o los miembros estáticos de Java, particularmente cuando hay un marco involucrado esperando que las cosas funcionen de cierta manera.
Así que iría con Scala en ambas cuentas. Clojure es, en muchos sentidos, un lenguaje mejor, y ciertamente tiene características muy interesantes que no están presentes (hasta ahora) en Scala, pero usted obtiene dichos beneficios al funcionar completamente. Si pretendes hacer eso, entonces Clojure es probablemente mejor. Si no lo haces, entonces probablemente deberías quedarte con Scala.
Creo que cualquiera de los dos idiomas será lo suficientemente rápido para ti. Al comparar Python y Java, parece un poco irracional culpar al lenguaje por la diferencia de velocidad. Java es compilado JIT (excepto en dispositivos móviles *) mientras que Python es interpretado. El hecho de que ambos utilicen un bytecode no significa que las implementaciones tengan un rendimiento comparable ni remotamente. Pero tanto Scala como Clojure son lenguajes JVM, por lo que deberían tener un rendimiento similar.
Scala tiene algunas ventajas de implementación sobre Clojure y esperaría un rendimiento un poco más alto. Aunque el tipado estático de Scala normalmente se traduciría en una ventaja de velocidad sobre el tipado de pato de Clojure, Clojure admite sugerencias de tipo que pueden acelerar el código considerablemente. Posiblemente, el Scala ordinario es más rápido que el Clojure ordinario, pero solo necesitas optimizar los cuellos de botella. La mayor parte del tiempo de ejecución de un programa se genera con una pequeña cantidad del código real.
Con respecto a la interoperabilidad con Java, Scala está más cerca de Java, pero estoy seguro de que ambos idiomas funcionan bien. En Programming Clojure, Stuart Halloway escribe: "[puede acceder] a todo lo que pueda obtener del código Java ".
Y como el autor de Scala, Martin Odersky, escribió el compilador Java de Sun, creo que tampoco se han caído bolas del lado de Scala. :-)
Sería difícil elegir dos idiomas mejores, aunque también me gusta Ruby. ¿Por qué te preocupa cuál probar? ¿Por qué no probarlos a los dos? Scala es más probable que sea "el próximo Java", mientras que es difícil imaginar que Lisp finalmente despegue después de no hacerlo durante más de 50 años. Pero está claro que Lisp está en su propio nivel de abstracción único, y Clojure es bastante simple, por lo que Scala + Clojure no será mucho más difícil que el (bastante complejo) Scala y estoy seguro de que te alegrarás de haberlo hecho eso.
Y para el caso, interoperan ...
* dalvik (JVM de Android) obtuvo un compilador JIT en la versión 2.2 en 2010
En cuanto a la interoperabilidad, no puedo hablar por Clojure, pero espero que esté en una situación similar a la de Scala.
Es trivialmente fácil llamar a Java desde Scala.
Es fácil llamar a Scala desde Java, siempre que configure su API externa a los puntos comunes entre Scala y Java. Por ejemplo, un objeto Scala se utiliza de alguna manera como métodos estáticos en Java, pero no es lo mismo. Las clases de Scala pueden compilarse en varias clases con nombres que parecen divertidos en Java.
No querrás mezclar y combinar mucho. El componente de construcción en Scala o Clojure que usa muchas bibliotecas Java es muy factible. Por supuesto, puede llamar a este componente desde Java, pero lo que no querrá hacer es intentar consumir una API de Scala diseñada para ser utilizada por los programas Scala de Java.
SVN dice ser "CVS hecho bien". En mi opinión, Scala es Java hecho bien.
La edición de noviembre de 2010 de PragPub analiza la interoperabilidad Clojure-Java. Llamar a los métodos Java es sencillo, pero extender las clases / interfaces Java es bastante diferente.
Scala, por otro lado, está mucho más cerca de Java. La interoperabilidad de Scala-Java se elabora en http://www.codecommit.com/blog/java/interop-between-java-and-scala
Llamar al código Java y extender las clases / interfaces Java funciona de la misma manera que llamar al código Scala. Algunos puntos dolorosos podrían ser algunos casos extremos de tratar con los genéricos de Java, porque el sistema de tipos de Scala es mucho más fuerte que el de Java. Crear getters y setters siguiendo la convención de Java Bean requiere una anotación .
Llamar a Scala desde Java es la mayoría de las veces sencillo, pero por ejemplo, los objetos complementarios de Scala requieren saber cómo se compilan en bytecode. También el uso de rasgos con métodos no abstractos de Java debería ser complicado, y los métodos de llamada con caracteres especiales requerirían saber cómo están codificados en el bytecode.
Las estadísticas producidas por " Computer Language Benchmark Game " son las mejores que probablemente encuentres.
Son exhaustivos y puedes comparar muchos idiomas. El problema es que no cubren Clojure :(
Dicho esto, es bastante fácil enviar cualquier cosa, es todo de código abierto.
Las estadísticas dicen que Scala es bastante rápido.
Tenga en cuenta que Clojure y Scala son dos tipos de lenguajes de programación totalmente diferentes: Clojure es un lenguaje funcional parecido a Lisp, no está orientado a objetos. Scala es un lenguaje orientado a objetos que tiene características de programación funcional.
En mi opinión, las características y conceptos de un lenguaje (funcional, OO, ...) son criterios mucho más importantes para elegir un idioma que el rendimiento (de una implementación particular de ese idioma) - aunque entiendo que no querer quedar atrapado en un idioma para el cual no hay una implementación que funcione bien disponible.
Me decantaría por Scala, porque está orientado a objetos pero también le permite aprender programación funcional (si le interesa eso). Por otro lado, si no te importa OO y quieres aprender programación funcional "pura", prueba Clojure.