En informática , la programación extensible es un estilo de programación que se centra en mecanismos para extender el lenguaje de programación , el compilador y el sistema de ejecución (entorno). Los lenguajes de programación extensibles, que admiten este estilo, fueron un área de trabajo activa en la década de 1960, pero el movimiento quedó marginado en la década de 1970. [ 1 ] La programación extensible se ha convertido en un tema de renovado interés en el siglo XXI. [ 2 ]
Movimiento histórico
El primer artículo generalmente [ 1 ] [ 3 ] asociado con el movimiento de lenguajes de programación extensibles es el artículo de M. Douglas McIlroy de 1960 sobre macros para lenguajes de programación de alto nivel . [ 4 ] Otra descripción temprana del principio de extensibilidad aparece en el artículo de Brooker y Morris de 1960 sobre el compilador-compilador . [ 5 ] El punto álgido del movimiento estuvo marcado por dos simposios académicos, en 1969 y 1971. [ 6 ] [ 7 ] Para 1975, un artículo de revisión sobre el movimiento de Thomas A. Standish [ 1 ] era esencialmente una autopsia. El Forth fue una excepción, pero pasó prácticamente desapercibido.
Carácter del movimiento histórico
Como es habitual, un lenguaje extensible consta de un lenguaje base que proporciona funcionalidades informáticas básicas y un metalenguaje capaz de modificar dicho lenguaje base. Un programa, a su vez, consta de modificaciones del metalenguaje y código escrito en el lenguaje base modificado.
La técnica de extensión de lenguaje más destacada utilizada en el movimiento fue la macrodefinición. La modificación gramatical también estuvo estrechamente asociada con el movimiento, lo que resultó en el eventual desarrollo de formalismos gramaticales adaptativos . La comunidad del lenguaje Lisp se mantuvo separada de la comunidad de lenguajes extensibles, aparentemente porque, como observó un investigador,
Cualquier lenguaje de programación en el que los programas y los datos sean esencialmente intercambiables puede considerarse un lenguaje extensible. ... Esto se puede comprobar fácilmente por el hecho de que Lisp se ha utilizado como lenguaje extensible durante años. [ 8 ]
En la conferencia de 1969, Simula se presentó como un lenguaje extensible.
Standish describió tres clases de extensión del lenguaje, a las que denominó paráfrasis , ortófrasis y metáfrasis (de lo contrario, paráfrasis y metáfrasis serían términos de traducción ).
- La paráfrasis define una funcionalidad mostrando cómo intercambiarla por algo previamente definido (o por definir). Como ejemplos, menciona definiciones de macros, definiciones de procedimientos ordinarios, extensiones gramaticales, definiciones de datos, definiciones de operadores y extensiones de estructuras de control.
- La ortofrase añade características a un lenguaje que no se podían lograr con el lenguaje base, como por ejemplo, añadir un sistema de entrada/salida (E/S) a un lenguaje base que antes carecía de primitivas de E/S. Las extensiones deben entenderse como ortofrase relativa a un lenguaje base dado, ya que una característica no definida en términos del lenguaje base debe definirse en términos de otro lenguaje. Esto corresponde a la noción moderna de complementos .
- La metáfora modifica las reglas de interpretación utilizadas para expresiones preexistentes. Esto se corresponde con la noción moderna de programación reflexiva (reflexión).
Muerte del movimiento histórico
Standish atribuyó el fracaso del movimiento de extensibilidad a la dificultad de programar extensiones sucesivas. Un programador podría crear una primera capa de macros sobre un lenguaje base. Si luego se crea una segunda capa de macros sobre esta, cualquier programador posterior debe conocer a fondo tanto el lenguaje base como la primera capa. Una tercera capa requeriría familiaridad con el lenguaje base y con las dos primeras, y así sucesivamente. Proteger al programador de los detalles de bajo nivel es la intención del movimiento de abstracción que reemplazó al de extensibilidad.
A pesar de la presentación inicial de Simula como extensible, en 1975, el estudio de Standish no parece haber incluido en la práctica las tecnologías más recientes basadas en la abstracción (aunque utilizó una definición muy general de extensibilidad que técnicamente podría haberlas incluido). Una historia de la abstracción de programación de 1978, desde la invención de la computadora hasta entonces, no mencionaba las macros y no daba ninguna pista de que el movimiento de lenguajes extensibles hubiera ocurrido alguna vez. [ 9 ] Las macros fueron admitidas tentativamente en el movimiento de abstracción a finales de la década de 1980 (quizás debido a la aparición de las macros higiénicas ), al otorgándoseles el seudónimo de abstracciones sintácticas . [ 10 ]
Movimiento moderno
En el sentido moderno, un sistema que admita la programación extensible proporcionará todas las características que se describen a continuación .
Sintaxis extensible
Esto simplemente significa que el o los lenguajes fuente que se van a compilar no deben ser cerrados, fijos ni estáticos. Debe ser posible agregar nuevas palabras clave, conceptos y estructuras al o los lenguajes fuente. Los lenguajes que permiten la adición de construcciones con sintaxis definida por el usuario incluyen Rocq , [ 11 ] Racket , Camlp4 , OpenC++ , Seed7 , [ 12 ] Red , Rebol y Felix . Si bien es aceptable que algunas características fundamentales e intrínsecas del lenguaje sean inmutables, el sistema no debe depender únicamente de esas características. Debe ser posible agregar otras nuevas.
Compilador extensible
En la programación extensible, un compilador no es un programa monolítico que convierte el código fuente en código binario ejecutable. El compilador debe ser extensible hasta el punto de ser, en realidad, una colección de complementos que facilitan la traducción del lenguaje fuente a cualquier formato . Por ejemplo, un compilador extensible admite la generación de código objeto, documentación del código, código fuente reformateado o cualquier otro resultado deseado. La arquitectura del compilador debe permitir a sus usuarios acceder al proceso de compilación y ofrecer tareas de procesamiento alternativas en cada paso razonable del mismo.
Para la simple tarea de traducir el código fuente a algo que pueda ejecutarse en una computadora, un compilador extensible debería:
- Utiliza una arquitectura de complementos o componentes para casi todos los aspectos de su funcionamiento.
- determinar qué idioma o variante de idioma se está compilando y localizar el complemento apropiado para reconocer y validar ese idioma.
- utilizar especificaciones de lenguaje formal para validar sintáctica y estructuralmente lenguajes fuente arbitrarios
- ayudar con la validación semántica de lenguajes fuente arbitrarios invocando un complemento de validación apropiado.
- Permite a los usuarios seleccionar entre diferentes tipos de generadores de código para que el ejecutable resultante pueda estar dirigido a diferentes procesadores, sistemas operativos, máquinas virtuales u otros entornos de ejecución.
- proporcionar facilidades para la generación de errores y extensiones de los mismos
- permitir nuevos tipos de nodos en el árbol de sintaxis abstracta (AST),
- permitir nuevos valores en los nodos del AST,
- permitir nuevos tipos de aristas entre nodos,
- admitir la transformación del AST de entrada, o partes del mismo, mediante algún "paso" externo.
- admitir la traducción del AST de entrada, o partes del mismo, a otra forma mediante algún "paso" externo.
- Ayudan con el flujo de información entre los pasos internos y externos, ya que transforman y traducen el AST en nuevos AST u otras representaciones.
Tiempo de ejecución extensible
En tiempo de ejecución, los sistemas de programación extensibles deben permitir que los lenguajes amplíen el conjunto de operaciones que admiten. Por ejemplo, si el sistema utiliza un intérprete de código de bytes , debe permitir la definición de nuevos valores de código de bytes. Al igual que con la sintaxis extensible, es aceptable que exista un conjunto (relativamente pequeño) de operaciones fundamentales o intrínsecas que sean inmutables. Sin embargo, debe ser posible sobrecargar o ampliar dichas operaciones intrínsecas para admitir comportamientos nuevos o adicionales.
Contenido separado del formulario
Los sistemas de programación extensibles deben considerar los programas como datos que se procesan. Dichos programas deben carecer por completo de cualquier tipo de información de formato. La visualización y edición de programas para los usuarios debe ser una función de traducción, compatible con el compilador extensible, que traduce los datos del programa a formatos más adecuados para su visualización o edición. Naturalmente, esta traducción debe ser bidireccional. Esto es importante porque debe ser posible procesar fácilmente los programas extensibles de diversas maneras. Es inaceptable que los únicos usos de la entrada en lenguaje fuente sean la edición, la visualización y la traducción a código máquina. El procesamiento arbitrario de programas se facilita al desacoplar la entrada en lenguaje fuente de las especificaciones sobre cómo debe procesarse (formatearse, almacenarse, visualizarse, editarse, etc.).
Compatibilidad con la depuración del lenguaje fuente
Los sistemas de programación extensibles deben admitir la depuración de programas utilizando las construcciones del lenguaje fuente original, independientemente de las extensiones o transformaciones que haya sufrido el programa para hacerlo ejecutable. En particular, no se puede asumir que la única forma de mostrar datos en tiempo de ejecución sea mediante estructuras o matrices . El depurador, o más correctamente el "inspector de programas", debe permitir la visualización de datos en tiempo de ejecución en formatos adecuados para el lenguaje fuente. Por ejemplo, si el lenguaje admite una estructura de datos para un proceso de negocio o flujo de trabajo , el depurador debe poder mostrar dicha estructura de datos como un diagrama de Ishikawa u otro formato proporcionado por un complemento.
Ejemplos
Véase también
Referencias
- 1 2 3 Standish, Thomas A., " Extensibilidad en el diseño de lenguajes de programación ", SIGPLAN Notices 10 no. 7 (julio de 1975), pp. 18–21.
- ↑ Gregory V. Wilson, " Programación extensible para el siglo XXI ", ACM Queue 2 n.º 9 (dic./ene. 2004–2005).
- ↑ Sammet, Jean E., Lenguajes de programación: historia y fundamentos , Prentice-Hall, 1969, sección III.7.2
- ↑ McIlroy, MD, " Extensiones de macroinstrucciones de lenguajes de compilación ", Communications of the ACM 3 n.º 4 (abril de 1960), págs. 214–220.
- ↑ Brooker, RA y Morris, D., " Un programa general de traducción para lenguas con estructura sintagmática ", Journal of the ACM 9 n.º 1 (enero de 1962), págs. 1-10. El artículo se recibió en 1960.
- ↑ Christensen, C. y Shaw, CJ, eds., Actas del Simposio sobre Lenguajes Extensibles, SIGPLAN Notices 4 n.º 8 (agosto de 1969).
- ↑ Schuman, SA, ed., Actas del Simposio Internacional sobre Lenguajes Extensibles, SIGPLAN Notices 6 n.º 12 (diciembre de 1971).
- ↑ Harrison, MC, en "Panel sobre el concepto de extensibilidad", págs. 53-54 del simposio de 1969.
- ↑ Guarino, LR, " La evolución de la abstracción en los lenguajes de programación ", CMU-CS-78-120 , Departamento de Ciencias de la Computación, Universidad Carnegie-Mellon, Pensilvania, 22 de mayo de 1978.
- ↑ Gabriel, Richard P., ed., " Informe preliminar sobre los requisitos para un sistema común de creación de prototipos ", SIGPLAN Notices 24 n.º 3 (marzo de 1989), págs. 93 y siguientes.
- ↑ "Extensiones de sintaxis y ámbitos de notación – Documentación de Coq 8.17.0" . coq.inria.fr . Consultado el 25 de mayo de 2023 .
- ↑ Zingaro, Daniel, " Lenguajes extensibles modernos ", Informe SQRL 47, Universidad McMaster (octubre de 2007), página 16.
Enlaces externos
General
- Artículo de Greg Wilson en la cola de ACM
- Discusión en Slashdot
- Lenguajes extensibles modernos archivados el 12 de junio de 2011 en la Wayback Machine – Un artículo de Daniel Zingaro
Herramientas
- MetaL : una implementación de motor de compilación de programación extensible
- XPS – Sistema de Programación Extensible (en desarrollo)
- MPS – Sistema de metaprogramación de JetBrains
Lenguajes con sintaxis extensible
- OpenZz
- xtc – C extensible
- Escritura en inglés
- Macros de Nemerle
- Macros sintácticas Boo
- Compilador de formato intermedio de la Universidad de Stanford
- Seed7 – El lenguaje de programación extensible
- Katahdin : un lenguaje con sintaxis y semántica mutables en tiempo de ejecución.
- π – un lenguaje con sintaxis extensible, implementado mediante un analizador sintáctico de Earley.
- Lenguajes de programación con sintaxis extensible
- paradigmas de programación