framework - ¿Qué compromisos tiene Scala para ejecutarse en JVM?
play framework web server (3)
Scala es un lenguaje maravilloso, pero me pregunto cómo se podría mejorar si tuviera su propio tiempo de ejecución.
Es decir, ¿qué opciones de diseño se hicieron debido a la elección de JVM?
Este artículo es una discusión con Martin Odersky (el creador de Scala) e incluye los compromisos que se hicieron en Scala para la compatibilidad con Java. El artículo menciona:
- Sobrecarga estática de métodos
- Tener ambos rasgos y clases
- Inclusión de punteros
null
.
Menos un problema con el tiempo de ejecución que una resaca cultural: igualdad universal, hashing, toString.
Más profundamente vinculado a la máquina virtual: estricta evaluación por defecto, funciones impuras, excepciones.
Los dos compromisos más importantes que conozco son:
- tipo borrado (" reflejo en Tipo "): Tiene que gestionar un Manifiesto para evitar la compilación de Java (independientemente de la JVM, por razones de compatibilidad con versiones anteriores).
- colección de tipo primitivo: p. ej .: matrices
nuevo esquema de manejo de matrices en Scala 2.8. En lugar de boxeo / unboxing y otra magia de compilación, el esquema se basa en conversiones implícitas y manifiestos para integrar matrices
Esas son las dos limitaciones principales de JVM, cuando se trata de administrar el tipo genérico (con límites): Java JVM no mantiene el tipo exacto de uso en un objeto genérico, y tiene tipos "primitivos".
Pero también podrías considerar:
- La optimización de llamadas en cola aún no es totalmente compatible con la JVM , era difícil de hacer de todos modos (y, sin embargo, Scala 2.8 presenta la anotación
@tailrec
) - El UAP (Principio de acceso universal) debe ser emulado (no soportado por Java) y pronto se completará para Value Holder (
@proxy
) - todo el mecanismo de mezcla también necesita ser emulado
- de manera más general, la gran cantidad de tipos estáticos introducidos por Scala necesita (para la mayoría de ellos) generarse en Java:
Para cubrir tantas posibilidades como sea posible, Scala proporciona:
- Tipos de clases convencionales,
- Tipos de clase de valor,
- Tipos no anulables,
- Tipos de mónadas,
- Tipos de rasgos
- Tipos de objeto Singleton (módulos de procedimiento, clases de utilidad, etc.),
- Tipos compuestos,
- Tipos funcionales
- Clases de casos
- Tipos dependientes de ruta,
- Tipos anónimos
- Tipos propios,
- Escriba alias,
- Tipos genéricos
- Tipos genéricos covariantes,
- Tipos genéricos contravariantes,
- Tipos genéricos limitados,
- Tipos abstractos
- Tipos existenciales
- Tipos implícitos
- Tipos aumentados
- Ver tipos acotados, y
- Tipos estructurales que permiten una forma de tipaje de pato cuando falla todo lo demás