Aprendiendo a escribir un compilador [cerrado]


699

Lenguajes preferidos : C / C ++, Java y Ruby.

Estoy buscando algunos libros / tutoriales útiles sobre cómo escribir su propio compilador simplemente con fines educativos. Estoy más familiarizado con C / C ++, Java y Ruby, por lo que prefiero los recursos que involucran a uno de esos tres, pero cualquier buen recurso es aceptable.


ANTLR todo el camino. Todos los recursos propuestos a continuación me parecen una exageración. ANTLR es siempre un mejor amigo del diseñador compilador. A
A_Var

Si su enfoque principal es aprender cómo funciona la compilación de ideas en general, puede verificar y abreviado SICP para el programa de Interpretación Estructurada de Computadora basado en el Esquema (Lista) pero enseña los principios generales. mitpress.mit.edu/sicp . Me recomendó este libro un veterano que trabaja para una empresa y que hace estos trabajos de compilación e interpretación para ganarse la vida.
Nishant

Un complemento descarado: mi respuesta a una pregunta similar .
9000

Escribí un artículo sobre cómo crear un compilador en mi blog: orangejuiceliberationfront.com/how-to-write-a-compiler Realmente se centra en lo básico y cómo comenzar. Hay muchos más artículos relacionados con el diseño del compilador / codegen / analizador / lenguaje allí.
uliwitness

Respuestas:


1084

Gran lista de recursos:

Leyenda:

  • ¶ Enlace a un archivo PDF
  • $ Enlace a un libro impreso

22
He leído la serie Let's Build a Compiler[ compilers.iecc.com/crenshaw/] , es una buena reseña y es un buen punto de partida.
TheVillageIdiot

55
Creo que vale la pena mencionar el curso de compiladores de Coursera. Tiene buenos videos y muestra cómo crear un compilador simple / de lenguaje java. Enlace de los compiladores de Coursera
QuantumKarl

1
Quería mantener esta respuesta publicada para que fuera lo más original posible, así que decidí publicar esta referencia aquí: tutorialspoint.com/compiler_design/index.htm Lo que me gustó de este sitio es que no se involucra en escribir ningún código para crear un compilador, pero divide el compilador en sus partes: fases y etapas. Describe el enfoque de diseño lógico y algorítmico sin ningún paradigma de lenguaje específico, ya que expresa las notaciones de un lenguaje y alfabeto arbitrarios. Es una lectura rápida, pero le brinda los conceptos de lo que se necesita para cada parte.
Francis Cugler

70

Esta es una pregunta bastante vaga, creo; solo por la profundidad del tema involucrado. Sin embargo, un compilador se puede descomponer en dos partes separadas; una mitad superior y una inferior. La mitad superior generalmente toma el lenguaje fuente y lo convierte en una representación intermedia, y la mitad inferior se encarga de la generación de código específico de la plataforma.

Sin embargo, una idea para una manera fácil de abordar este tema (la que usamos en mi clase de compiladores, al menos) es construir el compilador en las dos piezas descritas anteriormente. Específicamente, obtendrá una buena idea de todo el proceso simplemente construyendo la mitad superior.

Simplemente hacer la mitad superior le permite tener la experiencia de escribir el analizador léxico y el analizador y pasar a generar algún "código" (esa representación intermedia que mencioné). Por lo tanto, tomará su programa fuente y lo convertirá en otra representación y realizará una optimización (si lo desea), que es el corazón de un compilador. La mitad inferior tomará esa representación intermedia y generará los bytes necesarios para ejecutar el programa en una arquitectura específica. Por ejemplo, la mitad inferior tomará su representación intermedia y generará un ejecutable PE.

Algunos libros sobre este tema que encontré particularmente útiles fueron los Principios y Técnicas de los Compiladores (o el Libro del Dragón, debido al lindo dragón en la portada). Tiene una gran teoría y definitivamente cubre las gramáticas sin contexto de una manera realmente accesible. Además, para construir el analizador y analizador léxico, probablemente usará las herramientas * nix lex y yacc. Y sin interés, el libro llamado " lex and yacc " retomó donde dejó el Libro del Dragón para esta parte.


55

Creo que la implementación del compilador moderno en ML es el mejor texto introductorio de escritura del compilador. También hay una versión de Java y una versión de C , cualquiera de las cuales podría ser más accesible dada su experiencia en idiomas. El libro contiene una gran cantidad de material básico útil (escaneo y análisis, análisis semántico, registros de activación, selección de instrucciones, generación de código nativo RISC y x86) y varios temas "avanzados" (compilación de OO y lenguajes funcionales, polimorfismo, recolección de basura, optimización y formulario de asignación estática individual) en un espacio relativamente pequeño (~ 500 páginas).

Prefiero la implementación del compilador moderno al libro de Dragon porque la implementación del compilador moderno examina menos del campo; en cambio, tiene una cobertura realmente sólida de todos los temas que necesitaría para escribir un compilador serio y decente. Después de leer este libro, estará listo para abordar trabajos de investigación directamente para obtener más profundidad si lo necesita.

Debo confesar que tengo una debilidad por la construcción del compilador de Niklaus Wirth . Está disponible en línea como PDF. Me parece que la estética de la programación de Wirth es simplemente hermosa, sin embargo, algunas personas consideran que su estilo es demasiado mínimo (por ejemplo, Wirth favorece los analizadores de descenso recursivo, pero la mayoría de los cursos de CS se centran en herramientas generadoras de analizador; los diseños de lenguaje de Wirth son bastante conservadores). La construcción del compilador es una destilación muy sucinta de las ideas básicas de Wirth, así que si te gusta su estilo o no, te recomiendo leer este libro.


Compilador PDF de construcción ethoberon.ethz.ch/WirthPubl/CBEAll.pdf
matepal297

Recomiendo encarecidamente contra la versión C de "Modern Compiler Implementation", está paralizada por detalles de bajo nivel debido a C. Se abarrota por completo el libro. Java 1st no es demasiado bueno ya que su diseño OO es pobre, Java 2nd ed ya no se trata del lenguaje Tiger. Por lo tanto, recomiendo el ML: no es necesario tener fluidez en el ML para entenderlo. ML definitivamente es muy adecuado para el trabajo.
akim

44

Estoy de acuerdo con la referencia del Libro del Dragón; OMI, es la guía definitiva para la construcción del compilador. Sin embargo, prepárate para una teoría hardcore.

Si desea un libro que sea más ligero en teoría, Game Scripting Mastery podría ser un mejor libro para usted. Si eres un novato total en la teoría del compilador, proporciona una introducción más amable. No cubre métodos de análisis más prácticos (optar por un descenso recursivo no predictivo sin analizar el análisis LL o LR) y, según recuerdo, ni siquiera analiza ningún tipo de teoría de optimización. Además, en lugar de compilar en código máquina, se compila en un código de bytes que se supone que se ejecuta en una VM que también escribe.

Sigue siendo una lectura decente, especialmente si puede obtenerla de forma económica en Amazon. Si solo quieres una introducción fácil a los compiladores, Game Scripting Mastery no es un mal camino a seguir. Si quieres ser duro por adelantado, entonces debes conformarte con nada menos que el Libro del Dragón.


1
Game Scripting Mastery es un gran recurso de aprendizaje porque cuando hayas terminado tendrás un juego de aventura 2D jugable y programable. Esto hace que cada ejercicio se centre en un propósito específico y mantenga al lector motivado.
Dour High Arch

1
Dragon está un poco demasiado centrado en el análisis basado en la gramática. Si no está tratando de analizar algo completamente imposible como C ++ más o menos utilizando generadores de analizadores sintácticos, pero puede usar, por ejemplo, una gramática LL artesanal, es posible que desee buscar algo que trate un campo de compilación de porcentaje más alto que no sea la transformación gramatical y la prueba
Marco van de Voort

27

"Creemos un compilador" es increíble, pero está un poco desactualizado. (No estoy diciendo que lo haga incluso un poco menos válido).

O echa un vistazo a SLANG . Esto es similar a "Construyamos un compilador" pero es un recurso mucho mejor, especialmente para principiantes. Esto viene con un tutorial en PDF que tiene un enfoque de 7 pasos para enseñarle un compilador. Agregando el enlace quora ya que tiene los enlaces a todos los puertos de SLANG, en C ++, Java y JS, también intérpretes en python y java, originalmente escritos usando C # y la plataforma .NET.


55
Estoy de acuerdo en que esta serie está un poco desactualizada, aunque sigue siendo útil. Sin embargo, mi mayor queja es el hecho de que intenta enviar directamente al lenguaje ensamblador en lugar de construir cualquier tipo de árbol de análisis, lo que significa (al contrario de lo que se dice en el primer artículo) que no es muy útil para escribir un interprete.
a_m0d

23

Si está buscando usar herramientas poderosas de alto nivel en lugar de construir todo usted mismo, revisar los proyectos y las lecturas de este curso es una muy buena opción. Es un curso de idiomas del autor del analizador Java ANTLR. Puede obtener el libro del curso en formato PDF de los Programadores pragmáticos .

El curso repasa las cosas del compilador del compilador estándar que vería en otros lugares: análisis, tipos y verificación de tipos, polimorfismo, tablas de símbolos y generación de código. Casi lo único que no está cubierto son las optimizaciones. El proyecto final es un programa que compila un subconjunto de C . Debido a que usa herramientas como ANTLR y LLVM, es factible escribir todo el compilador en un solo día (tengo una prueba de existencia de esto, aunque quiero decir ~ 24 horas). Es pesado en ingeniería práctica usando herramientas modernas, un poco más ligero en teoría.

LLVM, por cierto, es simplemente fantástico. En muchas situaciones en las que normalmente podría compilar hasta el ensamblaje, sería mucho mejor compilar en la Representación intermedia de LLVM . Es de nivel superior, multiplataforma y LLVM es bastante bueno para generar un ensamblaje optimizado a partir de él.


El primer enlace está muerto.
Lynn

20

Si tiene poco tiempo, le recomiendo la "Construcción del compilador" de Niklaus Wirth (Addison-Wesley. 1996) , un pequeño folleto que puede leer en un día, pero explica los conceptos básicos (incluido cómo implementar lexers, analizadores de descenso recursivo, y sus propias máquinas virtuales basadas en pila). Después de eso, si quieres una inmersión profunda, no hay forma de evitar el libro del Dragón como sugieren otros comentaristas.


Si no tiene mucho tiempo, no escriba un compilador.
Ingo

17

Es posible que desee ver Lex / Yacc (o Flex / Bison, como quiera llamarlos). Flex es un analizador léxico, que analizará e identificará los componentes semánticos ("tokens") de su idioma, y ​​Bison se utilizará para definir qué sucede cuando se analiza cada token. Esto podría ser, pero definitivamente no está limitado a, imprimir código C, para un compilador que se compilaría en C, o ejecutar dinámicamente las instrucciones.

Estas preguntas frecuentes deberían ayudarte, y este tutorial parece bastante útil.


17

En términos generales, no hay un tutorial de cinco minutos para los compiladores, porque es un tema complicado y escribir un compilador puede llevar meses. Tendrás que hacer tu propia búsqueda.

Python y Ruby generalmente se interpretan. Quizás también quiera comenzar con un intérprete. En general es más fácil.

El primer paso es escribir una descripción de lenguaje formal, la gramática de su lenguaje de programación. Luego, debe transformar el código fuente que desea compilar o interpretar de acuerdo con la gramática en un árbol de sintaxis abstracta, una forma interna del código fuente que la computadora entiende y puede operar. Este paso generalmente se llama análisis y el software que analiza el código fuente se llama analizador. A menudo, el analizador es generado por un generador de analizador que transforma una gramática formal en código fuente o código de máquina. Para una buena explicación no matemática del análisis, recomiendo Técnicas de análisis: una guía práctica. Wikipedia tiene una comparación de generadores de analizadores de los cuales puede elegir el que sea adecuado para usted. Dependiendo del generador de analizador que elija,

Escribir un analizador para tu idioma puede ser realmente difícil, pero esto depende de tu gramática. Así que sugiero mantener su gramática simple (a diferencia de C ++); Un buen ejemplo de esto es LISP.

En el segundo paso, el árbol de sintaxis abstracta se transforma de una estructura de árbol en una representación intermedia lineal. Como buen ejemplo de este código de bytes de Lua a menudo se cita. Pero la representación intermedia realmente depende de su idioma.

Si está creando un intérprete, simplemente tendrá que interpretar la representación intermedia. También podría compilarlo justo a tiempo. Recomiendo LLVM y libjit para la compilación justo a tiempo. Para que el lenguaje sea utilizable, también deberá incluir algunas funciones de entrada y salida y quizás una pequeña biblioteca estándar.

Si vas a compilar el lenguaje, será más complicado. Tendrá que escribir backends para diferentes arquitecturas de computadora y generar código de máquina a partir de la representación intermedia en esos backends. Recomiendo LLVM para esta tarea.

Hay algunos libros sobre este tema, pero no puedo recomendar ninguno de ellos para uso general. La mayoría de ellos son demasiado académicos o demasiado prácticos. No existe la opción "Enséñese a escribir en un compilador en 21 días" y, por lo tanto, tendrá que comprar varios libros para comprender bien todo este tema. Si busca en Internet, encontrará algunos libros en línea y notas de conferencias. Tal vez hay una biblioteca universitaria cerca de donde puedes pedir prestados libros en compiladores.

También recomiendo un buen conocimiento de fondo en informática teórica y teoría de grafos, si va a hacer que su proyecto sea serio. Un título en informática también será útil.


++ Tienes razón en que es bueno saber todas esas cosas, y puede ser un gran trabajo, pero también aprendí de algunos expertos cómo no hacer que las cosas sean un gran problema. Es bueno saber cosas, y es aún mejor saber cuándo no usarlas, que es la mayoría de las veces.
Mike Dunlavey


11

Un libro aún no sugerido pero muy importante es "Linkers and Loaders" de John Levine. Si no está utilizando un ensamblador externo, necesitará una forma de generar un archivo de objeto que pueda vincularse a su programa final. Incluso si está utilizando un ensamblador externo, es probable que necesite comprender las reubicaciones y cómo funciona todo el proceso de carga del programa para crear una herramienta de trabajo. Este libro recoge una gran cantidad de información aleatoria sobre este proceso para varios sistemas, incluidos Win32 y Linux.


10

El Libro del Dragón es definitivamente el libro de "compiladores de construcción", pero si su idioma no es tan complicado como la generación actual de idiomas, es posible que desee ver el patrón de Intérprete de Patrones de diseño .

El ejemplo en el libro diseña un lenguaje de expresión regular y está bien pensado, pero como dicen en el libro, es bueno para pensar en el proceso, pero en realidad es efectivo solo en idiomas pequeños. Sin embargo, es mucho más rápido escribir un intérprete para un idioma pequeño con este patrón que tener que aprender sobre los diferentes tipos de analizadores sintácticos, yacc y lex, etc.


10

Si está dispuesto a usar LLVM, consulte esto: http://llvm.org/docs/tutorial/ . Te enseña a escribir un compilador desde cero usando el marco de LLVM, y no asume que tienes ningún conocimiento sobre el tema.

El tutorial sugiere que escriba su propio analizador y lexer, etc., pero le aconsejo que examine bison y flex una vez que tenga la idea. Hacen la vida mucho más fácil.


Pero la documentación para configurarlo de Visual Studio está mal escrita, además no hay ejemplos
SpicyWeenie

10

Encontré el libro del Dragón demasiado difícil de leer con demasiado enfoque en la teoría del lenguaje que realmente no se requiere para escribir un compilador en la práctica.

Yo agregaría el libro de Oberon que contiene la fuente completa de un compilador de Oberon increíblemente rápido y simple Proyecto Oberon .

texto alternativo


10

Recuerdo haber hecho esta pregunta hace aproximadamente siete años, cuando era bastante nuevo en la programación.

Fui muy cuidadoso cuando pregunté y, sorprendentemente, no recibí tantas críticas como las que recibes aquí. Sin embargo, me señalaron en la dirección del " Libro del Dragón ", que en mi opinión es un libro realmente genial que explica todo lo que necesitas saber para escribir un compilador (por supuesto, tendrás que dominar un idioma o dos. Cuanto más idiomas que conoces, mejor).

Y sí, mucha gente dice que leer ese libro es una locura y que no aprenderás nada de él, pero estoy totalmente en desacuerdo con eso.

Muchas personas también dicen que escribir compiladores es estúpido e inútil. Bueno, hay varias razones por las cuales el desarrollo del compilador es útil:

  • Porque es divertido.
  • Es educativo, al aprender a escribir compiladores aprenderá mucho sobre informática y otras técnicas que son útiles al escribir otras aplicaciones.
  • Si nadie escribiera compiladores, los idiomas existentes no mejorarían.

No escribí mi propio compilador de inmediato, pero después de preguntar supe por dónde empezar. Y ahora, después de aprender muchos idiomas diferentes y leer el Libro del Dragón, escribir no es un gran problema. (También estoy estudiando cajeros automáticos de ingeniería informática, pero la mayoría de lo que sé sobre programación es autodidacta).

En conclusión, The Dragon Book es un gran "tutorial". Pero dedique algún tiempo a dominar un idioma o dos antes de intentar escribir un compilador. Sin embargo, no esperes ser un gurú del compilador en la próxima década.

El libro también es bueno si quieres aprender a escribir analizadores / intérpretes.


9

"... Construyamos un compilador ..."

Yo segundo http://compilers.iecc.com/crenshaw/ por @sasb . Olvídate de comprar más libros por el momento.

¿Por qué? Herramientas e idioma.

El idioma requerido es Pascal y, si no recuerdo mal, está basado en Turbo-Pascal. Sucede que si va a http://www.freepascal.org/ y descarga el compilador Pascal, todos los ejemplos funcionan directamente desde la página ~ http://www.freepascal.org/download.var Lo bello de Free Pascal es que puedes usarlo casi cualquier procesador o sistema operativo que puedas cuidar.

Una vez que haya dominado las lecciones vuelva a intentar la más avanzada " Dragón libro " ~ http://en.wikipedia.org/wiki/Dragon_book


9

Estoy buscando el mismo concepto, y encontré este prometedor artículo de Joel Pobar,

Cree un compilador de lenguaje para .NET Framework; no estoy seguro de dónde ha ido

Crear un compilador de lenguaje para .NET Framework - copia en pdf del documento original

analiza un concepto de alto nivel de un compilador y procede a inventar su propio lenguaje para el marco .Net. Aunque está dirigido al .Net Framework, muchos de los conceptos deberían poder reproducirse. El artículo cubre:

  1. Definición de Langauge
  2. Escáner
  3. Analizador (el bit que me interesa principalmente)
  4. Apuntando al .Net Framework El
  5. Generador de códigos

hay otros temas, pero obtienes lo justo.

Está dirigido a personas que comienzan, escrito en C # (no del todo Java)

HTH

huesos


¿Qué significa "no del todo Java"?
Hejazzman

jaja, lo siento, quise decir que está escrito para .Net, que en principio es similar a java. Ambos son JIT en estilo. :)
dbones

8

Una manera fácil de crear un compilador es usar bison y flex (o similar), construir un árbol (AST) y generar código en C. Con la generación de código C es el paso más importante. Al generar código C, su lenguaje funcionará automáticamente en todas las plataformas que tengan un compilador de C.

Generar código C es tan fácil como generar HTML (solo use print, o equivalente), que a su vez es mucho más fácil que escribir un analizador C o un analizador HTML.


8

De las preguntas frecuentes de comp.compilers :

"Programación de una computadora personal" por Per Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

Este libro titulado lamentablemente explica el diseño y la creación de un entorno de programación para un solo usuario para micros, utilizando un lenguaje similar a Pascal llamado Edison. El autor presenta todo el código fuente y explicaciones para la implementación paso a paso de un compilador de Edison y un sistema operativo de soporte simple, todo escrito en el propio Edison (excepto un pequeño núcleo de soporte escrito en un ensamblador simbólico para PDP 11/23; el fuente completa también se puede pedir para la PC de IBM)

Las cosas más interesantes de este libro son: 1) su capacidad para demostrar cómo crear un compilador y sistema operativo completo, autónomo, autosuficiente y útil, y 2) la discusión interesante sobre el diseño del lenguaje y los problemas de especificación y el comercio- offs en el Capítulo 2.

"Brinch Hansen en los compiladores Pascal" por Per Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

Otro libro sobre la teoría de la luz sobre la pragmática es el de cómo codificarlo. El autor presenta el diseño, la implementación y el código fuente completo para un compilador e intérprete de código p para Pascal- (Pascal "menos"), un subconjunto de Pascal con tipos booleanos y enteros (pero sin caracteres, reales, subranged o enumerados) , definiciones constantes y variables y tipos de matrices y registros (pero sin tipos empaquetados, variantes, conjuntos, punteros, sin nombre, renombrados o de archivo), expresiones, declaraciones de asignación, definiciones de procedimientos anidados con valores y parámetros variables, si las declaraciones, mientras que las declaraciones, y bloques de inicio-fin (pero no hay definiciones de funciones, parámetros de procedimiento, declaraciones de goto y etiquetas, declaraciones de casos, declaraciones de repetición, para declaraciones y con declaraciones).

El compilador y el intérprete están escritos en Pascal * (Pascal "estrella"), un subconjunto de Pascal ampliado con algunas características de estilo Edison para crear sistemas de desarrollo de software. El autor vende un compilador Pascal * para la PC IBM, pero es fácil portar el compilador Pascal del libro a cualquier plataforma Pascal conveniente.

Este libro facilita el diseño y la implementación de un compilador. Me gusta especialmente la forma en que el autor se preocupa por la calidad, la fiabilidad y las pruebas. El compilador y el intérprete se pueden usar fácilmente como la base para un lenguaje más complicado o un proyecto de compilador, especialmente si está presionado para que algo funcione rápidamente.


8

Debería consultar los " ichbins " de Darius Bacon , que es un compilador para un pequeño dialecto Lisp, dirigido a C, en poco más de 6 páginas de código. La ventaja que tiene sobre la mayoría de los compiladores de juguetes es que el lenguaje es lo suficientemente completo como para que el compilador esté escrito en él. (El tarball también incluye un intérprete para arrancar la cosa).

Hay más cosas sobre lo que encontré útil para aprender a escribir un compilador en mi página web de Ur-Scheme .


8
  1. Este es un tema vasto. No subestimes este punto. Y no subestimes mi punto de no subestimarlo.
  2. Escuché que el Libro del Dragón es un (el?) Lugar para comenzar, junto con la búsqueda. :) Mejora en la búsqueda, eventualmente será tu vida.
  3. ¡Construir su propio lenguaje de programación es absolutamente un buen ejercicio! Pero sepa que al final nunca se usará para ningún propósito práctico. Las excepciones a esto son pocas y muy distantes.

44
Si no has leído el libro del Dragón. Por favor no lo recomiendo. De hecho, ¿alguna vez has implementado un compilador?

Sí, como su nombre lo indica, el Libro del Dragón es un monstruo. Muy en profundidad, pero un muy buen recurso, no obstante. Yo no lo recomendaría para principiantes, aunque ...
Zachary Murray

2
@Neil: No me has buscado en Google, ¿verdad? jajaja blog.280z28.org Pero no, no he leído ese libro.
Sam Harwell el

Lo estoy leyendo (el libro del dragón) actualmente, y también Lex / Yacc al mismo tiempo, el libro me parece bastante bueno. Personalmente.
Simeon Pilgrim

1
Para ser justos, lo prefacio con "Escucho ...". :) # 1 y # 3 son los puntos que creo que son extremadamente importantes para saber, pero no se mencionan tan a menudo.
Sam Harwell el


7

Python viene incluido con un compilador de Python escrito en Python. Puede ver el código fuente, e incluye todas las fases, desde el análisis, el árbol de sintaxis abstracta, el código de emisión, etc. Hackéelo.


7

Lo sentimos, está en español, pero esta es la bibliografía de un curso llamado "Compiladores e Intérpretes" (Compiladores e Intérpretes) en Argentina.

El curso fue desde la teoría del lenguaje formal hasta la construcción del compilador, y estos son los temas que necesita para construir, al menos, un compilador simple:

  • Diseño de compiladores en C.
    Allen I. Holub

    Prentice-Hall. 1990

  • Compiladores Teoría y Construcción.
    Sanchís Llorca, FJ, Galán Pascual, C. Editorial Paraninfo. 1988.

  • Construcción del compilador.
    Niklaus Wirth

    Addison-Wesley. 1996.

  • Lenguajes, Gramáticas y Autómatas. Un enfoque práctico.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán. Addison-Wesley Iberoamericana (España). 1997.

  • El arte del diseño del compilador. Teoría y práctica.
    Thomas Pittman, James Peters.

    Prentice Hall. 1992

  • Construcción de compiladores orientados a objetos.
    Jim Holmes
    Prentice Hall, Englewood Cliffs, NJ 1995

  • Compiladores Conceptos Fundamentales.
    B. Teufel, S. Schmidt, T. Teufel.

    Addison-Wesley Iberoamericana. 1995

  • Introducción a la teoría de autómatas, idiomas y computación.

    John E. Hopcroft. Jeffref D. Ullman.
    Addison-Wesley. 1979.

  • Introducción a los idiomas formales.
    György E. Révész.

    Mc Graw Hill. 1983.

  • Técnicas de análisis. Una guía práctica.
    Dick Grune, Ceriel Jacobs.
    Impreso por los autores. 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc: otro compilador compilador.
    Stephen C. Johnson
    Informática Ciencia Informe técnico Nº 32, 1975. Bell Laboratories. Murray Hill, Nueva
    Jersey.

  • Lex: un generador de analizador léxico.
    ME Lesk, E. Schmidt. Informe Técnico de Informática Nº 39, 1975. Laboratorios Bell. Murray Hill, Nueva Jersey.

  • lex y yacc.
    John R. Levine, Tony Mason, Doug Brown.
    O'Reilly & Associates. 1995

  • Elementos de la teoría de la computación.
    Harry R. Lewis, Christos H. Papadimitriou. Segunda Edición. Prentice Hall. 1998.

  • Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control.
    Salvador V. Cavadini.
    Trabajo Final de Grado para obtener el Título de Ingeniero en Computación.
    Facultad de Matemática Aplicada. UCSE 2001.


6

No es un libro, sino un documento técnico y una experiencia de aprendizaje enormemente divertida si quieres saber más sobre compiladores (y metacompiladores) ... Este sitio web te guía en la construcción de un sistema de compilación completamente autónomo que puede compilarse a sí mismo y a otros idiomas:

Tutorial: Metacompiladores Parte 1

Todo esto se basa en un sorprendente pequeño documento técnico de 10 páginas:

Val Schorre META II: un lenguaje de escritura compilador orientado a la sintaxis

de honesto a dios 1964. Aprendí a construir compiladores a partir de esto en 1970. Hay un momento alucinante cuando finalmente entiendes cómo el compilador puede regenerarse a sí mismo ...

Conozco al autor del sitio web de mis días universitarios, pero no tengo nada que ver con el sitio web.


Como otros dicen, es un GRAN argumento, creo que sushi una tarea es un trabajo final para el soltero, requiere conocer MUCHOS conceptos de matemáticas, informática, etc.
ingconti

Si no conoce estos temas, realmente no debería estar tratando de construir un compilador serio. Sin embargo, si tiene una educación universitaria en informática de 2 a 3 años (programación, estructuras de datos, lenguaje ensamblador), el documento MetaII funcionará para usted.
Ira Baxter

5

También me gustó el tutorial de Crenshaw , porque deja absolutamente claro que un compilador es solo otro programa que lee algunas entradas y escribe algunas salidas.

Léelo

Trabaje si lo desea, pero luego vea otra referencia sobre cómo se compilan realmente los compiladores más grandes y completos.

Y lea On Trusting Trust , para obtener una pista sobre las cosas no obvias que se pueden hacer en este dominio.


5

Si está interesado en escribir un compilador para un lenguaje funcional (en lugar de uno de procedimiento), Simon Peyton-Jones y David Lester " Implementando lenguajes funcionales: un tutorial " es una guía excelente.

Los conceptos básicos de cómo funciona la evaluación funcional se guían por ejemplos en un lenguaje funcional simple pero poderoso llamado "Core". Además, cada parte del compilador del lenguaje Core se explica con ejemplos de código en Miranda (un lenguaje funcional puro muy similar a Haskell).

Se describen varios tipos diferentes de compiladores, pero incluso si solo sigue el llamado compilador de plantillas para Core, tendrá una excelente comprensión de lo que hace que la programación funcional funcione.


5

Puede usar BCEL de Apache Software Foundation. Con esta herramienta, puede generar código similar al ensamblador, pero es Java con la API de BCEL. Puede aprender cómo puede generar código de idioma intermedio (en este caso, código de bytes).

Ejemplo simple

  1. Cree una clase Java con esta función:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Ahora ejecuta BCELifier con esta clase

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

Puede ver el resultado en la consola para toda la clase (cómo construir el código de bytes MyClass.java). El código para la función es este:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

5

Aquí hay muchas buenas respuestas, así que pensé en agregar una más a la lista:

Obtuve un libro llamado Proyecto Oberón hace más de una década, que tiene un texto muy bien escrito en el compilador. El libro realmente se destaca en el sentido de que la fuente y las explicaciones son muy prácticas y legibles. El texto completo (la edición de 2005) se puso a disposición en formato pdf, por lo que puede descargarlo ahora mismo. El compilador se trata en el capítulo 12:

http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth, Jürg Gutknecht

(El tratamiento no es tan extenso como su libro sobre compiladores)

He leído varios libros sobre compiladores, y puedo secundar el libro del dragón, el tiempo dedicado a este libro vale mucho la pena.


4

Hasta ahora no está incluido en la lista este libro:

Conceptos básicos del diseño del compilador (Torben Mogensen) (del departamento de informática, Universidad de Copenhague)

También estoy interesado en aprender sobre compiladores y planear ingresar a esa industria en los próximos años. Este libro es el libro de teoría ideal para comenzar a aprender compiladores hasta donde puedo ver. Es GRATUITO de copiar y reproducir, escrito de forma limpia y cuidadosa, y se lo da en inglés simple sin ningún código, pero aún presenta la mecánica a través de instrucciones y diagramas, etc. Vale la pena echarle un vistazo.


Lo agregó a la lista gracias :)
Anton
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.