Articulo de referencia

Compilador-compilador

En informática , un compilador-compilador o generador de compiladores es una herramienta de programación que crea un analizador sintáctico , un intérprete o un compilador a part...

En informática , un compilador-compilador o generador de compiladores es una herramienta de programación que crea un analizador sintáctico , un intérprete o un compilador a partir de alguna forma de descripción formal de un lenguaje de programación y una máquina.

El tipo más común de compilador-compilador se llama generador de analizadores sintácticos . [ 1 ] Solo maneja análisis sintáctico .

La descripción formal de un lenguaje suele ser una gramática que se utiliza como entrada para un generador de analizadores sintácticos. A menudo se asemeja a la forma Backus-Naur (BNF), a la forma Backus-Naur extendida (EBNF) o tiene su propia sintaxis. Los archivos de gramática describen la sintaxis del lenguaje de programación de destino del compilador generado y las acciones que deben realizarse sobre sus construcciones específicas.

El generador de analizadores devuelve el código fuente del analizador sintáctico del lenguaje de programación. Este código fuente se compila en un analizador, que puede ser independiente o estar integrado. El analizador compilado recibe como entrada el código fuente del lenguaje de programación de destino y realiza una acción o genera un árbol de sintaxis abstracta (AST).

Los generadores de analizadores sintácticos no manejan la semántica del AST ni la generación de código máquina para la máquina de destino. [ 2 ]

Un metacompilador es una herramienta de desarrollo de software que se utiliza principalmente para la construcción de compiladores , traductores e intérpretes de otros lenguajes de programación. [ 3 ] La entrada a un metacompilador es un programa informático escrito en un metalenguaje de programación especializado , diseñado principalmente para la construcción de compiladores. [ 3 ] [ 4 ] El lenguaje del compilador resultante se denomina lenguaje objeto. La entrada mínima para producir un compilador es un metaprograma que especifica la gramática del lenguaje objeto y las transformaciones semánticas en un programa objeto . [ 4 ] [ 5 ]

Variantes

Un generador de analizadores sintácticos típico asocia código ejecutable a cada una de las reglas de la gramática que deben ejecutarse cuando el analizador aplica dichas reglas. Estos fragmentos de código a veces se denominan rutinas de acción semántica, ya que definen la semántica de la estructura sintáctica que analiza el analizador. Dependiendo del tipo de analizador que se deba generar, estas rutinas pueden construir un árbol de análisis (o árbol de sintaxis abstracta ) o generar código ejecutable directamente.

Una de las primeras versiones (1964), sorprendentemente potente, de compiladores-compiladores es META II , que aceptaba una gramática analítica con funciones de salida que producían código máquina de pila, y es capaz de compilar su propio código fuente y otros lenguajes.

Entre los primeros programas de las versiones originales de Unix que se desarrollaban en Bell Labs se encontraba el sistema de dos partes lex y yacc , que normalmente se utilizaba para generar código en lenguaje de programación C , pero que contaba con un sistema de salida flexible que podía utilizarse para todo, desde lenguajes de programación hasta la conversión de archivos de texto . Sus versiones modernas de GNU son flex y bison .

Algunos compiladores experimentales toman como entrada una descripción formal de la semántica del lenguaje de programación, generalmente mediante semántica denotacional . Este enfoque se conoce como «compilación basada en semántica» y fue desarrollado por Peter Mosses en 1978 con su Sistema de Implementación Semántica (SIS). [ 6 ] Sin embargo, tanto el compilador generado como el código resultante eran ineficientes en tiempo y espacio. Actualmente no se construyen compiladores de producción de esta manera, pero la investigación continúa.

El proyecto Production Quality Compiler-Compiler ( PQCC ) de la Universidad Carnegie Mellon no formaliza la semántica, pero sí cuenta con un marco semiformal para la descripción de máquinas.

Existen muchos tipos de compiladores, incluidos los generadores de máquinas de reescritura ascendentes (véase JBurg ) que se utilizan para organizar los árboles de sintaxis según una gramática de reescritura para la generación de código, y los generadores de analizadores de gramática de atributos (por ejemplo, ANTLR se puede utilizar para la comprobación de tipos simultánea, la propagación de constantes y más durante la etapa de análisis).

Metacompiladores

Los metacompiladores reducen la tarea de escribir compiladores al automatizar los aspectos que son iguales independientemente del lenguaje objeto. Esto posibilita el diseño de lenguajes específicos de dominio que se ajustan a la especificación de un problema particular. Un metacompilador reduce el costo de producir traductores para dichos lenguajes objeto específicos de dominio hasta un punto en el que resulta económicamente viable incluir en la solución de un problema un diseño de lenguaje específico de dominio . [ 4 ]

Como el metalenguaje de un metacompilador suele ser un potente lenguaje de procesamiento de cadenas y símbolos, a menudo tienen aplicaciones importantes para aplicaciones de propósito general, incluyendo la generación de una amplia gama de otras herramientas de ingeniería y análisis de software. [ 4 ] [ 7 ]

Además de ser útil para el desarrollo de lenguajes específicos de dominio , un metacompilador es un ejemplo paradigmático de lenguaje específico de dominio, diseñado para el ámbito de la escritura de compiladores.

Un metacompilador es un metaprograma , generalmente escrito en su propio metalenguaje o en un lenguaje de programación existente. El proceso de autocompilación de un metacompilador, escrito en su propio metalenguaje, es equivalente al de un compilador autoalojado . La mayoría de los compiladores actuales son autoalojados. El autoaloje es una herramienta poderosa que muchos metacompiladores utilizan para extender fácilmente su propio metalenguaje de metaprogramación. La característica que distingue a un metacompilador de otros compiladores es que toma como entrada un lenguaje de metaprogramación especializado que describe todos los aspectos de su funcionamiento. Un metaprograma producido por un metacompilador es tan completo como un programa escrito en C++ , BASIC o cualquier otro lenguaje de programación general . El metalenguaje de metaprogramación es una potente herramienta que facilita el desarrollo de lenguajes de programación y otras herramientas informáticas. Los procesadores de línea de comandos, la transformación y el análisis de cadenas de texto se pueden codificar fácilmente utilizando los metalenguajes de metaprogramación de los metacompiladores.

Un paquete de desarrollo completo incluye un enlazador y una biblioteca de soporte en tiempo de ejecución . Generalmente, se necesita un lenguaje de programación de sistemas orientado a máquina , como C o C++, para escribir la biblioteca de soporte. Una biblioteca que contiene las funciones de soporte necesarias para el proceso de compilación suele completar el paquete metacompilador.

El significado de metacompilador

En informática, el prefijo meta se usa comúnmente para referirse a (su propia categoría) . Por ejemplo, los metadatos son datos que describen otros datos. Un lenguaje que se usa para describir otros lenguajes es un metalenguaje . Meta también puede significar en un nivel de abstracción superior . Un metalenguaje opera en un nivel de abstracción superior para describir propiedades de un lenguaje. La forma Backus-Naur (BNF) es un metalenguaje formal que se usó originalmente para definir ALGOL 60. BNF es un metalenguaje débil , ya que solo describe la sintaxis y no dice nada sobre la semántica o el significado. La metaprogramación es la escritura de programas de computadora con la capacidad de tratar los programas como sus datos. Un metacompilador toma como entrada un metaprograma escrito en un metalenguaje especializado (una abstracción de nivel superior) diseñado específicamente para el propósito de la metaprogramación. [ 4 ] [ 5 ] La salida es un programa objeto ejecutable.

Se puede establecer una analogía: así como un compilador de C++ toma como entrada un programa en lenguaje de programación C++ , un metacompilador toma como entrada un programa de metalenguaje de metaprogramación .

Metacompilador Forth

Muchos defensores del lenguaje Forth denominan metacompilación al proceso de creación de una nueva implementación de Forth, y afirman que constituye un metacompilador. La definición de metacompilador en Forth es:

"Un metacompilador es un compilador que procesa su propio código fuente, dando como resultado una versión ejecutable de sí mismo."

Este uso del término metacompilador en Forth es objeto de controversia en la informática convencional. Véase Forth (lenguaje de programación) e Historia de la construcción de compiladores . El proceso real de compilación de Forth es una combinación de Forth como lenguaje de programación autoalojado y extensible y, a veces, compilación cruzada , terminología establecida desde hace mucho tiempo en informática. Los metacompiladores son un sistema general de escritura de compiladores. Además, el concepto de metacompilador de Forth es indistinguible de un lenguaje autoalojado y extensible. El proceso real actúa a un nivel inferior definiendo un subconjunto mínimo de palabras forth , que se pueden usar para definir palabras forth adicionales. Una implementación completa de Forth se puede definir a partir del conjunto base. Esto suena como un proceso de arranque. El problema es que casi todos los compiladores de lenguajes de propósito general también se ajustan a la descripción de metacompilador de Forth.

Cuando X (un compilador autoalojado) procesa su propio código fuente, dando como resultado una versión ejecutable de sí mismo, X es un metacompilador.

Simplemente reemplace X con cualquier lenguaje común: C, C++, Java , Pascal , COBOL , Fortran , Ada , Modula-2 , etc. Y X sería un metacompilador según la definición de Forth. Un metacompilador opera en un nivel de abstracción superior al del compilador que compila. Solo opera al mismo nivel (de compilador autoalojado) cuando se compila a sí mismo. Hay que ver el problema con esta definición de metacompilador. Se puede aplicar a casi cualquier lenguaje.

Sin embargo, al examinar el concepto de programación en Forth, añadir nuevas palabras al diccionario y extender el lenguaje de esta manera constituye metaprogramación. Es precisamente esta metaprogramación en Forth lo que lo convierte en un metacompilador.

Programar en Forth consiste en añadir nuevas palabras al lenguaje. Modificar el lenguaje de esta forma se denomina metaprogramación . Forth es un metacompilador, ya que es un lenguaje diseñado específicamente para la metaprogramación. Programar en Forth implica extender Forth; añadir palabras a su vocabulario crea un nuevo dialecto . Forth es un metacompilador especializado para dialectos del lenguaje Forth.

Historia

El diseño del compilador-compilador original fue iniciado por Tony Brooker y Derrick Morris en 1959, con las pruebas iniciales comenzando en marzo de 1962. [ 8 ] El compilador-compilador Brooker Morris (BMCC) se utilizó para crear compiladores para la nueva computadora Atlas en la Universidad de Manchester , para varios lenguajes: Mercury Autocode , Extended Mercury Autocode, Atlas Autocode , ALGOL 60 y ASA Fortran . Aproximadamente al mismo tiempo, ET (Ned) Irons estaba realizando trabajos relacionados en Princeton, y Alick Glennie en el Atomic Weapons Research Establishment en Aldermaston, cuyo artículo "Syntax Machine" (desclasificado en 1977) inspiró la serie META de sistemas de escritura de traductores mencionados más adelante.

La historia temprana de los metacompiladores está estrechamente ligada a la historia del Grupo de Trabajo 1 de SIG/PLAN sobre Compiladores Dirigidos por Sintaxis. El grupo se inició principalmente gracias al esfuerzo de Howard Metcalfe en el área de Los Ángeles. [ 9 ] En el otoño de 1962, Howard Metcalfe diseñó dos intérpretes para escribir compiladores. Uno utilizaba una técnica de análisis de abajo hacia arriba basada en un método descrito por Ledley y Wilson. [ 10 ] El otro utilizaba un enfoque de arriba hacia abajo basado en el trabajo de Glennie para generar oraciones aleatorias en inglés a partir de una gramática libre de contexto . [ 11 ]

Al mismo tiempo, Val Schorre describió dos "metamáquinas", una generativa y otra analítica. La máquina generativa se implementó y produjo expresiones algebraicas aleatorias. Meta I, el primer metacompilador, fue implementado por Schorre en un IBM 1401 en la UCLA en enero de 1963. Sus intérpretes y metamáquinas originales fueron escritos directamente en un lenguaje pseudomáquina. META II , sin embargo, fue escrito en un metalenguaje de nivel superior capaz de describir su propia compilación en el lenguaje pseudomáquina. [ 12 ] [ 13 ] [ 14 ]

Lee Schmidt, de Bolt, Beranek y Newman, escribió un metacompilador en marzo de 1963 que utilizaba una pantalla CRT en el PDP-1 de tiempo compartido. [ 15 ] Este compilador producía código máquina real en lugar de código interpretado y se basaba parcialmente en Meta I.

Schorre desarrolló Meta II a partir de Meta I durante la primavera de 1963. El artículo sobre el sistema de metacompilación refinado, presentado en la conferencia ACM de Filadelfia de 1964, es el primer artículo sobre un metacompilador disponible como referencia general. La sintaxis y la técnica de implementación del sistema de Schorre sentaron las bases para la mayoría de los sistemas posteriores. El sistema se implementó en un pequeño microprocesador 1401 y se utilizó para implementar un lenguaje similar a ALGOL .

Inmediatamente después surgieron muchos sistemas similares.

Roger Rutman de AC Delco desarrolló e implementó LOGIK, un lenguaje para simulación de diseño lógico, en el IBM 7090 en enero de 1964. [ 16 ] Este compilador utilizaba un algoritmo que producía código eficiente para expresiones booleanas.

Otro artículo en las actas de la ACM de 1964 describe Meta III , desarrollado por Schneider y Johnson en la UCLA para la IBM 7090. [ 17 ] Meta III representa un intento de producir código máquina eficiente para una amplia gama de lenguajes. Meta III se implementó completamente en lenguaje ensamblador. Se escribieron dos compiladores en Meta III: CODOL, un compilador de demostración para la escritura de compiladores, y PUREGOL, un dialecto de ALGOL 60. (Fue una verdadera osadía llamarlo ALGOL).

A finales de 1964, Lee Schmidt desarrolló el metacompilador EQGEN, desde el PDP-1 hasta el Beckman 420. EQGEN era un lenguaje generador de ecuaciones lógicas.

En 1964, System Development Corporation inició un importante proyecto para el desarrollo de metacompiladores. Este proyecto incluye los potentes metacompiladores Book1 y Book2, escritos en Lisp, que cuentan con una amplia capacidad de búsqueda en árbol y de copia de seguridad. Meta 5, derivado de uno de los sistemas Q-32 de SDC, es un resultado de este proyecto. [ 18 ] El sistema Meta 5 incorpora la copia de seguridad del flujo de entrada y otras funcionalidades suficientes para analizar cualquier lenguaje sensible al contexto. Este sistema se lanzó con éxito a un gran número de usuarios y contaba con numerosas aplicaciones de manipulación de cadenas, además de la compilación. Dispone de elaboradas pilas de pila, funciones para la configuración y comprobación de atributos, y mecanismos de salida. El hecho de que Meta 5 traduzca con éxito programas JOVIAL a programas PL/I demuestra su potencia y flexibilidad.

Robert McClure, de Texas Instruments, inventó un compilador-compilador llamado TMG (presentado en 1965). TMG se utilizó para crear los primeros compiladores de lenguajes de programación como B , PL/I y ALTRAN . Junto con el metacompilador de Val Schorre, fue una de las primeras inspiraciones para el último capítulo de * El arte de la programación de computadoras * de Donald Knuth . [ 19 ]

El sistema LOT se desarrolló en 1966 en el Instituto de Investigación de Stanford y se basó casi exclusivamente en Meta II. [ 20 ] Contaba con nuevas construcciones específicas que le permitían generar un compilador que, a su vez, podía compilar un subconjunto de PL/I. Este sistema disponía de amplias herramientas para la recopilación de estadísticas y se utilizaba para estudiar las características del análisis descendente.

SIMPLE es un sistema de traducción especializado diseñado para ayudar a escribir preprocesadores para PL/I. SIMPLE, escrito en PL/I, se compone de tres componentes: un ejecutor, un analizador sintáctico y un constructor semántico. [ 21 ]

El compilador TREE-META fue desarrollado en el Instituto de Investigación de Stanford en Menlo Park, California, en abril de 1968. La historia temprana de los metacompiladores está bien documentada en el manual de TREE-META. TREE-META siguió algunos de los desarrollos de SDC. A diferencia de los metacompiladores anteriores, separó el procesamiento semántico del procesamiento sintáctico. Las reglas sintácticas contenían operaciones de construcción de árboles que combinaban elementos del lenguaje reconocidos con nodos de árbol. La representación de la estructura de árbol de la entrada se procesaba mediante una forma simple de reglas de análisis sintáctico. Estas reglas utilizaban el reconocimiento de nodos y la comprobación de atributos que, al coincidir, daban como resultado la ejecución de la acción asociada. Además, también se podía comprobar la similitud de elementos del árbol en una regla de análisis sintáctico. Las reglas de análisis sintáctico también constituían un lenguaje recursivo, pudiendo llamar a otras reglas pasando elementos del árbol antes de que se ejecutara la acción de la regla.

El concepto de metamáquina propuesto originalmente por Glennie es tan simple que se han diseñado tres versiones de hardware y una de ellas se ha implementado. Esta última se encuentra en la Universidad de Washington en San Luis. Esta máquina se construyó con componentes macromodulares y utiliza como instrucciones los códigos descritos por Schorre.

CWIC (Compiler for Writing and Implementing Compilers) es el último metacompilador Schorre conocido. Fue desarrollado en Systems Development Corporation por Erwin Book, Dewey Val Schorre y Steven J. Sherman. Con toda la potencia de Lisp 2, un lenguaje de procesamiento de listas que optimizaba algoritmos podía operar sobre listas y árboles generados sintácticamente antes de la generación de código. CWIC también incluía una tabla de símbolos integrada en el lenguaje.

Con el resurgimiento de los lenguajes específicos de dominio y la necesidad de generadores de analizadores sintácticos que sean fáciles de usar, fáciles de entender y fáciles de mantener, los metacompiladores se están convirtiendo en una herramienta valiosa para proyectos avanzados de ingeniería de software.

Otros ejemplos de generadores de analizadores sintácticos en la línea de yacc son ANTLR , Coco/R , [ 22 ] CUP, GNU Bison , Eli, [ 23 ] FSL, SableCC , SID (Syntax Improving Device), [ 24 ] y JavaCC . Si bien son útiles, los generadores de analizadores sintácticos puros solo abordan la parte de análisis sintáctico del problema de construir un compilador. Las herramientas con un alcance más amplio, como PQCC , Coco/R y DMS Software Reengineering Toolkit, brindan un soporte considerable para actividades posteriores al análisis sintáctico más difíciles, como el análisis semántico, la optimización y la generación de código.

Metalenguajes de Schorre

Los primeros metacompiladores de Schorre, META I y META II, fueron desarrollados por D. Val Schorre en la UCLA. Posteriormente surgieron otros metacompiladores basados ​​en Schorre, cada uno con mejoras en el análisis del lenguaje y/o la generación de código.

En programación, es común usar el nombre del lenguaje de programación para referirse tanto al compilador como al lenguaje en sí, dependiendo del contexto. Un programa en C++ se compila con un compilador de C++. Esto también se aplica a continuación. Por ejemplo, META II es tanto el compilador como el lenguaje.

Los metalenguajes de la línea de metacompiladores Schorre son lenguajes de programación funcionales que utilizan ecuaciones de sintaxis de análisis gramatical descendente con construcciones de transformación de salida integradas.

Una ecuación sintáctica:

<nombre> = <cuerpo>;

es una función de prueba compilada que devuelve éxito o fracaso . <name> es el nombre de la función. <body> es una forma de expresión lógica que consta de pruebas que pueden agruparse, tener alternativas y producir resultados. Una prueba es como un booleano en otros lenguajes, donde éxito es verdadero y fracaso es falso .

Definir un lenguaje de programación analíticamente de arriba hacia abajo es natural. Por ejemplo, un programa podría definirse como:

programa = $declaración; 

Definir un programa como una secuencia de cero o más declaraciones.

En los lenguajes Schorre META X existe una regla de control. La regla de programa anterior es un ejemplo de esta regla. La regla de programa es una función de prueba que llama a una declaración, una regla de prueba , que devuelve éxito o fracaso . El operador de bucle $ llama repetidamente a la declaración hasta que se devuelve un fracaso . El operador $ siempre es exitoso, incluso cuando no hay ninguna declaración. El programa anterior siempre devolvería éxito. (En CWIC, un fallo prolongado puede omitir la declaración. Un fallo prolongado forma parte del sistema de retroceso de CWIC).

Los conjuntos de caracteres de estos primeros compiladores eran limitados. El carácter / se usaba para el operador de disyunción (o). "A o B" se escribe como A / B. Los paréntesis ( ) se usan para agrupar.

A (B / C)

Describe una construcción de A seguida de B o C. Como expresión booleana sería

A y (B o C)

Una secuencia XY implica el significado de X e Y. Los paréntesis ( ) indican agrupación y / el operador OR . El orden de evaluación siempre es de izquierda a derecha, ya que la secuencia de caracteres de entrada se especifica mediante el orden de las pruebas.

Para mayor claridad, se utilizan operadores especiales cuyo primer carácter es un "." Se utiliza .EMPTY como última alternativa cuando no es necesario que haya ninguna alternativa previa.

X (A / B / .VACÍO)

Indica que X puede ir seguido opcionalmente de A o B. Esta es una característica específica de estos metalenguajes, que son lenguajes de programación. El retroceso se evita con lo anterior. Otros sistemas de construcción de compiladores podrían haber declarado las tres secuencias posibles y dejado que el analizador sintáctico las interpretara.

Las características de los metalenguajes de metaprogramación mencionados anteriormente son comunes a todos los metacompiladores de Schorre y a los derivados de ellos.

META I

META I era un metacompilador compilado manualmente que se utilizaba para compilar META II. Se sabe poco más de META I, salvo que la compilación inicial de META II produjo un código casi idéntico al del compilador META I, también codificado manualmente.

META II

Cada regla consta opcionalmente de pruebas, operadores y resultados. Una regla intenta hacer coincidir alguna parte del flujo de caracteres de entrada del programa, devolviendo éxito o fracaso. Si tiene éxito, la entrada avanza sobre los caracteres coincidentes. Si falla, la entrada no avanza.

Las producciones de salida generaron una forma de código ensamblador directamente a partir de una regla de sintaxis.

META III

META III es una evolución de META II, desarrollada por Frederik W. Schneider y Glen D. Johnson. Los identificadores, cadenas, dígitos, etc., coincidentes se insertan en una pila de operandos, y se añaden nuevos operadores para manipularla según sea necesario. Una cola FIFO explícita, al utilizarse junto con la pila de operandos, permite manipulaciones complejas de los operandos, como la conversión de búsqueda en profundidad a búsqueda en amplitud. Existe una tabla de símbolos explícita, junto con operadores para editarla y consultarla. Finalmente, se incluye un concepto de seguimiento de registros indentado para facilitar la generación de secuencias óptimas de manipulación de registros.

ÁRBOL-META

TREE-META introdujo los operadores de construcción de árboles : <nombre_de_nodo> y [ < número > ], que trasladan las transformaciones de producción de salida a reglas sin analizar. Estos operadores se utilizaron en las reglas gramaticales, transformando directamente la entrada en un árbol de sintaxis abstracta . Las reglas sin analizar también son funciones de prueba que coinciden con patrones de árbol. Estas reglas se invocan desde una regla gramatical cuando se debe transformar un árbol de sintaxis abstracta en código de salida. La construcción de un árbol de sintaxis abstracta y las reglas sin analizar permitieron realizar optimizaciones locales mediante el análisis del árbol de análisis.

El traslado de las producciones de salida a las reglas sin analizar estableció una clara separación entre el análisis gramatical y la producción de código. Esto facilitó la lectura y comprensión de la programación.

CWIC

En 1968–1970, Erwin Book, Dewey Val Schorre y Steven J. Sherman desarrollaron CWIC. [ 4 ] (Compilador para escribir e implementar compiladores) en System Development Corporation Charles Babbage Institute Center for the History of Information Technology (Caja 12, carpeta 21) ,

CWIC es un sistema de desarrollo de compiladores compuesto por tres lenguajes específicos de dominio, cada uno diseñado para describir de forma directa ciertos aspectos de la traducción. El lenguaje sintáctico se utiliza para describir el reconocimiento del texto fuente y su construcción a partir de él en una estructura de árbol intermedia . El lenguaje generador se utiliza para describir la transformación del árbol en el lenguaje objeto apropiado.

El lenguaje sintáctico sigue la línea anterior de metacompiladores de Dewey Val Schorre. Se asemeja mucho a TREE-META, ya que incorpora operadores de construcción de árboles en su lenguaje sintáctico. Las reglas de análisis sintáctico de TREE-META se extienden para funcionar con el lenguaje generador basado en objetos, basado en LISP 2 .

CWIC incluye tres idiomas:

  • Sintaxis : Transforma la entrada del programa fuente en estructuras de lista utilizando una fórmula de transformación gramatical. Una estructura de expresión analizada se pasa a un generador mediante la colocación de una llamada a generador en una regla. Un árbol se representa mediante una lista cuyo primer elemento es un objeto nodo. El lenguaje tiene operadores, < y > , específicamente para crear listas. El operador de dos puntos : se utiliza para crear objetos nodo. :ADD crea un nodo ADD. El operador de exclamación ! combina varias entradas analizadas con un nodo para crear un árbol. Los árboles creados por reglas de sintaxis se pasan a funciones generadoras, que devuelven éxito o fracaso. El lenguaje de sintaxis es muy similar a TREE-META. Ambos utilizan dos puntos para crear un nodo. La exclamación de construcción de árboles de CWIC  !<número> funciona igual que [<número>] de TREE-META.
  • Generador : una serie con nombre de reglas de transformación, cada una compuesta por una regla de coincidencia de patrones sin analizar y una producción de salida escrita en un lenguaje similar a LISP 2. La traducción se realizó al código máquina binario de IBM 360. Otras funcionalidades del lenguaje generador generalizaban la salida. [ 4 ]
  • MOL-360 : un lenguaje de implementación de nivel medio independiente para la familia de ordenadores IBM System/360, desarrollado en 1968 y utilizado para escribir la biblioteca de soporte subyacente.

Generadores de lenguaje

El lenguaje Generators tenía una semántica similar a la de Lisp . El árbol de análisis sintáctico se concebía como una lista recursiva. La forma general de una función del lenguaje Generator es:

 function-name(first-unparse_rule) => first-production_code_generator (segunda-regla_de_análisis) => segundo-generador_de_código_de_producción (third-unparse_rule) => third-production_code_generator ...

El código para procesar un árbol dado incluía las características de un lenguaje de programación de propósito general, además de un formato: <stuff> , que emitiría (stuff) en el archivo de salida. Se puede usar una llamada a un generador en unparse_rule. Al generador se le pasa el elemento del patrón unparse_rule en el que se encuentra y sus valores de retorno se enumeran entre paréntesis. Por ejemplo:

 expr_gen(ADD[expr_gen(x),expr_gen(y)]) => <AR + (x*16)+y;> registro de liberación(y); devolver x; (SUB[expr_gen(x),expr_gen(y)])=> <SR + (x*16)+y;> registro de liberación(y); devolver x; (MUL[expr_gen(x),expr_gen(y)])=> . . . (x)=> r1 = getreg(); cargar(r1, x); devolver r1; ...

Es decir, si el árbol de análisis sintáctico se ve como (ADD[<algo1>,<algo2>]), se llamaría a expr_gen(x) con <algo1> y devolvería x. Una variable en la regla de análisis sintáctico es una variable local que se puede usar en el generador de código de producción. Se llama a expr_gen(y) con <algo2> y devuelve y. Aquí, una llamada a un generador en una regla de análisis sintáctico recibe el elemento en la posición que ocupa. Con suerte, en lo anterior, x e y serán registros al regresar. La última transformación está destinada a cargar una operación atómica en un registro y devolver el registro. La primera producción se usaría para generar la instrucción "AR" (Add Register) de 360 ​​bits con los valores apropiados en los registros generales. El ejemplo anterior es solo una parte de un generador. Cada expresión del generador se evalúa a un valor que luego se puede procesar. La última transformación podría haberse escrito igual de bien como:

 (x)=> devolver load(getreg(), x); 

En este caso, load devuelve su primer parámetro, el registro devuelto por getreg(). Las funciones load y getreg son otros generadores de CWIC.

CWIC abordó los lenguajes específicos de dominio antes de que existiera el término lenguaje específico de dominio.

De los autores de CWIC:

"Un metacompilador facilita la tarea de construir compiladores automatizando sus aspectos no creativos, aquellos que son los mismos independientemente del lenguaje que el compilador resultante deba traducir. Esto permite diseñar lenguajes adecuados a la especificación de un problema particular. Reduce el costo de producir procesadores para dichos lenguajes hasta un punto en el que resulta económicamente viable comenzar la solución de un problema mediante el diseño del lenguaje." [ 4 ]

Ejemplos

Véase también

Referencias y notas

  1. Compiladores  : principios, técnicas y herramientas . Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman, Alfred V. Aho (Segunda  edición). Boston. 2007. pág.  287. ISBN 978-0-321-48681-3OCLC 70775643 {{cite book}}: CS1 maint: falta el editor de ubicación ( enlace ) CS1 maint: otros ( enlace )
  2. "Un compilador dirigido por sintaxis para ALGOL 60" Edgar T. Irons, Communications of the ACM Volumen 4 Número 1, enero de 1961.
  3. 1 2 Metacompilador: ( ciencia informática ) Un compilador que se utiliza principalmente para construir compiladores para otros lenguajes de programación. "Diccionario científico-técnico McGraw-Hill, 6.ª edición" . McGraw-Hill Companies. Archivado del original el 7 de abril de 2018. Consultado el 7 de abril de 2018 .
  4. 1 2 3 4 5 6 7 8 Book, Erwin; Dewey Val Schorre; Steven J. Sherman (junio de 1970). "El sistema CWIC/36O, un compilador para escribir e implementar compiladores". ACM SIGPLAN Notices . 5 (6): 11– 29. doi : 10.1145/954344.954345 . S2CID 44675240 . 
  5. 1 2 C. Stephen Carr, David A. Luther, Sherian Erdmann, El sistema compilador-compilador TREE-META: un sistema meta compilador para Univac 1108 y General Electric 645 , Informe técnico de la Universidad de Utah RADC-TR-69-83.
  6. Peter Mosses, "SIS: Un sistema generador de compiladores que utiliza semántica denotacional", Informe 78-4-3, Departamento de Ciencias de la Computación, Universidad de Aarhus, Dinamarca, junio de 1978.
  7. Neighbors, JM Construcción de software usando componentes Archivado el 18-03-2018 en Wayback Machine . Informe técnico 160, Departamento de Ciencias de la Información e Informática, Universidad de California, Irvine, 1980.
  8. Lavington, Simon (abril de 2016). "Tony Brooker y el compilador Atlas" (PDF) . Archivado (PDF) del original el 26 de marzo de 2023. Recuperado el 29 de septiembre de 2023 .
  9. Howard Metcalfe, "Un compilador parametrizado basado en lingüística mecánica", Planning Research Corporation R-311, 1 de marzo de 1963, también en Annual Review in Automatic Programming, vol. 4
  10. Robert Ledley y JB Wilson, "Programación automática, traducción de lenguajes mediante análisis sintáctico", Communications of the Association for Computing Machinery, vol. 5, n.º 3, págs. 145-155, marzo de 1962.
  11. AE Glennie, "Sobre la máquina sintáctica y la construcción de una computadora universal", Informe técnico número 2, AD 240–512, Centro de Computación, Instituto Tecnológico Carnegie, 1960.
  12. Schorre, DV, META II, un lenguaje de escritura de compiladores orientado a la sintaxis , Actas de la 19.ª Conferencia Nacional de la ACM de 1964, págs. 41.301-41.3011, 1964
  13. Dewey, Val Schorre (1963). "Un SMALGOL dirigido por sintaxis para el 1401". Conferencia Nacional de la ACM, Denver, Colorado .
  14. Meta I se describe en el artículo presentado en la conferencia ACM de Colorado de 1963. Véase SMALGOL.
  15. LO Schmidt, "The Status Bitt ACM SegPlan "Grupo de Interés Especial en Lenguajes de Programación" Boletín Informativo del Grupo de Trabajo 1, 1964.
  16. Roger Rutman, "LOGIK. Un compilador dirigido por sintaxis para la simulación de tiempo de bits por computadora", tesis de maestría, UCLA, agosto de 1964.
  17. FW Schneider y (GD Johnson, "Un compilador dirigido por sintaxis, compilador para generar código eficiente", Actas de la 19.ª Conferencia Nacional de la Asociación para la Maquinaria de Computación, 1964
  18. D. Oppenheim y D. Haggerty, "META 5: Una herramienta para manipular cadenas de datos", Actas de la 21.ª Conferencia Nacional de la Asociación para la Maquinaria de Computación, 1966.
  19. Knuth, Donald (1990). "La génesis de las gramáticas de atributos" (PDF) . En P. Deransart; M. Jourdan (eds.). Actas de la Conferencia Internacional sobre Gramáticas de Atributos y sus Aplicaciones (París, Francia) . Conferencia Internacional sobre Gramáticas de Atributos y sus Aplicaciones. Lecture Notes in Computer Science. Vol. 461. Nueva York: Springer-Verlag. pp. 1–12 . CiteSeerX 10.1.1.105.5365 . doi : 10.1007/3-540-53101-7_1 . ISBN    978-3-540-53101-2. Archivado (PDF) del original el 23-11-2020 . Recuperado el 06-02-2020 .
  20. Charles R. Kirkley y Johns F. Rulifson, "El sistema LOT de compilación dirigida por sintaxis", Informe interno del Instituto de Investigación de Stanford ISR 187531-139, 1966.
  21. George JE (1967a). Analizador sintáctico, reconocedor, analizador sintáctico y sistema de interpretación semántica, Centro del Acelerador Lineal de Stanford, 15 de noviembre de 1967.
  22. ^ Rechenberg , Peter [en alemán] ; Mössenböck, Hanspeter [en alemán] (1985). Ein Compiler-Generator für Mikrocomputer - Grundlagen, Anwendungen, Programmierung in Modula-2 (en alemán) (1 ed.). Múnich, Alemania: Carl Hanser Verlag . ISBN  3-446-14495-1.(Nota: El libro describe la construcción de Coco en Modula-2 ).
  23. Gray, Robert W.; Levi, Steven P.; Heuring, Vincent P.; Sloane, Anthony M.; Waite, William M. (1992). "Eli: Un sistema de construcción de compiladores completo y flexible" . Communications of the ACM . 35 (2): 121– 130. doi : 10.1145/129630.129637 . S2CID 5121773 . 
  24. Foster, JM (1968). "Un programa para mejorar la sintaxis" . The Computer Journal . 11 : 31–34 . doi : 10.1093/comjnl/11.1.31 .
  25. "Cobre | Grupo de Herramientas de Lenguaje Extensible de Minnesota" . melt.cs.umn.edu . Consultado el 25 de marzo de 2025 .
  26. "tacc - El compilador alternativo" . legomatrix.com . Consultado el 25 de marzo de 2025 .

Lecturas adicionales

  • Brooker, RA ; MacCallum, IR; Morris, D.; Rohl, JS (1963). "El compilador-compilador" (PDF) . Annual Review in Automatic Programming . 3 : 229–275 . doi : 10.1016/S0066-4138(63)80009-9 .
  • Brooker, R.A.; Morris, D.; Rohl, J.S. (febrero de 1967). "Experiencia con el compilador" (PDF) . Computer Journal . 9 : 350. doi : 10.1093/comjnl/9.4.350 . Consultado el 7 de mayo de 2021 .
  • Napper, RB E (diciembre de 1965). Una introducción al compilador (PDF) .
  • MacCallum, IR (enero de 1963). Algunos aspectos de la implementación del compilador en ATLAS (PDF) (Tesis).
  • Johnson, Stephen C. (julio de 1975). Yacc: otro compilador más . Murray Hill, Nueva Jersey, EE. UU.: Bell Laboratories . Informe técnico de informática 32.
  • McKeeman, William M.; Horning, James J .; Wortman, David B. (1970). Un generador de compiladores . Englewood Cliffs, Nueva Jersey, EE. UU.: Prentice-Hall . ISBN 978-0-13-155077-3. Consultado el 13 de diciembre de 2012 .
  • Tony Brooker y el compilador Atlas
  • Explicación del compilador. Listados del compilador (1963).
  • Código fuente del compilador (comienza aproximadamente en la página 182 del PDF)
  • Diagramas de flujo del compilador original
  • Computer50.org , Brooker Autocodes
  • Catalog.compilertools.net Archivado el 13/08/2011 en Wayback Machine , El catálogo de herramientas para la construcción de compiladores
  • Labraj.uni-mb.si , Lisa
  • Recursos de Skenz.it , Jflex y Cup (en italiano)