stringtranslate.com

Compilador-compilador

En informática , un compilador-compilador o generador de compiladores es una herramienta de programación que crea un analizador , intérprete o 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 . [1] Solo maneja análisis sintáctico.

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

El código fuente de un analizador del lenguaje de programación se devuelve como salida del generador del analizador. Este código fuente luego se puede compilar en un analizador, que puede ser independiente o integrado. Luego, el analizador compilado acepta el código fuente del lenguaje de programación de destino como entrada y realiza una acción o genera un árbol de sintaxis abstracta (AST).

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

Un metacompilador es una herramienta de desarrollo de software utilizada principalmente en la construcción de compiladores , traductores e intérpretes para otros lenguajes de programación. [3] La entrada a un metacompilador es un programa de computadora escrito en un metalenguaje de programación especializado diseñado principalmente con el propósito de construir compiladores. [3] [4] El lenguaje del compilador producido se llama lenguaje objeto. La entrada mínima que produce 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 típico asocia código ejecutable con cada una de las reglas de la gramática que deben ejecutarse cuando el analizador aplica estas 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 debe 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 poderosa, de compiladores-compiladores es META II , que aceptó una gramática analítica con funciones de salida que producen código de máquina apilado 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 construyeron en Bell Labs se encontraba el sistema de dos partes lex y yacc , que normalmente se usaba para generar código del lenguaje de programación C , pero tenía un sistema de salida flexible que podía usarse para todo, desde lenguajes de programación. a conversión de archivos de texto. Sus versiones modernas de GNU son flex y bison .

Algunos compiladores-compiladores experimentales toman como entrada una descripción formal de la semántica del lenguaje de programación, normalmente utilizando semántica denotacional . Este enfoque a menudo se denomina "compilación basada en semántica", y fue iniciado por Peter Mosses 'Sistema de implementación semántica (SIS) en 1978. [6] Sin embargo, tanto el compilador generado como el código que produjo eran ineficientes en el tiempo y el 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 tiene un marco semiformal para la descripción de máquinas.

Los compiladores-compiladores existen en muchos tipos, incluidos generadores de máquinas de reescritura ascendente (consulte JBurg) que se utilizan para agrupar árboles de sintaxis de acuerdo con una gramática de reescritura para la generación de código, y generadores de analizadores de gramática de atributos (por ejemplo, ANTLR se puede usar para verificación de tipos simultánea, constante). propagación, 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 hace posible el diseño de lenguajes de dominio específico que sean apropiados para la especificación de un problema particular. Un metacompilador reduce el costo de producir traductores para dichos lenguajes objeto de dominio específico hasta un punto en el que resulta económicamente viable incluir en la solución de un problema un diseño de lenguaje de dominio específico . [4]

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

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

Un metacompilador es un metaprograma generalmente escrito en su propio metalenguaje o en un lenguaje de programación informático existente. El proceso de compilación de un metacompilador, escrito en su propio metalenguaje, es equivalente al de un compilador autohospedado . Los compiladores más comunes escritos hoy en día son compiladores autohospedados. El autohospedaje es una herramienta poderosa de muchos metacompiladores, que permite la fácil extensión de su propio metalenguaje de metaprogramación. La característica que separa a un metacompilador de otros compiladores es que toma como entrada un lenguaje de metaprogramación especializado que describe todos los aspectos del funcionamiento del compilador. Un metaprograma producido por un metacompilador es un programa tan completo como un programa escrito en C++ , BASIC o cualquier otro lenguaje de programación general . El metalenguaje de metaprogramación es un atributo poderoso que permite un desarrollo más fácil de lenguajes de programación de computadoras y otras herramientas informáticas. Los procesadores de línea de comandos, la transformación y el análisis de cadenas de texto se codifican fácilmente utilizando metalenguajes de metaprogramación de los metacompiladores.

Un paquete de desarrollo completo incluye un enlazador y una biblioteca de soporte de tiempo de ejecución . Por lo general, 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 consta de funciones de soporte necesarias para el proceso de compilación generalmente completa el paquete metacompilador completo.

El significado de metacompilador

En informática, el prefijo meta se usa comúnmente para significar acerca de (su propia categoría) . Por ejemplo, los metadatos son datos que describen otros datos. Un lenguaje que se utiliza para describir otros lenguajes es un metalenguaje . Meta también puede significar un nivel superior de abstracción . Un metalenguaje opera en un nivel superior de abstracción para describir las propiedades de un lenguaje. La forma Backus-Naur (BNF) es un metalenguaje formal utilizado originalmente para definir ALGOL 60 . BNF es un metalenguaje débil , ya que describe sólo 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 programas como sus datos. Un metacompilador toma como entrada un metaprograma escrito en metalenguajes especializados (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 en metalenguaje de metaprogramación .

Cuarto metacompilador

Muchos defensores del lenguaje Forth llaman al proceso de creación de una nueva implementación de Forth una metacompilación y constituyen un metacompilador. La cuarta definición de metacompilador es:

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

Este cuarto uso del término metacompilador es objeto de controversia en la informática convencional. Consulte Forth (lenguaje de programación) e Historia de la construcción del compilador . El proceso real de compilación de Forth en sí es una combinación de un lenguaje de programación extensible autohospedado y, a veces , compilación cruzada , terminología establecida desde hace mucho tiempo en informática. Los metacompiladores son un sistema de escritura de compiladores general. Además, el concepto de metacompilador Forth es indistinguible del lenguaje autohospedado y extensible. El proceso real actúa en un nivel inferior definiendo un subconjunto mínimo de palabras posteriores , que se pueden usar para definir palabras adicionales. Luego se puede definir una implementación completa de Forth 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 del metacompilador Forth.

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

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

Sin embargo, al examinar el concepto de programación en Forth, agregar nuevas palabras al diccionario y extender el lenguaje de esta manera es metaprogramación. Es esta metaprogramación en Forth la que lo convierte en un metacompilador.

Programar en Forth es agregar nuevas palabras al lenguaje. Cambiar el lenguaje de esta manera es metaprogramación . Forth es un metacompilador porque Forth es un lenguaje diseñado específicamente para la metaprogramación. Programar en Forth es extender Forth y agregar palabras al vocabulario de Forth crea un nuevo dialecto de Forth . Forth es un metacompilador especializado para dialectos del idioma Forth.

Historia

El diseño del compilador original Compiler fue iniciado por Tony Brooker y Derrick Morris en 1959, y las pruebas iniciales comenzaron en marzo de 1962. [8] El compilador de Brooker se utilizó para crear compiladores para la nueva computadora Atlas en la Universidad de Manchester , para varios idiomas. : Mercury Autocode , Extended Mercury Autocode, Atlas Autocode , ALGOL 60 y ASA Fortran . Aproximadamente al mismo tiempo, ET (Ned) Irons en Princeton y Alick Glennie en el Atomic Weapons Research Establishment en Aldermaston estaban realizando un trabajo relacionado, cuyo artículo "Syntax Machine" (desclasificado en 1977) inspiró la serie META de sistemas de escritura traductores. mencionado abajo.

La historia temprana de los metacompiladores está estrechamente relacionada con la historia del grupo de trabajo 1 de SIG/PLAN sobre compiladores controlados 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 de escritura compiladora. Uno utilizó una técnica de análisis de abajo hacia arriba basada en un método descrito por Ledley y Wilson. [10] El otro utilizó un enfoque de arriba a 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. Se implementó la máquina generativa y produjo expresiones algebraicas aleatorias. Meta I, el primer metacompilador, fue implementado por Schorre en un IBM 1401 en UCLA en enero de 1963. Sus intérpretes y metamáquinas originales fueron escritos directamente en un lenguaje pseudo-máquina. META II , sin embargo, fue escrito en un metalenguaje de nivel superior capaz de describir su propia compilación en el lenguaje pseudo-máquina. [12] [13] [14]

Lee Schmidt de Bolt, Beranek y Newman escribieron un metacompilador en marzo de 1963 que utilizaba una pantalla CRT en el tiempo compartido PDP-1. [15] Este compilador produjo código de máquina real en lugar de código interpretativo y se arrancó parcialmente desde Meta I. [ cita necesaria ]

Schorre arrancó Meta II a partir de Meta I durante la primavera de 1963. El artículo sobre el refinado sistema metacompilador 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 1401 y se utilizó para implementar un pequeño lenguaje similar a ALGOL . [ cita necesaria ]

Inmediatamente siguieron muchos sistemas similares. [ cita necesaria ]

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 utilizó un algoritmo que producía código eficiente para expresiones booleanas. [ cita necesaria ]

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

A finales de 1964, Lee Schmidt puso en marcha 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 esfuerzo en el desarrollo de metacompiladores. Este esfuerzo incluye potentes metacompiladores, Bookl y Book2, escritos en Lisp , que tienen una amplia capacidad de búsqueda en árbol y de copia de seguridad. Una consecuencia de uno de los sistemas Q-32 en SDC es Meta 5. [18] El sistema Meta 5 incorpora una copia de seguridad del flujo de entrada y suficientes otras funciones para analizar cualquier lenguaje sensible al contexto. Este sistema se lanzó con éxito a una gran cantidad de usuarios y tenía muchas aplicaciones de manipulación de cadenas además de la compilación. Tiene muchas pilas de push-down elaboradas, instalaciones de prueba y configuración de atributos y mecanismos de salida. 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 llamado TMG (presentado en 1965). TMG se utilizó para crear los primeros compiladores para 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 informática de Donald Knuth . [19]

El sistema LOT se desarrolló en 1966 en el Instituto de Investigación de Stanford y se inspiró muy de cerca en Meta II. [20] Tenía nuevas construcciones de propósito especial que le permitían generar un compilador que a su vez podría compilar un subconjunto de PL/I. Este sistema contaba con amplias funciones de recopilación de estadísticas y se utilizaba para estudiar las características del análisis de arriba hacia abajo.

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

El compilador TREE-META fue desarrollado en el Instituto de Investigación de Stanford en Menlo Park, California. Abril de 1968. La historia temprana del metacompilador está bien documentada en el manual TREE META. TREE META fue paralelo a algunos de los desarrollos de la COSUDE. A diferencia de los metacompiladores anteriores, separó el procesamiento semántico del procesamiento de sintaxis. Las reglas de sintaxis contenían operaciones de construcción de árboles que combinaban elementos del lenguaje reconocidos con nodos de árbol. Luego, la representación de la estructura de árbol de la entrada se procesó mediante una forma simple de reglas de análisis. Las reglas de análisis utilizaron reconocimiento de nodos y pruebas de atributos que, cuando coincidieron, dieron como resultado la realización de la acción asociada. Además, un elemento de árbol similar también podría probarse en una regla sin analizar. Las reglas de unparse también eran un lenguaje recursivo que podía llamar reglas de unparse que pasaban elementos del árbol antes de que se realizara la acción de la regla de unparse.

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. Este último en la Universidad de Washington en St. Louis. Esta máquina fue construida a partir de componentes macromodulares y tiene como instrucciones los códigos descritos por Schorre.

CWIC (Compilador para escribir e implementar compiladores) es el último metacompilador de Schorre conocido. Fue desarrollado en Systems Development Corporation por Erwin Book, Dewey Val Schorre y Steven J. Sherman. Con todo el poder de (lisp 2), un lenguaje de procesamiento de listas, los algoritmos de optimización podrían operar en listas y árboles generados por sintaxis antes de la generación de código. CWIC también tenía una tabla de símbolos integrada en el lenguaje.

Con el resurgimiento de los lenguajes de dominio específico y la necesidad de generadores de analizadores que sean fáciles de usar, de entender y 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 en la línea yacc son ANTLR , Coco/R , [22] CUP, [ cita requerida ] GNU Bison , Eli, [23] FSL, [ cita requerida ] SableCC , SID (dispositivo de mejora de sintaxis), [24 ] y JavaCC . Si bien son útiles, los generadores de analizadores puros solo abordan la parte de análisis del problema de crear un compilador. 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 más difíciles, como el análisis semántico, la optimización y la generación de código.

Metalenguajes schorre

Los primeros metacompiladores de Schorre, META I y META II, fueron desarrollados por D. Val Schorre en UCLA. Siguieron otros metacompiladores basados ​​en Schorre. Cada uno agrega mejoras al análisis del lenguaje y/o generación de código.

En programación es común utilizar el nombre del lenguaje de programación para referirse tanto al compilador como al lenguaje de programación, distinguiendo el significado el contexto. Un programa C++ se compila utilizando un compilador de C++. Esto también se aplica a lo siguiente. Por ejemplo, META II es tanto el compilador como el lenguaje.

Los metalenguajes de la línea Schorre de metacompiladores son lenguajes de programación funcionales que utilizan gramática de arriba hacia abajo para analizar ecuaciones de sintaxis que tienen construcciones de transformación de salida integradas.

Una ecuación de sintaxis:

<nombre> = <cuerpo>;

es una función de prueba compilada que devuelve éxito o fracaso . <nombre> es el nombre de la función. <cuerpo> es una forma de expresión lógica que consta de pruebas que pueden agruparse, tener alternativas y producir producciones. Una prueba es como un bool en otros idiomas, siendo el éxito verdadero y el fracaso 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 idiomas Schorre META X existe una regla de conducción. La regla del programa anterior es un ejemplo de regla de conducción. La regla del programa es una función de prueba que llama a una declaración, una regla de prueba , que devuelve éxito o fracaso . El operador del bucle $ llama repetidamente a la declaración hasta que se devuelve un error . El operador $ siempre tiene éxito, incluso cuando no hay ninguna declaración. El programa anterior siempre tendría éxito. (En CWIC, una falla prolongada puede pasar por alto la declaración. Una falla prolongada es parte del sistema de seguimiento de CWIC)

Los conjuntos de caracteres de estos primeros compiladores eran limitados. El carácter / se utilizó para el operador alternativo (o). "A o B" se escribe como A/B. Los paréntesis ( ) se utilizan 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 tiene un significado X e Y implícito. ( ) son agrupadores y / el operador or . El orden de evaluación siempre es de izquierda a derecha, ya que el orden de las pruebas especifica una secuencia de caracteres de entrada.

Palabras de operadores especiales cuyo primer carácter es "." se utilizan para mayor claridad. .EMPTY se utiliza como última alternativa cuando no es necesario que esté presente ninguna alternativa anterior.

X (A/B/.VACÍO)

Indica que X va seguido opcionalmente de A o B. Esta es una característica específica de estos metalenguajes que son lenguajes de programación. Lo anterior evita el retroceso. Es posible que otros sistemas constructores de compiladores hayan declarado las tres secuencias posibles y hayan dejado que el analizador las resuelva.

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

meta yo

META I era un metacompilador compilado manualmente que se utilizaba para compilar META II. Poco más se sabe de META I excepto que la compilación inicial de META II produjo un código casi idéntico al del compilador META I codificado a mano.

METAII

Cada regla consta opcionalmente de pruebas, operadores y producciones de salida. Una regla intenta hacer coincidir alguna parte del flujo de caracteres fuente del programa de entrada y devuelve el éxito o el fracaso. Si tiene éxito, la entrada avanza sobre los caracteres coincidentes. En caso de falla, la entrada no avanza.

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

ÁRBOL-META

TREE-META introdujo operadores de construcción de árboles : <node_name> y [<number> ] moviendo las transformaciones de producción de salida a reglas no analizadas . Los operadores de construcción de árboles se utilizaron en las reglas gramaticales transformando directamente la entrada en un árbol de sintaxis abstracta . Las reglas de análisis también son funciones de prueba que coinciden con patrones de árbol. Las reglas de análisis se llaman desde una regla gramatical cuando un árbol de sintaxis abstracta se va a transformar en código de salida. La construcción de un árbol de sintaxis abstracta y reglas de análisis permitió realizar optimizaciones locales mediante el análisis del árbol de análisis.

El traslado de las producciones de salida a las reglas de no análisis hizo una separación clara entre el análisis gramatical y la producción de código. Esto hizo que la programación fuera más fácil de leer y comprender.

CWIC

En 1968-1970, Erwin Book, Dewey Val Schorre y Steven J. Sherman desarrollaron el CWIC. [4] (Compilador para escribir e implementar compiladores) en System Development Corporation Centro del Instituto Charles Babbage para la Historia de la Tecnología de la Información (Cuadro 12, carpeta 21),

CWIC es un sistema de desarrollo de compiladores compuesto por tres lenguajes de propósito especial y de dominio específico, cada uno de los cuales está destinado a permitir la descripción de ciertos aspectos de la traducción de manera sencilla. El lenguaje de sintaxis se utiliza para describir el reconocimiento del texto fuente y la 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 un lenguaje objeto apropiado.

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

CWIC incluye tres idiomas:

Idioma de los generadores

Generators Language tenía una semántica similar a Lisp . Se pensó que el árbol de análisis era una lista recursiva. La forma general de una función de lenguaje generador es:

 nombre-función (primera-regla_unparse) => primer-generador_código_producción (segunda-regla_unparse) => segundo-generador_código_producción (tercera-regla_unparse) => tercer-generador_código_producción ...

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

 expr_gen(AÑADIR[expr_gen(x),expr_gen(y)]) => <AR + (x*16)+y;> liberaciónreg(y); devolver x; (SUB[expr_gen(x),expr_gen(y)])=> <SR + (x*16)+y;> liberaciónreg(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 tiene el aspecto (ADD[<algo1>,<algo2>]), se llamaría a expr_gen(x) con <algo1> y devolvería x. Una variable en la regla de análisis es una variable local que se puede usar en Production_code_generator. expr_gen(y) se llama con <algo2> y devuelve y. Aquí hay una llamada de generador en una regla de análisis y se pasa el elemento en la posición que ocupa. Con suerte, en lo anterior x e y se registrarán al regresar. La última transformación tiene como objetivo cargar un atómico en un registro y devolver el registro. La primera producción se utilizaría para generar la instrucción 360 "AR" (Agregar Registro) con los valores apropiados en los registros generales. El ejemplo anterior es sólo una parte de un generador. Cada expresión del generador se evalúa como un valor que luego puede procesarse más. La última transformación también podría haberse escrito como:

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

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

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

De los autores de CWIC:

"Un metacompilador ayuda a la tarea de construir un compilador automatizando sus aspectos no creativos, aquellos aspectos que son los mismos independientemente del lenguaje que el compilador producido deba traducir. Esto hace posible el diseño de lenguajes que sean apropiados para 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 con el diseño del lenguaje". [4]

Ejemplos

Ver 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 ed.). Bostón. 2007. pág. 287.ISBN​ 978-0-321-48681-3. OCLC  70775643.{{cite book}}: CS1 maint: location missing publisher (link) CS1 maint: others (link)
  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. ^ ab Metacompiler: ( informática ) Un compilador que se utiliza principalmente para construir compiladores para otros lenguajes de programación. "Diccionario de ciencia y tecnología Diccionario McGraw-Hill de términos científicos y técnicos, sexta edición". Empresas McGraw-Hill. Archivado desde el original el 7 de abril de 2018 . Consultado el 7 de abril de 2018 .
  4. ^ Libro abcdefgh , Erwin; Dewey Val Schorre; Steven J. Sherman (junio de 1970). "El sistema CWIC/36O, un compilador para escribir e implementar compiladores". Avisos ACM SIGPLAN . 5 (6): 11–29. doi :10.1145/954344.954345. S2CID  44675240.
  5. ^ ab C. Stephen Carr, David A. Luther, Sherian Erdmann, El sistema compilador-compilador TREE-META: un sistema metacompilador 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 compilador-generador que utiliza semántica denotacional", Informe 78-4-3, Departamento de Ciencias de la Computación, Universidad de Aarhus, Dinamarca, junio de 1978
  7. Vecinos, JM Software Construcción mediante Componentes Archivado el 18 de marzo de 2018 en Wayback Machine . Informe técnico 160, Departamento de Información y Ciencias de la Computación, Universidad de California, Irvine, 1980.
  8. ^ Lavington, Simon (abril de 2016). "Tony Brooker y el compilador Atlas" (PDF) . Archivado (PDF) desde el original el 26 de marzo de 2023 . Consultado 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 idiomas mediante análisis sintáctico", Comunicaciones de la Asociación de Maquinaria de Computación, vol. 5, núm. 3 págs. 145-155, marzo de 1962.
  11. ^ AE Glennie, "Sobre la máquina de sintaxis y la construcción de una computadora universal", Informe técnico número 2, 240–512 d.C., Centro de Computación, Instituto Carnegie de Tecnología, 1960.
  12. ^ Schorre, DV, META II, un lenguaje de escritura compilador orientado a la sintaxis , Actas de la 19.ª Conferencia Nacional ACM de 1964, págs. 41.301-41.3011, 1964
  13. ^ Dewey, Val Schorre (1963). "Una sintaxis: SMALGOL dirigida para el 1401". Conferencia Nacional ACM, Denver, Colorado .
  14. ^ Meta I se describe en el artículo presentado en la conferencia ACM de Colorado de 1963. Ver SMALGOL.
  15. ^ LO Schmidt, "The Status Bitt ACM SegPlan" Grupo de interés especial en lenguajes de programación "Carta de prensa del grupo de trabajo 1, 1964.
  16. ^ Roger Rutman, "LOGIK. Un compilador dirigido por sintaxis para simulación de tiempo de bits por computadora", tesis de maestría, UCLA, agosto de 1964.
  17. ^ FW Schneider y (GD Johnson, "Una escritura de compilador dirigida por sintaxis, compilador para generar código eficiente", Actas de la 19ª Conferencia Nacional de la Asociación de 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 de 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. Apuntes de conferencias sobre informática. vol. 461. Nueva York: Springer-Verlag. págs. 1–12. CiteSeerX 10.1.1.105.5365 . doi :10.1007/3-540-53101-7_1. ISBN  978-3-540-53101-2. Archivado (PDF) desde el original el 23 de noviembre de 2020 . Consultado el 6 de febrero de 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 de sintaxis, reconocedor, analizador y sistema de interpretación semántica, Stanford Linear Accelerator Center, 15 de noviembre de 1967.
  22. ^ ab 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.(NB. El libro describe la construcción de Coco en Modula-2 ).
  23. ^ Gris, Robert W.; Levi, Steven P.; Heuring, Vicente P.; Sloane, Antonio M.; Waite, William M. (1992). "Eli: un sistema de construcción de compiladores completo y flexible". Comunicaciones de la ACM . 35 (2): 121-130. doi : 10.1145/129630.129637 . S2CID  5121773.
  24. ^ Foster, JM (1968). "Un programa de mejora de la sintaxis". La revista informática . 11 : 31–34. doi : 10.1093/comjnl/11.1.31 .

Otras lecturas

enlaces externos