Respuesta

6

El problema es con la representación del valor

Los lenguajes tradicionales de polimorfismo de alto orden han hecho la elección simplificadora de que todos los valores se representan de manera uniforme, generalmente una sola palabra, con un etiquetado inteligente para indicar si es un entero inmediato o un puntero a una estructura con un común representación (alguna etiqueta, etc.) para todos los demás valores, como estructuras de datos o funciones.

Si usted tiene este supuesto, se puede compilar cada función polimórfica una vez, y utilizarlo en todos los argumentos de todo tipo: tienen la representación asumida por la función compilado.

Ahora diga que arroja tipos con otras representaciones, ej. varias palabras continuas en la pila. Ya no puede usar su única función compilada, ya que esperará una sola palabra, por lo que la convención de llamadas no es correcta. Algo está roto.

Esto se puede solucionar de varias maneras, tales como:

  • pase junto con los valores alguna información acerca de su representación (usted podría considerar esta información a ser una especie de tiempo de ejecución "tipo" de la información, pero de hecho, no necesita la información completa, solo información sobre representación); esto es lo que el compilador TILT ha explorado, por ejemplo

  • intenta compilar varias versiones especializadas de su función polimórfica para cada posible representación, luego decide (también basado en una especie de etiqueta, o alguna información estáticamente disponible) qué versión llamar. Esto podría ser razonable con un esquema de optimización de todo el programa como MLton's. Esta es más o menos una versión de elección de llamada (en lugar de llamada de elección) de la primera idea.

  • restringir polimorfismos utilizando un sistema tipo "para distinguir los tipos de una sola palabra", "tipos" de tupla. En lugar del polimorfismo habitual "para type type", tendría una versión relativizada "para todos los tipos de ese tipo ...". Esto le permite al programador razonar estáticamente sobre qué función puede aceptar qué tipo de argumentos ("ow, esta función es polimórfica, entonces debo colocar mi tipo de valor aquí") en lugar de esperar que el compilador obtenga las coerciones correctas, pero esto también hace que el sistema de tipo sea más pesado: no conserva la ilusión de uniformidad.

En resumen, combinada (alguna forma de) polimorfismo con datos ricos opciones representación es posible, pero mucho más difícil que en el caso representación uniforme.

+0

Los tipos de valor con recursión polimórfica son problemáticos para la solución n. ° 2 porque es posible que deba compilar infinitamente muchas versiones del código. Es posible detectar tales casos? – Jules

+0

En la práctica, no querrás llenar tu pila con tipos de valores que crecerán sin límites debido a las llamadas recursivas de todos modos.Mi intuición sería que poner un límite estático en el tamaño (y en el cuadro anterior) o forzar recurrencias tipo para pasar al menos un puntero son soluciones más razonables en la mayoría de los casos que agregar un JIT completo a su idioma para manejar esto. – gasche

0

No, esto es incorrecto. se puede lograr "más alto polimorfismo orden" (funciones que se comportan de manera uniforme sobre todos los tipos) por tener tipos de parámetros o bien ser definida como genéricos o de tipo object (tipos de valor obtendrá automáticamente "en caja" en objetos)

Cuestiones relacionadas