Ya he leído varios relatos de Clojure vs. Scala y al mismo tiempo me doy cuenta de que ambos tienen su lugar. Hay algunas consideraciones sobre las que no he obtenido 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 característica del idioma a otra, pero una evaluación general del desempeño sería útil. Por ejemplo: sé que los diccionarios de Python son muy 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 integrarse con una gran base de código de Java, mientras que Clojure sigue una forma simple Iterable / Iterator-centric para interactuar con las clases de Java. ¿Más pensamientos / detalles sobre esto?
En última instancia, si hay 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 tipos 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 saberlo más temprano que tarde.
Respuestas:
Creo que cualquiera de los dos idiomas será lo suficientemente rápido para ti. Al comparar Python y Java, parece un poco irrazonable culpar al lenguaje por la diferencia de velocidad. Java se compila JIT (excepto en dispositivos móviles *) mientras que Python se interpreta. El hecho de que ambos usen un código de bytes no significa que las implementaciones tendrán un rendimiento ni remotamente comparable. 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 algo mayor. Aunque los tipos estáticos de Scala normalmente traducirse en una ventaja de velocidad sobre la tipificación de pato de Clojure, Clojure hace el tipo de soporte dando a entender que puede acelerar considerablemente código. Posiblemente, Scala ordinario es más rápido que Clojure ordinario, pero solo necesita optimizar los cuellos de botella. La mayor parte del tiempo de ejecución de un programa se genera mediante 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 lenguajes interactúan bien. En Programación Clojure, Stuart Halloway escribe: "[puedes acceder] a cualquier cosa que puedas alcanzar desde el código Java ".
Y dado que el autor de Scala, Martin Odersky, escribió el compilador de Java de Sun, creo que tampoco se han dejado caer pelotas en el lado de Scala. :-)
Sería difícil elegir dos idiomas mejores, aunque a mí también me gusta Ruby. ¿Por qué te preocupa cuál probar? ¿Por qué no probar los dos? Es más probable que Scala 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 tiene su propio nivel único de abstracción, y Clojure es bastante simple, por lo que Scala + Clojure no será mucho más difícil que solo (el bastante complejo) Scala y estoy seguro de que se alegrará 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
fuente
Con la JVM actual, Scala tiene la ventaja de estar tipado estáticamente, ya que el soporte de JVM para tipado dinámico (reflexión) es lento. De hecho, una característica de Scala que debe implementarse mediante las mismas técnicas, los tipos estructurales, a menudo se advierte por esta misma razón.
Además, Scala acepta objetos mutables sin problemas, y algunos algoritmos son más rápidos de implementar con mutabilidad.
Como Scala y Java son esencialmente lenguajes basados en clases, interoperan más fácilmente. O, quizás, de forma más fluida. 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 de los miembros estáticos de Java, particularmente cuando hay un marco involucrado que espera que las cosas funcionen de cierta manera.
Así que me gustaría ir con Scala en ambas estas 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 obtienes esos beneficios al ser completamente funcional. Si tiene la intención de hacer eso, es muy probable que Clojure sea mejor. Si no lo hace, probablemente debería quedarse con Scala.
fuente
Tenga en cuenta que Clojure y Scala dos tipos totalmente diferentes de los lenguajes de programación - Clojure es un funcional similar al lenguaje Lisp, se no 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 idioma (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 quieren quedar atrapados en un lenguaje para el que no existe una implementación de buen rendimiento disponible.
Me decantaría por Scala, porque está orientado a objetos, pero también te permite aprender programación funcional (si estás interesado en eso). Por otro lado, si no te importa OO y quieres aprender programación funcional "pura", prueba Clojure.
fuente
Si su código es crítico en el tiempo o en el espacio en todo momento, apéguese a Java. Pero no lo es, incluso si crees que lo es.
The Computer Language Benchmark Game arroja poca luz sobre los verdaderos costos de recursos de Clojure. No se emplean estructuras de datos de Clojure. No aparecen abstracciones funcionales y de secuencia.
Clojure puede parecer simple. No lo es, pero es expresivo. Puede funcionar 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 ventaja. 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 decir de antemano si su problema se dividirá limpiamente en una parte que puede expresarse de manera sucinta y adecuada (en términos de rendimiento) en Clojure y una parte que debe hacerse en Java.
Se ha dicho que Scala es Java hecho correctamente . Clojure no se parece en nada a Java. Se podría decir que Lisp está bien hecho , una afirmación audaz, algunos dirían absurda, que puede resultar cierta.
fuente
Las estadísticas producidas por el " Computer Language Benchmark Game " son las mejores que probablemente encontrarás.
Son detallados y puedes comparar muchos idiomas. El problema es que no cubren Clojure :(
Dicho esto, es bastante fácil enviar cualquier cosa, todo es de código abierto.
Las estadísticas dicen que Scala es bastante rápido.
fuente
Sobre la interoperabilidad, no puedo hablar por Clojure, pero esperaría que estuviera en una situación similar a Scala.
Es trivialmente fácil llamar a Java desde Scala.
Es fácil llamar a Scala desde Java siempre que adapte su API externa a los puntos comunes entre Scala y Java. Por ejemplo, un objeto Scala se usa 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 de 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 destinada a los programas de Scala de Java.
SVN afirma ser "CVS bien hecho". En mi opinión, Scala es Java bien hecho.
fuente
La edición de noviembre de 2010 de PragPub analiza la interoperabilidad Clojure-Java. Llamar a los métodos de Java es sencillo, pero extender las clases / interfaces de Java es bastante diferente.
Scala, por otro lado, está mucho más cerca de Java. La interoperabilidad Scala-Java se detalla en http://www.codecommit.com/blog/java/interop-between-java-and-scala
Llamar código Java y extender clases / interfaces Java funciona de la misma manera que llamar código Scala. Algunos puntos débiles pueden ser algunos casos extremos de lidiar con los genéricos de Java, porque el sistema de tipos de Scala es mucho más fuerte que el de Java. La creación de captadores y definidores 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 código de bytes. Además, el uso de características con métodos no abstractos de Java debería ser complicado, y llamar a métodos con caracteres especiales requeriría saber cómo están codificados en el código de bytes.
fuente
Ahora (a partir de mayo de 2010) vale la pena buscar en la última 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 protocolos y sugerencias de tipo).
Tengo entendido que puede usar estas funciones cuando las necesite para obtener una velocidad equivalente a escribir exactamente el mismo código en Java puro.
fuente
@specialized
técnica del próximo Scala 2.8 traerá una mejora análoga a las bibliotecas de Scala. Y como función de lenguaje, está disponible para todo el código, no solo para la biblioteca estándar.