Notas de diseño de X: Unificación de módulos OCaml

2025-09-09

El autor está diseñando un nuevo lenguaje de programación, X, con el objetivo de combinar la inferencia de tipos y la subtipificación estructural de PolySubML con la mayoría de las funciones de OCaml, abordando especialmente las diferencias sintácticas y conceptuales entre el sistema de módulos de OCaml y los valores ordinarios. La publicación detalla cómo se unifican los módulos OCaml en X, cubriendo aspectos como los miembros de alias en registros, la sintaxis struct y sig, la apertura e inclusión de módulos, la extensión de módulos y la abstracción con tipos existenciales. Propone mejoras al sistema de módulos de OCaml, como evitar las importaciones con comodines. El objetivo final es un lenguaje de programación más simple, fácil de entender y potente.

Leer más
Desarrollo

Más allá de Hindley-Milner: Un tutorial sobre el compilador Cubiml con subtipado algebraico

2025-06-13

Esta serie de publicaciones de blog presenta Cubiml, un tutorial de compilador construido alrededor de un nuevo sistema de inferencia de tipos llamado "cubic biunification", una mejora en el Subtipado Algebraico. Aborda las limitaciones de la falta de soporte de subtipado del sistema Hindley-Milner, proporcionando una inferencia de tipos más potente e intuitiva. El tutorial guía a través de la implementación de Cubiml con ejemplos de código detallados, cubriendo booleanos, condicionales, registros, funciones, enlaces let, enlaces let recursivos, recursión mutua y coincidencia de tipos de caso. El objetivo final es un compilador que verifica los tipos de programas sin requerir anotaciones de tipo manuales.

Leer más
Desarrollo

Adiós, Errores de Tipo Misteriosos: Cómo PolySubML Mejora los Mensajes de Error de Inferencia de Tipos

2025-05-23

PolySubML es un lenguaje de programación que combina la inferencia de tipos global con la subtipificación y el polimorfismo avanzado. Esta publicación explora cómo PolySubML diseña buenos mensajes de error de tipo y explica por qué los lenguajes existentes a menudo se quedan cortos en la mejora de los mensajes de error de inferencia de tipos. El autor propone cinco reglas: 1. Nunca adivines ni retrocedas; 2. No saques conclusiones precipitadas; 3. Pide al usuario que aclare la intención; 4. Permite al usuario escribir anotaciones de tipo explícitas; 5. No incluyas la inferencia de tipos estática en tu modelo de ejecución en tiempo de ejecución. Siguiendo estas reglas, PolySubML aborda con éxito muchos problemas comunes con la inferencia de tipos, mejorando significativamente la capacidad de depuración del código.

Leer más
Desarrollo inferencia de tipos

Más allá de la OOP: La evolución de la subtipificación en los lenguajes de programación

2025-03-29

Este artículo explora el papel crucial de la subtipificación en el diseño de lenguajes de programación. El autor, basándose en su experiencia en el desarrollo de varios lenguajes de programación, explica que la subtipificación no se limita a la herencia de clases en la programación orientada a objetos, sino que es un concepto mucho más fundamental: el tipo X es un subtipo del tipo Y si un valor del tipo X puede usarse dondequiera que se espere un valor del tipo Y. El artículo explica claramente por qué la subtipificación es crucial incluso en lenguajes de bajo nivel orientados al rendimiento, permitiendo que el compilador compruebe estáticamente valores nulos, alias y otros problemas, mejorando así la fiabilidad del código y, en última instancia, impulsando la evolución de los lenguajes de programación.

Leer más
Desarrollo subtipificación

Cuatro Limitaciones Sorprendentes del Verificador de Préstamos de Rust

2024-12-24

Este artículo profundiza en cuatro limitaciones sorprendentes del verificador de préstamos de Rust, encontradas incluso por programadores Rust experimentados. La primera limitación implica la incapacidad del verificador de préstamos para tener en cuenta completamente las instrucciones match y return, lo que lleva a comprobaciones redundantes al trabajar con HashMaps. La segunda limitación se refiere a la programación asincrónica, donde Rust actualmente carece de la capacidad de expresar ciertas firmas de tipo de devolución de llamada asincrónica. La tercera se centra en los cierres FnMut que no permiten el reaprovechamiento de variables capturadas, lo que restringe el acceso a estados mutables en operaciones asincrónicas. Finalmente, la falta de conocimiento del flujo de control del verificador Send resulta en que algunos Futures que deberían ser Send se marquen incorrectamente como no Send. El autor ilustra estas limitaciones y sus desafíos con ejemplos de código concretos y soluciones alternativas, abogando por mejoras en el sistema de tipos de Rust para mejorar la productividad del desarrollador.

Leer más