tabla que extension estructura ejemplos compilador codigo caracteristicas java performance scala compilation

que - Velocidad de compilación de Java vs velocidad de compilación de Scala



que es un compilador (8)

He estado programando en Scala por un tiempo y me gusta, pero una cosa que me molesta es el tiempo que lleva compilar programas. Parece una cosa pequeña, pero con Java podría hacer pequeños cambios en mi programa, hacer clic en el botón de ejecución en netbeans, y BOOM, se está ejecutando, y con el tiempo compilar en scala parece consumir mucho tiempo. Escuché que con muchos proyectos grandes, el lenguaje de script se vuelve muy importante debido al tiempo que tarda la compilación, una necesidad que no vi surgir cuando estaba usando Java.

Pero vengo de Java que, como yo lo entiendo, es más rápido que cualquier otro lenguaje compilado, y es rápido debido a las razones por las que cambié a Scala (es un lenguaje muy simple).

Así que quería preguntar, ¿puedo hacer que Scala compile más rápido y scalac será tan rápido como javac?


Debe tener en cuenta que la compilación de Scala toma al menos un orden de magnitud más largo que Java para compilar. Las razones para esto son las siguientes:

  1. Convenciones de nomenclatura (un archivo XY.scala no necesita contener una clase llamada XY y puede contener múltiples clases de nivel superior). Por lo tanto, el compilador debe buscar más archivos fuente para encontrar un identificador de clase / rasgo / objeto dado.
  2. Implicits: el uso intensivo de implícitos significa que el compilador necesita buscar cualquier conversión implícita dentro del alcance para un método dado y clasificarlos para encontrar el "correcto". ( es decir, el compilador tiene un dominio de búsqueda enormemente aumentado al ubicar un método ) .
  3. El sistema de tipos: el sistema de tipo scala es mucho más complicado que Java y, por lo tanto, requiere más tiempo de CPU.
  4. Inferencia de tipo: la inferencia de tipo es computacionalmente costosa y un trabajo que javac no necesita hacer en absoluto
  5. scalac incluye un simulador de 8 bits de una estación de batalla totalmente armada y operativa, visible con la combinación de teclas mágicas CTRL-ALT-F12 durante la fase de compilación GenICode .

El compilador de Scala es más sofisticado que el de Java, ya que proporciona inferencia de tipo, conversión implícita y un sistema de tipos mucho más poderoso. Estas características no son gratis, así que no esperaría que scalac fuera tan rápido como javac. Esto refleja una compensación entre el programador que hace el trabajo y el compilador que hace el trabajo.

Dicho esto, los tiempos de compilación ya han mejorado notablemente pasando de Scala 2.7 a Scala 2.8, y espero que las mejoras continúen ahora que el polvo se ha asentado en 2.8. Esta página documenta algunos de los esfuerzos e ideas en curso para mejorar el rendimiento del compilador de Scala.

Martin Odersky proporciona muchos más detalles en su respuesta.


Estoy seguro de que esto se votará negativamente, pero un cambio extremadamente rápido no siempre conduce a la calidad o la productividad.

Tómese el tiempo para pensar con más cuidado y ejecutar menos micro ciclos de desarrollo. El buen código de Scala es más denso y más esencial (es decir, sin detalles y complejidad incidentales). Exige más reflexión y eso lleva tiempo (al menos al principio). Puede progresar bien con menos ciclos de prueba / corrección de código que son individualmente un poco más largos y aún mejoran su productividad y la calidad de su trabajo.

En resumen: busque un patrón de trabajo óptimo más adecuado para Scala.


Hay dos aspectos de la (falta de) velocidad para el compilador de Scala.

  1. Mayor sobrecarga de inicio

    • Scalac en sí consiste en MUCHAS clases que deben ser cargadas y compiladas por jit

    • Scalac debe buscar en el classpath todos los paquetes y archivos raíz. Dependiendo del tamaño de su classpath esto puede tomar de uno a tres segundos extra.

    En general, se espera una sobrecarga de inicio de scalac de 4-8 segundos, más tiempo si la ejecuta por primera vez, por lo que las cachés de disco no se llenan.

    La respuesta de Scala a la sobrecarga de inicio es usar fsc o hacer construcción continua con sbt. IntelliJ necesita configurarse para usar cualquiera de las opciones, de lo contrario su sobrecarga incluso para archivos pequeños es excesivamente grande.

  2. Velocidad de compilación más lenta. Scalac maneja alrededor de 500 hasta 1000 líneas / seg. Javac maneja alrededor de 10 veces eso. Hay varias razones para esto.

    • La inferencia de tipo es costosa, en particular si implica una búsqueda implícita.

    • Scalac tiene que hacer una verificación de tipo dos veces; una vez según las reglas de Scala y una segunda vez después del borrado de acuerdo con las reglas de Java.

    • Además del control de tipos, hay unos 15 pasos de transformación para pasar de Scala a Java, lo que lleva tiempo.

    • Scala generalmente genera muchas más clases por tamaño de archivo dado que Java, en particular si se usan mucho las expresiones funcionales. La generación de bytecódigos y la escritura de clases lleva tiempo.

    Por otro lado, un programa Scala de 1000 líneas podría corresponderse con un programa Java de línea de 2-3K, por lo que parte de la velocidad más lenta cuando se cuenta en líneas por segundo tiene que equilibrarse con una mayor funcionalidad por línea.

    Estamos trabajando en mejoras de velocidad (por ejemplo, generando archivos de clase en paralelo), pero uno no puede esperar milagros en este frente. Scalac nunca será tan rápido como javac. Creo que la solución estará en servidores de compilación como fsc junto con un buen análisis de dependencias, de modo que solo se recompile el conjunto mínimo de archivos. Estamos trabajando en eso, también.


La mejor manera de hacer Scala es con IDEA y SBT. Configure un proyecto SBT elemental (que lo hará por usted, si lo desea) y ejecútelo en modo de compilación automática (comando ~compile ) y cuando guarde su proyecto, SBT lo recompilará.

También puede usar el complemento SBT para IDEA y adjuntar una acción SBT a cada una de sus configuraciones de ejecución. El complemento SBT también le ofrece una consola interactiva SBT dentro de IDEA.

De cualquier manera (SBT ejecutándose externamente o el complemento SBT), SBT se mantiene funcionando y, por lo tanto, todas las clases utilizadas en la construcción de su proyecto se "calientan" y JIT-ed y la sobrecarga de arranque se elimina. Además, SBT compila solo los archivos fuente que lo necesitan. Es, de lejos, la forma más eficiente de crear programas Scala.


Las últimas revisiones de Scala-IDE (Eclipse) son mucho mejores en la administración de la compilación incremental.

Consulte " ¿Cuál es el mejor sistema de compilación de Scala? " Para obtener más información.

La otra solución es integrar fsc: compilador sin conexión rápida para el lenguaje Scala 2 (como se ilustra en esta publicación de blog ) como creador en su IDE.

Pero no directamente en Eclipse, como menciona Daniel Spiewak en los comentarios:

No debe usar FSC directamente en Eclipse, aunque solo sea porque Eclipse ya está utilizando FSC debajo de la superficie.
FSC es básicamente una capa delgada sobre el compilador residente, que es precisamente el mecanismo utilizado por Eclipse para compilar los proyectos de Scala.

Finalmente, como Jackson Davis me recuerda en los comentarios:

sbt (Simple Build Tool) también incluye algún tipo de compilación "incremental" (a través de la ejecución desencadenada ), aunque no es perfecta , y la compilación incremental mejorada está en el trabajo para la próxima versión de 0.9 sbt.


Puede usar el plugin JRebel, que es gratuito para Scala. Así que puedes "desarrollar en el depurador" y JRebel siempre volvería a cargar la clase modificada en el acto.

Leí una declaración en alguna parte del propio Martin Odersky en la que dice que las búsquedas de implicits (el compilador debe asegurarse de que no haya más de una sola implícita para la misma conversión para descartar ambigüedades) puede mantener ocupado al compilador. Por lo tanto, podría ser una buena idea manejar las implicidades con cuidado.

Si no tiene que ser 100% Scala, sino también algo similar, podrías darle una oportunidad a Kotlin .

- Oliver


Use fsc : es un compilador de scala rápido que se encuentra como una tarea en segundo plano y no necesita cargar todo el tiempo. Puede reutilizar la instancia del compilador anterior.

No estoy seguro si el plugin scala de Netbeans admite fsc (la documentación lo dice), pero no pude hacerlo funcionar. Pruebe las compilaciones nocturnas del complemento.