¿Investigación sobre inferencia de tipos basada en el sitio de la llamada?

9

Estoy tratando de aprender más sobre la verificación de tipos de todo el programa y los sistemas de inferencia de tipos que usan información de sitios de llamadas de función para calcular la información de tipo (además del enfoque estándar de usar el cuerpo de la función). Por ejemplo, un algoritmo de este tipo podría usar una llamada de función como foo(1)para inferir que la función footoma argumentos enteros. Obviamente, esto complicaría mucho la inferencia y haría que el cheque no fuera modular.

De todos modos, no he tenido mucha suerte en encontrar ninguna investigación sobre este enfoque, probablemente porque no conozco la terminología correcta para describir de lo que estoy hablando. Cualquier puntero?

Derek Thurn
fuente
Lo que está describiendo tiene indicios de inferencia de tipo bidireccional, a menos que me equivoque. Sin embargo, describir lo que está tratando de hacer puede aclarar.
Dominic Mulligan el
¿Estás preguntando porque buscas una forma de especializar funciones polimórficas?
nponeccop
Principalmente solo estoy tratando de aprender más sobre los sistemas de tipos, y sí, estaba pensando principalmente en cómo manejar las funciones polimórficas (y las llamadas a métodos en lenguajes OO, lo mismo). Estoy tratando de identificar los términos correctos para esto para poder leerlo.
Derek Thurn

Respuestas:

11

Casi todos los sistemas con inferencia de tipos utilizan información del sitio de llamadas para hacer esto. Los ejemplos incluyen Standard ML, OCaml, F # y Haskell. Muchos otros lenguajes usan información del sitio de llamadas para inferir la instanciación de parámetros de tipo, como Java, C #, Scala y Typed Racket. Esto a menudo se conoce con el nombre de "Inferencia de tipo local".

Simplemente describiría lo que está buscando como "Inferencia de tipo", y probablemente debería comenzar por buscar lo que comúnmente se conoce como el sistema "Hindley-Milner". La página de Wikipedia ofrece una introducción razonable e indicadores sobre los documentos originales.

El lugar para comenzar con la inferencia de tipo local es el documento original de Pierce y Turner, mejor leído en la versión TOPLAS 2000 ( ACM , PDF ).

Sam Tobin-Hochstadt
fuente
El artículo de Pierce y Turner fue muy esclarecedor, gracias. ¿Conoce una implementación mínima del algoritmo que describen en el código? Creo que sería muy interesante de ver también, si existe.
Derek Thurn
No conozco ninguna implementación mínima. Hay uno en Typed Racket y otro en Scala, pero ambos implementan algoritmos sustancialmente más complicados.
Sam Tobin-Hochstadt
0

Puede echar un vistazo a los sistemas de tipo para los tipos de intersección que pueden darle algo así a :: Int -> Int | Bool -> Bool, para que sepa que dos especializaciones a Inty Boolson suficientes, o utilizar un tipo de inferencia habitual para inferir tipos más generales, seguidas de un análisis de flujo de control para recoger real Escribe argumentos. De hecho, existen enfoques híbridos (CFA expresado como un sistema de tipos y viceversa).

La investigación trabaja para inferir los tipos menos generales en lugar de los tipos más generales, pero no estoy al tanto de ellos.

En cuanto a las técnicas para implementar el polimorfismo, existen dos soluciones: 1) especialización (piense en plantillas de C ++) 2) suposición de representación uniforme (piense en colecciones de estilo C con void *).

Para 2 no necesita el tipo de call-site durante la verificación de tipos, y puede admitir una compilación separada más fácilmente.

Tenga en cuenta que estamos hablando de polimorfismo paramétrico aquí, y las llamadas a métodos virtuales OO son algo completamente diferente llamado polimorfismo de subtipo. Tenga en cuenta que las plantillas de C ++ admiten tanto algo como el polimorfismo paramétrico y la tipificación de pato, que es otra forma de polimorfismo.

nponeccop
fuente
1
"Las llamadas a métodos virtuales OO son algo completamente diferente llamado polimorfismo ad-hoc" El polimorfismo ad-hoc es otro nombre para la sobrecarga. Parece confundirlo con un subtipo de polimorfismo.
Radu GRIGore
Pero las subclases no son necesariamente subtipos, ¿no es así? Por ejemplo, para los subtipos se supone que LSP debe contener.
nponeccop
1
Es cierto, pero fuera del punto. "Polimorfismo de subtipo" es el término estándar. Ver en.wikipedia.org/wiki/Subtype_polymorphism para más detalles.
Radu GRIGore