703 votos

Aprender a escribir un compilador

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

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

838voto

Michael Stum Puntos 72046

Gran Lista de Recursos:

Leyenda:

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

65voto

mrduclaw Puntos 1917

Esta es una muy vaga pregunta, creo; sólo a causa de la profundidad del tema involucrado. Un compilador puede ser descompuesto en dos partes separadas, sin embargo; una superior, medio e inferior -. La parte superior de la mitad generalmente toma el idioma de origen y la convierte en una representación intermedia, y la mitad inferior se ocupa de la plataforma específica de la generación de código.

Sin embargo, una idea para una fácil manera de acercarse a este tema (el que utilizamos en mi compiladores de clase, al menos) es construir el compilador en las dos piezas descritas anteriormente. Específicamente, usted obtendrá una buena idea de todo el proceso de construcción de la parte superior a la mitad.

Haciendo sólo la mitad superior permite obtener la experiencia de escribir el analizador léxico y el analizador y vaya a generar un "código" (representación intermedia que he mencionado). Por lo que llevará su programa de origen y convertirlo a otro de la representación y hacer algo de optimización (si quieres), que es el corazón de un compilador. La mitad inferior se tomará luego de que la representación intermedia y generar los bytes necesarios para ejecutar el programa en una arquitectura específica. Por ejemplo, el de la mitad inferior tendrá su representación intermedia y generar un ejecutable PE.

Algunos libros sobre este tema que he encontrado particularmente útil fue de Compiladores Principios y Técnicas (o el Dragón Libro, debido a que el lindo dragón en la portada). Tiene algunos grandes de la teoría y, definitivamente, cubre Context-Free Grammars realmente en una forma accesible. También, para construir el analizador léxico y el analizador, es probable que el uso de los *nix herramientas de lex y yacc. Y uninterestingly suficiente, el libro llamado "lex y yacc" recogido donde el Dragón Libro a la izquierda de esta parte.

51voto

Dominic Cooney Puntos 2876

Creo Moderno Compilador de Aplicación en ML es la mejor de introducción del compilador de la escritura de un texto. Hay una versión de Java y C versión también, cualquiera de los cuales podría ser más accesible dado sus idiomas de fondo. El libro reúne una gran cantidad de útiles, material básico (de escaneo y análisis sintáctico, análisis semántico, la activación de los registros de instrucción, selección, RISC y x86 nativo de generación de código) y varias "opciones avanzadas" temas (compilar OO y de los lenguajes funcionales, el polimorfismo, la recolección de residuos, la optimización y la única forma de asignación estática) en relativamente poco espacio (~500 páginas).

Yo prefiero Moderno Compilador de Aplicación para el Dragón libro porque Moderna Compilador de la aplicación de las encuestas a menos de que el campo, sino que tiene realmente sólida cobertura de todos los temas que usted tendrá que escribir una seria, decente compilador. Después de trabajar a través de este libro usted estará listo para hacer frente a los trabajos de investigación directamente para obtener más profundidad si la necesita.

Debo confesar que tengo una seria debilidad por Niklaus Wirth del Compilador de la Construcción. Está disponible en línea en formato PDF. Me parece Wirth programación de la estética simplemente hermoso, sin embargo algunas personas a encontrar su estilo, mínimo (por ejemplo Wirth favorece recursiva descenso de los analizadores, pero la mayoría de CS cursos se centran en parser generator herramientas; Wirth idioma de los diseños son bastante conservadoras.) Compilador de la Construcción es una muy sucinta de la destilación de Wirth las ideas básicas, así que si te gusta su estilo o no, o no, te recomiendo la lectura de este libro.

43voto

Daniel F. Hanson Puntos 3028

Estoy de acuerdo con el Dragón Libro de referencia; IMO, es la guía definitiva para el compilador de la construcción. Prepárate para un poco de hardcore teoría, sin embargo.

Si quieres un libro que es más claro en la teoría, Juego de secuencias de comandos de Dominio podría ser una mejor libro para usted. Si usted es un novato total en la teoría de compiladores, proporciona una suave introducción. No cubre más práctico de análisis de métodos (optando por no predictivo recursivo descenso sin discutir LL o LR análisis), y como recuerdo, ni siquiera a discutir cualquier tipo de teoría de la optimización. Además, en lugar de compilar a código de máquina, se compila a un código de bytes que se supone que se ejecuta en una máquina virtual que usted también escribir.

Aún sigue siendo un decente leer, especialmente si usted puede recoger más barato en Amazon. Si sólo desea una introducción fácil a los compiladores, Juego de secuencias de comandos de Dominio no es una mala manera de ir. Si quieres ir hardcore hasta el frente, entonces usted debe conformarse con nada menos que el Dragón Libro.

24voto

Peter Burns Puntos 17420

Si usted está buscando para utilizar potentes, mayor nivel de herramientas, en lugar de la construcción de todo usted mismo, pasando a través de los proyectos y lecturas para este curso es una muy buena opción. Es un curso de idiomas por el autor de la Java parser motor de ANTLR. Usted puede conseguir el libro para el curso como un PDF a partir de la Pragmática de los Programadores.

El curso repasa el estándar compilador de compilador de cosas que te gustaría ver en otra parte: análisis, tipos y comprobación de tipos, polimorfismo, tablas de símbolos, y la generación de código. Casi la única cosa que no está cubierto es optimizaciones. El proyecto final es un programa que compila un subconjunto de C. Dado que utiliza herramientas como ANTLR y LLVM, es factible escribir todo el compilador en un solo día (tengo una prueba de la existencia de esta, aunque he de decir ~24 horas). Es pesado en la práctica de la ingeniería utilizando herramientas modernas, un poco más claro en la teoría.

LLVM, por cierto, es simplemente fantástico. Muchas situaciones en las que normalmente se podría compilar montaje, sería mucho mejor que compilar para LLVM la Representación Intermedia en su lugar. Es más alto nivel, multiplataforma y LLVM es bastante bueno en la generación optimizada de la asamblea de ella.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X