software - Mejorando la JVM para Scala
scala vs python (4)
Básicamente, todo por lo que John Rose ha estado haciendo campaña :)
Fixnums : para eliminar el costo de las primitivas de boxeo / desempaquetado.
Manejadores de métodos: aceleraría las funciones de orden superior y permitiría a la JVM optimizarlas de manera más efectiva. Los tipos de SAM a veces pueden requerir un flip / flopping incómodo entre sitios de llamadas monomórficos y megamórficos que impiden la alineación.
Continuations : para admitir el diseño asincrónico / concurrente, según node.js
Inyección de interfaz : Simplifique la composición mixin y la implementación de roles, así como también elimine la necesidad de generar algunas clases intermedias y hacer posibles tipos de estructuras sin reflexión en muchos casos.
Optimización de llamadas en cola: debería ser pan comido :)
La reificación a menudo se cita como algo que beneficiaría la coincidencia de patrones de Scala, pero esto tendría un alto costo en términos de interoperabilidad, dados los diferentes esquemas de varianza que utilizan los dos idiomas. En este punto, creo que la reificación en realidad puede causar más daño de lo que sería bueno.
También creo que no es razonable esperar nada que rompa la compatibilidad con versiones anteriores en Java. Eso simplemente no va a suceder.
¿Qué cambios en la JVM beneficiarían más al compilador de Scala y al tiempo de ejecución?
Los lenguajes dinámicos se beneficiarán enormemente en el rendimiento de la introducción del código de bytes InvokeDynamic
programado para llegar a JVM 7 y Scala probablemente se beneficiará de la recursión final (no estoy seguro de si aparecerá en JVM 8 o posterior).
¿Qué otros cambios podría aprovechar Scala, con su característica actual, en la JVM? ¿Están estos cambios en el horizonte?
Específicamente, ¿hay cambios en la JVM que mejorarían el rendimiento con cierres y funciones como objetos?
Hay algunas características de Scala que se implementarían mejor en la JVM, como por ejemplo:
Genéricos que son accesibles en tiempo de ejecución. Por el momento, scalac guarda los tipos de genéricos como campos ocultos (si la clase en cuestión es una clase de caso). Esto hace que los genéricos en las clases de casos sean innecesariamente costosos.
Varianza del sitio de la declaración Scala especifica la varianza de los parámetros de tipo en el sitio de definición, mientras que Java lo hace en el sitio de la llamada. Sin embargo, es poco probable que esto se arregle, ya que rompería todos los códigos genéricos de Java existentes.
Optimización de llamadas de cola Scalac puede hacer algo de optimización de llamadas de cola por sí mismo, pero solo en el caso más simple (recursivo). Cualquier otra llamada de cola usará espacio de pila como en la JVM.
Eliminación de punteros nulos. Scala ya puede manejar referencias nulas con la Opción [A] , pero debido a estar en la JVM, la referencia a la opción misma podría ser nula, o su parámetro podría ser nulo. Entonces no obtienes una garantía de no nulidad como en Haskell.
EDITAR: Agregó la variación del sitio de declaración a la lista.
Las personas a menudo se centran en InvokeDynamic, sin darse cuenta de que el marco de MethodHandles tiene muchas otras ventajas, incluso si el método de referencias que MH proporciona nunca se invoca dinámicamente.
MethodHandles son casi como una forma de "Reflection made right".
Cualquier lenguaje que haga un uso intensivo de la reflexión bien podría obtener beneficios del uso de MethodHandles dentro del tiempo de ejecución del idioma.
Los tipos de valor ayudarían bastante al rendimiento en cuanto a tuplas y clases de casos. El análisis de escape ayuda a reducir la asignación de montones de dichos objetos un poco, pero en este momento la JVM no puede alinear algunas llamadas a métodos con la suficiente agresividad, por lo que no puede eliminar las asignaciones de pila para estos pequeños objetos inmutables. Esto lleva a la destrucción de montón y 3-4 veces más tiempo de ejecución.
Los tipos de valor también ayudan a aumentar la ubicación de los datos y a reducir el uso de la memoria. Por ejemplo, en una matriz simple [(Int, Int)] cada entrada de matriz tendrá una sobrecarga de un puntero + encabezado de objeto. Con tipos de valores, esta sobrecarga podría eliminarse por completo.