Algoritmos de verificación de tipo

19

Estoy comenzando una investigación bibliográfica personal sobre algoritmos de verificación de tipos y quiero algunos consejos. ¿Cuáles son los algoritmos, estrategias y técnicas generales de verificación de tipos más utilizados?

Estoy particularmente interesado en algoritmos complejos de verificación de tipos que se implementaron en lenguajes de tipeo muy estáticos y ampliamente conocidos como, por ejemplo, C ++, Java 5+, Scala u otros. IE, algoritmos de verificación de tipos que no son muy simples debido a la mecanografía muy simple del lenguaje subyacente (como Java 1.4 y versiones posteriores).

No estoy interesado en un lenguaje específico X, Y o Z. Estoy interesado en algoritmos de verificación de tipo, independientemente del idioma al que se dirijan. Si proporciona una respuesta como "el lenguaje L del que nunca oyó hablar, que está fuertemente tipeado y el tipeo es complejo, tiene un algoritmo de verificación de tipo que hace A, B y C al verificar X e Y usando el algoritmo Z", o "el la estrategia X e Y utilizada para Scala y una variante Z de A utilizada para C # son geniales debido a las características R, S y T que funcionan de esa manera ", entonces las respuestas son buenas.

Victor Stafusa
fuente
3
Tal vez debería editar esta pregunta para preguntar sobre la verificación de tipos para un idioma específico. Las preguntas abiertas de estilo de lista generalmente se desaconsejan en SE (aunque este sitio en particular aún no tiene una política al respecto). Además: <type-system-elitist> El sistema de tipos de Java no es complejo </type-system-elitist>.
sepp2k
3
Quizás la pregunta podría reformularse para ser más específica, pero no creo que deba cerrarse.
Dave Clarke
1
@ sepp2k: Sé que es un poco amplio, pero terminó así porque no quiero limitar la utilidad de las respuestas. Por cierto, no entendí lo que quieres decir con "<type-system-elitist> El sistema de tipos de Java no es complejo </type-system-elitist>". De hecho, el sistema de tipo 1.4 y versiones anteriores de Java era simple, pero con los genéricos en Java 5, se volvió mucho más complejo.
Victor Stafusa
2
Preguntar por un idioma en particular haría la pregunta más inadecuada para este sitio, en mi humilde opinión. La pregunta tal vez debería pedir técnicas generales.
Raphael
1
@Victor Una herramienta básica son las gramáticas de atributos . Tal vez no puedas hacer todo lo malo que puedas imaginar con ellos, pero son un buen punto de partida.
Raphael

Respuestas:

13

La mayoría de las investigaciones no publican realmente los algoritmos de verificación de tipos para lenguajes de programación completos. Encontrará algunas formalizaciones de una gran parte de los sistemas de tipos para lenguajes de programación completos, como el trabajo realizado por Drossopoulou y Eisenbach para Java o el trabajo de Nipkov et al en C ++ . Sin embargo, con mayor frecuencia, solo encontrará los sistemas de tipos para alguna parte central del lenguaje (Featherweight Java es un ejemplo) o para los conceptos centrales de un lenguaje como el enfoque de inferencia de tipo local de scala .

En conferencias como POPL e ICFP, encontrará muchos algoritmos de verificación de tipos para tipos específicos de sistemas de tipos, y enfoques novedosos como la verificación de tipos bidireccional y tridireccional .

En términos más generales, es probable que necesite saber sobre el algoritmo de Damas-Milner , la inferencia de tipos locales, la verificación de tipos bidireccionales y tridireccionales, y ampliar a partir de ahí, siguiendo las referencias en los documentos y utilizando Google Scholar para encontrar qué documentos citan estos y construir sobre Los enfoques descritos. Además, como se sugirió anteriormente, conferencias como POPL, ICPF, ESOP e incluso ECOOP y OOPSLA tendrán documentos relevantes para su búsqueda.

Dave Clarke
fuente
Afaik, el sistema de tipos de Scala se ha desarrollado en proyectos de investigación y, por lo tanto, se publica. El compilador también es de código abierto. Sin embargo, tampoco he investigado.
Raphael
No hay necesidad de que yo infiera; Yo que hay trabajos publicados sobre el tipo de sistema de Scala. Este reclamo se verifica fácilmente mediante la búsqueda . Además, cuento el código fuente del compilador como una publicación suficiente en el algoritmo (siempre que esté incluido en las fuentes; supongo que sí, pero no lo comprobé). Mi declaración inicial fue ambigua, cierta, pero su reacción parece injustificada.
Raphael
2

Una herramienta básica son las gramáticas de atributos . Tal vez no puedas hacer todo lo malo que puedas imaginar con ellos, pero son un buen punto de partida.

Esencialmente, puede caminar sobre el árbol de sintaxis abstracta de un programa de arriba hacia abajo y / o de abajo hacia arriba y pasar información. Entonces, por ejemplo, podría pasar información de tipo de alcance global (por ejemplo, clases y sus miembros) hacia abajo y determinar el tipo de expresiones de forma recursiva, es decir, de abajo hacia arriba, pasando los tipos resultantes hacia arriba.

Encuentre alguna explicación y ejemplos en las diapositivas aquí (Capítulo 5).

Rafael
fuente
¿Alguien tiene una mejor referencia? Supongo que necesito comprar el Dragonbook o Wilhelm / Maurer uno de estos días ...
Raphael
1
La herramienta JastAdd es un excelente y moderno sistema de compilación de compiladores basado en gramáticas de atributos de referencia. Lo hemos usado en varios proyectos.
Dave Clarke