Mini-lenguajes: programación en código reducido

Fuentes: Lil' Fun Langs

Este artículo de Taylor Troesh explora el fascinante mundo de los "Lil' Fun Langs", o lenguajes de programación muy pequeños. La idea central es que es posible crear lenguajes de programación funcionales y con tipado estático con una cantidad sorprendentemente baja de código. El artículo no solo presenta una lista de estos lenguajes, sino que también analiza los componentes técnicos que los hacen posibles y los desafíos que implican.

¿Por qué son importantes? Estos lenguajes son valiosos tanto para el aprendizaje como para la experimentación. Permiten a los programadores comprender los fundamentos de la compilación y la tipificación de una manera más accesible. Además, pueden ser útiles para crear lenguajes específicos de dominio (DSL) altamente optimizados para tareas muy concretas.

¿Cómo funcionan? La mayoría de estos lenguajes se basan en la Lambda Calculus, un modelo matemático de computación. A menudo, implementan características clave de los lenguajes ML (como Haskell, F#, OCaml), incluyendo inferencia de tipos (Hindley-Milner), tipos algebraicos de datos (ADTs), y pattern matching. La tabla del artículo desglosa la cantidad de líneas de código (LOC) necesarias para implementar diferentes características, desde la aritmética básica hasta la tipificación polimórfica y la gestión de módulos. Por ejemplo, la inferencia de tipos polimórfica (HM) requiere aproximadamente 300 líneas de código, mientras que la implementación de efectos algebraicos puede llegar a las 1500 líneas.

Casos de uso y aplicaciones: Estos lenguajes no suelen estar destinados a aplicaciones a gran escala. Más bien, sirven como herramientas de investigación, plataformas de aprendizaje o para crear lenguajes muy especializados. Algunos ejemplos incluyen: compiladores experimentales, DSL para la configuración (como Dhall), o lenguajes para la programación embebida (como MicroHs).

Consideraciones: La creación de un lenguaje de programación, incluso uno pequeño, es un proyecto complejo. La tabla del artículo ilustra la escalabilidad de la complejidad: añadir características como la tipificación dependiente, la evaluación perezosa o la recolección de basura aumenta significativamente la cantidad de código necesario. Además, la eficiencia de estos lenguajes puede ser limitada debido a la falta de optimizaciones avanzadas. El artículo también menciona alternativas como el uso de LLVM para la generación de código, lo que permite a los lenguajes pequeños aprovechar las optimizaciones existentes.