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 foo
toma 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?
Respuestas:
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 ).
fuente
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 aInt
yBool
son 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.
fuente