Mejoran inferencia de tipos para errores más claros

Fuentes: Quadratic Micropass Type Inference

El artículo presenta un nuevo algoritmo de inferencia de tipos llamado 'Quadratic Micropass Type Inference', diseñado para mejorar la claridad de los mensajes de error en lenguajes de programación con inferencia de tipos. La inferencia de tipos, una característica que permite al compilador deducir el tipo de una variable o expresión, puede generar errores confusos cuando el compilador hace suposiciones incorrectas sobre la intención del programador. Los mensajes de error resultantes a menudo reflejan estas suposiciones erróneas, dificultando la depuración.

Los enfoques tradicionales de inferencia de tipos, como la inferencia 'inside-out' (de dentro hacia afuera) utilizada en lenguajes como Go, pueden fallar en escenarios complejos. Un método más avanzado, la unificación de variables de tipo, permite dejar tipos parcialmente inferidos para que se completen más adelante. Sin embargo, este método también puede llevar a asignaciones de variables de tipo incorrectas, generando mensajes de error engañosos. Por ejemplo, si una función espera un entero pero recibe una cadena, el error se mostrará en relación con la inferencia inicial, en lugar de reflejar el problema real.

'Quadratic Micropass Type Inference' aborda este problema dividiendo el proceso de inferencia en múltiples 'pases' ordenados. Estos pases priorizan las unificaciones de tipos que son más relevantes para la intención del programador, independientemente del orden en que aparezcan en el código fuente. La secuencia de pases incluye: 'known_applications', 'known_assignments', 'known_return_types', 'known_same_as_unifications', 'known_record_fields', 'resolve_records', 'less_known_functions', 'default_numbers', y 'default_unknown_to_unit_or_lift'. Cada pase realiza una tarea mínima y luego se vuelve a ejecutar para permitir que los cambios influyan en los pases anteriores. Esto asegura que la inferencia se base en lo que el programador probablemente considera más importante.

Un ejemplo ilustra cómo este enfoque mejora los mensajes de error. En lugar de indicar un error de tipo de cadena cuando se espera un entero, el mensaje ahora apunta directamente al problema de tipo incorrecto, facilitando la corrección. El algoritmo culmina con una fase de 'finalización' que crea un mapeo entre variables de tipo y tipos estáticos conocidos, permitiendo una verificación de tipos más precisa. El artículo proporciona un ejemplo detallado de cómo el algoritmo llega a su resultado final, mostrando el flujo de trabajo de cada pase.