2011-01-26 12 views
5

En Scala/Java (~ en la JVM), hay algunos casos más pequeños donde el comportamiento es diferente como:¿Qué razones existen para las diferencias entre los tipos de tiempo de compilación y los tipos de tiempo de ejecución?

/* "Dynamic" cast */ 
"".getClass.cast("Foo") 
//res0: Any = Foo 

/* "Static" cast */ 
classOf[String].cast("Foo") 
//res1: String = Foo 

/* "Compile time cast" */ 
"Foo".asInstanceOf[String] 
res2: String = Foo 

En qué idiomas es la diferencia entre el tiempo de compilación y tiempo de ejecución es más grande y hay razones de un POV de diseño de lenguaje ¿por qué esto podría ser una "cosa buena"?

Yendo hacia la otra dirección: ¿Hay un lenguaje (tipado estáticamente) sin si hay diferencias entre el tiempo de compilación y los tipos de tiempo de ejecución?

Respuesta

6

La razón para el primer resultado es que el método getClass tiene la siguiente firma en Java

public final Class<?> getClass() 

que hereda Scala. Si bien sabemos que si llamamos getClass en una referencia de tipo T de la firma podría ser

public final Class<? extends T> getClass() 

el compilador no lo hace. Se podría imaginar alguna extensión del lenguaje para proporcionar un tipo especial que representa el tipo estático del receptor que permita

public final Class<? extends Receiver> getClass() 

o algún tipo de carcasa especial en el compilador para getClass. De hecho, parece que Snoracle Java de hecho casos especiales getClass, pero no estoy seguro de que sea requerido por la Especificación del lenguaje Java. Sin embargo, si tiene una referencia de algún tipo estático particular T, no hay razón por la que no pueda hacer el equivalente T.class (java) o classOf[T] (scala). En otras palabras, tal extensión no aportaría mayor poder expresivo, pero complicaría la implementación del lenguaje.

En cuanto al "lanzamiento del tiempo de compilación" frente al "lanzamiento estático", en realidad no hay diferencia. Sería correcto para un compilador desugar x.asInstanceOf[T] a classOf[T].cast(x).

Cualquier lenguaje con subtipificación tendrá la posibilidad de que el tipo de referencia estáticamente conocido sea menos específico que el tipo del valor al que hace referencia. Los lenguajes con sistemas de tipo estático que no tienen subtipos generalmente no tienen un concepto de tipos de tiempo de ejecución ya que solo hay un tipo real que habita un nombre de tipo dado. En estos idiomas, los tipos se borran en el tiempo de ejecución, de la misma manera que los parámetros de tipo se borran en la JVM.

Espero que esto ayude a su comprensión de los tipos estáticos de referencias en comparación con el tipo de valores de tiempo de ejecución.

1

C no tiene información de tipo de tiempo de ejecución (RTTI). Entonces el tipo estático es el tipo de tiempo de ejecución. Más precisamente, esto permite al compilador eliminar por completo la información de tipo del archivo de objeto y genera un código más rápido (no se requiere comprobación durante la ejecución del programa). Para vincular la información está en los encabezados.

En C++ RTTI existe solo con herencia virtual/clases base abstractas, lo cual es una expresión desalentadora debido al mal rendimiento (según los estándares de C++).

En Java (hasta donde puedo recordar), el idioma preferido (al menos hace 7 años) era utilizar una interfaz muy general. Esto significa que no hay mucha información de tipo de tiempo de compilación. Y, por supuesto, los genéricos en Java tienen todos los objetos como tipo estático. Entonces toda la información es tiempo de ejecución (con la sobrecarga correspondiente).La razón detrás de eso parece ser que el sistema de tipo estático es demasiado rígido (C, Pascal) y necesita escapatorias (vacío *) o es relativamente complejo (C++, Haskell).

En Haskell, el tipo de compilación suele ser el tipo de tiempo de ejecución, excepto en el caso de los tipos de orden superior y el tipo existencial. GHC por alguna razón (¿tipo de instancia de reflexión?) Aunque no lo usa para aumentar la eficiencia. Entonces, la información del tipo es todo el tiempo.

Cuestiones relacionadas