2025-11-23T09:55:17.068946

Extensibility in Programming Languages: An overview

Nicolajsen
I here conduct an exploration of programming language extensibility, making an argument for an often overlooked component of conventional language design. Now, this is not a technical detailing of these components, rather, I attempt to provide an overview as I myself have lacked during my time investigating programming languages. Thus, read this as an introduction to the magical world of extensibility. Through a literature review, I identify key extensibility themes - Macros, Modules, Types, and Reflection - highlighting diverse strategies for fostering extensibility. The analysis extends to cross-theme properties such as Parametricism and First-class citizen behaviour, introducing layers of complexity by highlighting the importance of customizability and flexibility in programming language constructs. By outlining these facets of existing programming languages and research, I aim to inspire future language designers to assess and consider the extensibility of their creations critically.
academic

Extensibilidad en Lenguajes de Programación: Una descripción general

Información Básica

  • ID del Artículo: 2510.13236
  • Título: Extensibilidad en Lenguajes de Programación: Una descripción general
  • Autor: Sebastian Mateos Nicolajsen (IT University of Copenhagen)
  • Clasificación: cs.PL (Lenguajes de Programación)
  • Fecha de Publicación: 15 de octubre de 2025 (preimpresión arXiv)
  • Enlace del Artículo: https://arxiv.org/abs/2510.13236

Resumen

Este artículo explora en profundidad la extensibilidad en lenguajes de programación, proporcionando argumentos para componentes frecuentemente ignorados en el diseño de lenguajes tradicionales. El autor identifica mediante revisión de literatura cuatro temas clave de extensibilidad: macros, módulos, tipos y reflexión, destacando estrategias diversificadas para promover la extensibilidad. El análisis se extiende a atributos transversales, como parametrización y comportamiento de ciudadano de primera clase, introduciendo niveles de complejidad al enfatizar la importancia de la personalización y flexibilidad en construcciones de lenguajes de programación.

Contexto de Investigación y Motivación

Preguntas de Investigación

  1. Problema Central: La extensibilidad en lenguajes de programación es frecuentemente ignorada en el diseño de lenguajes, careciendo de investigación sistemática y síntesis
  2. Definición Ambigua: El concepto de extensibilidad está definido de manera ambigua en la literatura, careciendo de marco de clasificación y comprensión clara
  3. Necesidades Prácticas: Los lenguajes de programación existentes frecuentemente se ven limitados por sus características inmutables cuando enfrentan nuevas demandas

Importancia del Problema

  1. Limitaciones del Lenguaje: La perspectiva tradicional considera los lenguajes de programación como artefactos inmutables, lo que limita la capacidad del lenguaje para adaptarse a nuevas demandas
  2. Eficiencia de Desarrollo: La extensibilidad es el único camino para mejorar la productividad del desarrollador y resolver limitaciones del lenguaje
  3. Desarrollo Futuro: Académicos como Guy Steele argumentan que diseñar para el crecimiento del lenguaje (es decir, extensibilidad) debería ser un elemento fundamental de lenguajes futuros

Limitaciones de Enfoques Existentes

  1. Investigación Dispersa: Aunque conceptos como macros, reflexión, funciones y módulos han sido ampliamente estudiados, el enfoque principal ha sido en reutilización, modularidad y abstracción, no en extensibilidad en sí
  2. Falta de Perspectiva Integral: Los trabajos existentes se centran principalmente en mejorar la extensibilidad o detalles de implementación, careciendo de investigación sistemática sobre la extensibilidad misma
  3. Teoría Insuficiente: La extensibilidad carece de definiciones explícitas y fundamentos teóricos comparada con conceptos como abstracción

Contribuciones Principales

  1. Clasificación Sistemática: Identifica cuatro temas centrales de extensibilidad mediante revisión de literatura (macros, módulos, tipos, reflexión)
  2. Atributos Transversales: Descubre y analiza dos atributos transversales importantes (parametrización y comportamiento de ciudadano de primera clase)
  3. Marco Teórico: Proporciona un marco estructurado para comprender la extensibilidad en lenguajes de programación
  4. Orientación Práctica: Ofrece guía a futuros diseñadores de lenguajes para evaluar y considerar la extensibilidad del lenguaje
  5. Identificación de Vacíos de Investigación: Señala conceptos menos explorados como bootstrapping, hooks de compilador y máquinas virtuales

Detalles Metodológicos

Metodología de Investigación

El artículo emplea un método sistemático de revisión de literatura, siguiendo el proceso definido por Kitchenham et al., combinado con métodos de codificación de datos de la Teoría Fundamentada.

Estrategia de Recopilación de Literatura

Conjunto Inicial de Literatura

  • Fuentes de Datos: 10 conferencias y revistas relacionadas con ingeniería de lenguajes
  • Conferencias Incluidas: HOPL, POPL, PLDI, CGO, DLS, GPCE, Onward, SLE, TOPLAS, PACMPL
  • Tamaño Inicial: 7090 artículos
  • Estrategia de Exclusión: Se excluyen conferencias enfocadas en paradigmas de lenguaje específicos

Proceso de Filtrado

  1. Filtrado por Palabras Clave: Se extraen 65 palabras clave de 19 artículos relevantes, generando 19 palabras clave adicionales
  2. Filtrado por Título: Se comparan palabras clave con títulos de artículos, filtrando a 648 artículos
  3. Filtrado por Resumen: Se comparan palabras clave con resúmenes y conclusiones, filtrando a 223 artículos
  4. Evaluación de Calidad: Se clasifican en altamente relevantes (69 artículos) y parcialmente relevantes (64 artículos) basándose en si describen o discuten extensibilidad

Extracción y Síntesis de Datos

  • Método de Extracción: Se extraen todas las descripciones cualitativas y discusiones de extensibilidad
  • Método de Síntesis: Se adoptan métodos de codificación de datos de la Teoría Fundamentada, utilizando un enfoque inductivo para desarrollar el sistema de clasificación
  • Mejora Iterativa: Se mejora y reevalúa continuamente la clasificación al descubrir nueva información

Configuración Experimental

Características del Conjunto de Datos

  • Tamaño General: 7090 artículos iniciales
  • Período de Tiempo: Datos recopilados en otoño de 2022
  • Análisis Final: 133 artículos relevantes (69 altamente relevantes + 64 parcialmente relevantes)

Criterios de Evaluación de Calidad

Preguntas Principales:

  • ¿Discute el artículo extensibilidad? (directa o indirectamente)
  • ¿Discute el artículo conceptos de extensibilidad?

Preguntas Secundarias:

  • ¿Discute el artículo conceptos específicos de extensibilidad?
  • ¿Discute el artículo lenguajes específicos y extensibilidad?

Marco de Análisis

Se adopta un enfoque inductivo para identificar temas, mediante comparación continua y refinamiento de clasificación, formando finalmente un marco de cuatro temas principales y dos atributos transversales.

Resultados Experimentales

Hallazgos Principales: Cuatro Temas Centrales

1. Macros

Motivación: Los macros permiten a los usuarios del lenguaje crear nuevos mecanismos de control de casi cualquier forma sintáctica, aumentando así la extensibilidad.

Clasificación de Tipos:

  • Macros Léxicos: Transformaciones basadas en cadenas, agnósticas sintácticamente pero sin garantizar seguridad sintáctica
  • Macros Sintácticos: Operan en árboles de sintaxis abstracta (AST), garantizando seguridad sintáctica
  • Macros Semánticos: Proporcionan análisis semántico, como verificación de tipos

Implementaciones Representativas:

  • Racket: Sistema de sintaxis modularizado
  • CPP: Motor de macros léxicos para lenguaje C
  • LISP: Sistema de macros sintácticos
  • C++: Plantillas y conceptos (funcionalidad similar a macros)

2. Módulos

Motivación: Los módulos se utilizan para estructurar código, permitiendo a los usuarios agrupar código para proporcionar lenguajes específicos de dominio o marcos como paquetes.

Sistema de Tipos:

  • Tipos Existenciales: Permiten módulos de primera clase pero ocultan detalles de implementación
  • Tipos Dependientes: Completamente transparentes
  • Tipos Explícitos: Proporcionan compromiso entre ambos

Consideraciones de Diseño:

  • Estructura jerárquica y relaciones de dependencia
  • Manejo de módulos anidados
  • Resolución de dependencias circulares

3. Tipos

Motivación: Los sistemas de tipos permiten a los usuarios hacer garantías en el lenguaje, combinando polimorfismo y programación genérica, proporcionando previsibilidad y seguridad en el desarrollo de programas.

Clasificación de Polimorfismo:

  • Polimorfismo Ad Hoc: El tipo depende de parámetros
  • Polimorfismo Universal:
    • Polimorfismo Paramétrico: Permite cualquier tipo como parámetro
    • Polimorfismo de Subtipo: Permite sustitución de tipos

Programación Genérica:

  • Diferentes enfoques de implementación: soporte de máquina virtual (C#) vs. borrado de tipos (Java)
  • Coincidencia estructural: ML, C++, OCaml, etc.

4. Reflexión

Motivación: La reflexión permite a los usuarios modificar programáticamente otras construcciones de programación, aumentando la modificabilidad y flexibilidad de conceptos que de otro modo serían inmodificables.

Rango de Capacidades:

  • Introspección y modificación de programas
  • Clonación y extensión de clases
  • Provisión de interfaz clara de máquina virtual

Desafíos:

  • Costo de rendimiento
  • Ruptura de encapsulación
  • Problemas de metaestabilidad

Atributos Transversales

1. Parametrización

Motivación: La parametrización aumenta la capacidad de personalización de construcciones, permitiendo mayor reutilización y abstracción.

Áreas de Aplicación:

  • Parametrización de Módulos: Como las construcciones functor de Standard ML y OCaml
  • Parametrización de Tipos: Implementada mediante polimorfismo, como concepts de C++ y type classes de Haskell

2. Comportamiento de Ciudadano de Primera Clase

Motivación: El atributo de ciudadano de primera clase permite a los usuarios usar construcciones como usan otros valores, permitiendo modificación dinámica de construcciones de programación.

Métodos de Implementación:

  • Módulos de Primera Clase: Pueden manipularse como estructuras de datos
  • Tipos de Primera Clase: Mecanismos como generadores de tipos

Conceptos Menos Explorados

  1. Bootstrapping: Autoiniciación del lenguaje, eliminando la noción de inmutabilidad del lenguaje
  2. Hooks de Compilador: Permiten a usuarios inyectar hooks en el compilador
  3. Máquinas Virtuales: Proporcionan funcionalidad rica y portabilidad para experimentación con lenguajes

Trabajo Relacionado

Investigación de Mejora de Extensibilidad

  • Daniel Zingaro: Aplica conceptos de paráfrasis, ortofrasis y metáfrasis de Standish a familias de lenguajes
  • Sebastian Erdweg y Felix Rieger: Proponen marco Sugar* para razonar sobre extensibilidad de lenguajes

Problemas de Expresividad

  • Philip Wadler: Plantea problemas de expresividad en lista de correo de Java, utilizados para medir extensibilidad de lenguajes de programación

Recursos Educativos

  • Robert Tennent: "Principios de Lenguajes de Programación", describe diferentes componentes de lenguajes
  • Peter Sestoft: "Conceptos de Lenguajes de Programación", cubre temas similares y decisiones de diseño

Conclusiones y Discusión

Conclusiones Principales

  1. Importancia de la Extensibilidad: La extensibilidad es factor clave para superar limitaciones de lenguajes y promover desarrollo impulsado por la comunidad
  2. Marco Sistemático: Cuatro temas (macros, módulos, tipos, reflexión) y dos atributos transversales proporcionan marco estructurado para comprender extensibilidad
  3. Consideración Equilibrada: La extensibilidad requiere equilibrio con otros atributos de calidad como rendimiento, seguridad y previsibilidad

Desafíos y Compensaciones

Costos de Extensibilidad

  1. Impacto en Rendimiento: La abstracción y extensibilidad de Java y C# resultan en rendimiento inferior a C
  2. Riesgos de Seguridad: Las extensiones desarrolladas por usuarios pueden introducir vulnerabilidades de seguridad
  3. Aumento de Complejidad: Puede resultar en inflación de lenguaje y soluciones específicas del contexto
  4. Fuga de Abstracción: La mayoría de abstracciones en lenguajes filtran detalles de implementación

Recomendaciones de Diseño

  • La extensibilidad debe ser parte integral del diseño general del lenguaje
  • Los ingenieros de lenguajes deben considerar los desafíos enfatizados
  • Es necesario encontrar equilibrio entre extensibilidad y otros atributos de calidad

Direcciones Futuras

  1. Exploración Profunda: Conceptos como bootstrapping, hooks de compilador y máquinas virtuales requieren investigación adicional
  2. Desarrollo Teórico: Se necesitan definiciones más claras de extensibilidad y fundamentos teóricos
  3. Aplicación Práctica: Proporcionar orientación de diseño de extensibilidad más específica para diseñadores de lenguajes

Evaluación Profunda

Fortalezas

  1. Fuerte Sistematicidad: Primera revisión sistemática de literatura sobre extensibilidad en lenguajes de programación y clasificación
  2. Marco Claro: Proporciona marco de análisis claro de cuatro temas más dos atributos transversales
  3. Alto Valor Práctico: Proporciona referencia y orientación valiosa para diseñadores de lenguajes
  4. Metodología Rigurosa: Adopta método estándar de revisión sistemática de literatura, proceso transparente y rastreable
  5. Cobertura Amplia: Abarca múltiples lenguajes y tecnologías desde históricos hasta modernos

Limitaciones

  1. Definición Ambigua: Aunque señala ambigüedad en definición de extensibilidad, el artículo tampoco proporciona definición más precisa
  2. Insuficiencia Empírica: Carece de investigación empírica cuantificada, dependiendo principalmente de análisis cualitativo
  3. Estándares de Evaluación: Carece de estándares objetivos para evaluar efectividad de diferentes mecanismos de extensibilidad
  4. Limitaciones de Alcance: Exclusión de algunas conferencias importantes podría omitir investigación relevante
  5. Sesgo del Investigador: Análisis por investigador único podría introducir sesgo subjetivo

Impacto

  1. Contribución Académica: Proporciona nueva perspectiva de investigación y marco para campo de investigación de lenguajes de programación
  2. Valor Práctico: Tiene valor de referencia importante para diseñadores de lenguajes y desarrolladores de herramientas
  3. Significado Inspirador: Puede inspirar investigación más profunda sobre extensibilidad de lenguajes
  4. Valor Educativo: Puede servir como material de referencia importante para cursos de lenguajes de programación

Escenarios de Aplicación

  1. Diseño de Lenguajes: Diseño de nuevos lenguajes de programación y mejora de lenguajes existentes
  2. Desarrollo de Herramientas: Diseño de mecanismos de extensión para herramientas de desarrollo como IDE y compiladores
  3. Investigación Académica: Investigación adicional en teoría y práctica de lenguajes de programación
  4. Educación y Capacitación: Desarrollo de cursos y materiales de capacitación de lenguajes de programación

Referencias

El artículo contiene 135 referencias bibliográficas, cubriendo múltiples aspectos incluyendo historia de lenguajes de programación, principios de diseño e implementaciones específicas, proporcionando base de literatura completa para investigación de extensibilidad. Las referencias clave incluyen:

  • Standish (1975): Trabajo temprano en diseño de lenguajes de programación extensibles
  • Steele (1998): Perspectiva importante sobre crecimiento de lenguajes
  • Varios artículos HOPL: Proporcionan material valioso sobre historia de lenguajes e ideas de diseño

Evaluación General: Este es un artículo de revisión de alta calidad que proporciona marco teórico importante y orientación práctica para investigación de extensibilidad en lenguajes de programación. Aunque tiene algunas limitaciones, su enfoque sistemático y marco de análisis claro lo convierten en contribución importante al campo. Tiene valor de referencia importante para diseñadores de lenguajes, investigadores y estudiantes.