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.
Respuestas:
Gran lista de recursos:
Leyenda:
fuente
Let's Build a Compiler
[ compilers.iecc.com/crenshaw/] , es una buena reseña y es un buen punto de partida.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.
fuente
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.
fuente
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.
fuente
"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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
Echa un vistazo al libro a continuación. El autor es el creador de ANTLR .
Patrones de implementación del lenguaje: cree sus propios lenguajes de programación específicos de dominio y generales .
fuente
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.
fuente
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.
fuente
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.
fuente
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 .
fuente
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:
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.
fuente
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
fuente
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:
hay otros temas, pero obtienes lo justo.
Está dirigido a personas que comienzan, escrito en C # (no del todo Java)
HTH
huesos
fuente
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.
fuente
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.
fuente
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 .
fuente
fuente
El compilador de LCC ( wikipedia ) ( página de inicio del proyecto ) ( github.com/drh/lcc ) de Fraser y Hanson se describe en su libro "Un compilador de C retardable: diseño e implementación". Es bastante legible y explica todo el compilador, hasta la generación de código.
fuente
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.
fuente
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:
fuente
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.
fuente
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.
fuente
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.
fuente
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
Cree una clase Java con esta función:
Ahora ejecuta BCELifier con esta clase
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:
fuente
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.
fuente
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.
fuente