Pregunta

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.

¿Fue útil?

Solución

Gran Lista de Recursos:

Leyenda:

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

Otros consejos

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 parte superior a la mitad y la parte inferior-uno.La parte superior la mitad generalmente toma la lengua de origen y la convierte en una representación intermedia, y la mitad inferior se ocupa de la plataforma específica de 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 va a obtener una buena idea de todo el proceso por la construcción de la parte superior a la mitad.

Haciendo sólo la mitad superior le permite obtener la experiencia de escribir el analizador léxico y el analizador y vaya a generar un "código" (que la 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 hará 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 Los compiladores de los Principios y Técnicas de (o el Dragón Libro, debido a la lindo dragón en la portada).Tiene algunos grandes de la teoría y, definitivamente, cubre Contexto Libre de Gramáticas 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.

Creo Moderno Compilador de Aplicación en ML es la mejor de introducción del compilador de la escritura de un texto.Hay un La versión de Java y un La versión C 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, la instrucción de selección, RISC y x86 nativo de generación de código) y varios "avanzado" temas (compilar OO y 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 encuestas de menos el campo, sino que realmente se ha 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. Es disponible en línea como un PDF.Me parece Wirth programación de la estética simplemente hermoso, sin embargo, algunas personas encontrar su estilo demasiado mínimo (por ejemplo Wirth favorece recursiva descenso de los analizadores, pero la mayoría de los CS cursos se centran en el analizador generador de herramientas;Wirth del lenguaje 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.

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

Si quieres un libro que es más ligero en teoría, Juego De Secuencias De Comandos De Dominio podría ser una mejor libro para usted.Si usted es un novato total en 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 hablar de 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 también escribe.

Es todavía un decente leer, sobre todo si se 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.

"Vamos a Construir un Compilador" es impresionante, pero es un poco anticuado.(No estoy diciendo que lo hace incluso un poco menos válida.)

O echa un vistazo a ARGOT.Esto es similar a "Vamos a Construir un Compilador", pero es mucho mejor recurso, especialmente para los principiantes.Esto viene con un tutorial en pdf que te lleva un paso 7 enfoque en la enseñanza de un compilador.La adición de la quora vínculo que tienen los enlaces a los distintos puertos del ARGOT, en C++, Java, JS, también intérpretes de python y java, originalmente escrita con C# y .NET la plataforma.

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

El curso va sobre el estándar del compilador de compilador de cosas que te gustaría ver en otros lugares:en el análisis, los tipos y la comprobación de tipos, polimorfismo, las 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.Debido a que el uso de herramientas como ANTLR y LLVM, es factible escribir todo el compilador en un solo día (tengo una prueba de la existencia de este, aunque he de decir ~24 horas).Es pesado en la práctica de la ingeniería utilizando herramientas modernas, un poco más ligero 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, la plataforma de la cruz, y LLVM es bastante bueno en la generación optimizada de la asamblea de ella.

Si tienes poco tiempo, se los recomiendo Niklaus Wirth del Compilador "Construcción" (Addison-Wesley.1996), un pequeño folleto en el que se puede leer en un día, pero se explican los conceptos básicos (incluyendo cómo implementar lexers, recursiva descenso de los analizadores, y su propia basada en la pila de máquinas virtuales).Después de eso, si quieres una inmersión profunda, no hay forma de evitar el Dragón libro como otros comentaristas sugieren.

Es posible que desee buscar en la Lex/Yacc (o Flex/Bison, lo que usted quiera llamarlos).Flex es un analizador léxico, que se va a analizar e identificar los componentes semánticos ("tokens") de su lenguaje, y el Bisonte se utilizará para definir lo que sucede cuando cada token se analiza.Esto podría ser, pero definitivamente no limitado a, la impresión de código de C, para un compilador que compile a C o dinámicamente en ejecución de las instrucciones.

Esta sección de preguntas frecuentes debe ayudar a usted, y este tutorial parece bastante útil.

Hablando en general, no hay ninguna cinco minutos tutorial para los compiladores, porque es un tema complicado y escribir un compilador puede tomar meses.Usted tendrá que hacer su propia búsqueda.

Python y Ruby se suele interpretar.Tal vez usted quiere empezar con un intérprete así.Es generalmente más fácil.

El primer paso es escribir un lenguaje formal de la descripción, la gramática de su lenguaje de programación.Entonces usted tiene que transformar el código fuente a compilar o interpretar de acuerdo a la gramática en un árbol de sintaxis abstracta, una forma interna de la fuente de código que entiende el ordenador, y pueden funcionar.Este paso es llamado generalmente el análisis y el software que analiza el código fuente que se llama un analizador.A menudo el analizador generado por un parser generator, que transforman una gramática formal en la fuente o código máquina.Para una buena, no-matemático explicación de análisis recomiendo Técnicas de Análisis - Una Guía Práctica.Wikipedia tiene una comparación de analizador de generadores a partir de la cual puedes escoger uno que sea adecuado para usted.Dependiendo del parser generator usted eligió, encontrarás tutoriales en Internet, y realmente popular analizador de generadores (como GNU bison), también hay libros.

Escribir un analizador para su lenguaje puede ser muy duro, pero esto depende de su gramática.Por lo tanto, 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 un lineal de la representación intermedia.Como un buen ejemplo para este Lua bytecode de la se cita a menudo.Pero la representación intermedia realmente depende de su idioma.

Si usted está construyendo un intérprete, usted simplemente tiene que interpretar la representación intermedia.También se puede simplemente-en tiempo de compilación.Recomiendo LLVM y libjit justo a tiempo de compilación.Para hacer que el lenguaje utilizable también tendrá que incluir algunas funciones de entrada y salida y tal vez una pequeña biblioteca estándar.

Si vas a compilar el lenguaje, va a ser más complicado.Usted tendrá que escribir motores de diferentes arquitecturas de computadoras y generar el código máquina de la representación intermedia en los motores.Recomiendo LLVM para esta tarea.

Hay un par de libros sobre este tema, pero te puedo recomendar ninguno de ellos para el uso general.La mayoría de ellos son demasiado académicos o demasiado práctico.No hay "Enseñar a ti mismo compilador escrito en 21 días" y por lo tanto, usted tendrá que comprar varios libros para obtener una buena comprensión de todo este tema.Si usted busca el Internet, usted llegará a través de algunos libros en línea y notas de la conferencia.Tal vez hay una biblioteca de la universidad cercanos a usted donde usted puede pedir prestado libros en los compiladores.

También recomiendo un buen bagaje de conocimientos teóricos en ciencias de la computación y la teoría de grafos, si usted va a hacer su proyecto serio.Licenciado en ciencias de la computación también será de utilidad.

Un libro que aún no sugirió, pero muy importante, es "Enlazadores y Cargadores" por John Levine.Si no estás usando un dispositivo de ensamblador, usted necesita una manera para dar salida a un archivo de objeto que puede ser vinculado en el programa final.Incluso si usted está usando un dispositivo de ensamblador, usted probablemente tendrá que entender las deslocalizaciones y la forma en que el programa de carga funciona el proceso para hacer una herramienta de trabajo.Este libro recoge muchas de las aleatoria de la tradición en torno a este proceso de los diferentes sistemas, incluyendo Win32 y Linux.

El Dragón Libro es sin duda la "construcción de compiladores" libro, pero si su idioma no es tan complicada como la actual generación de idiomas, es posible que desee ver a la Intérprete de patrón de Patrones De Diseño.

El ejemplo en el libro de los diseños de una expresión regular-como el lenguaje y está muy bien pensado, pero como dicen en el libro, es bueno para pensar el proceso, pero es realmente eficaz sólo en pequeñas idiomas.Sin embargo, es mucho más rápido para escribir un Intérprete para una pequeña lengua con este patrón de tener que aprender acerca de todos los diferentes tipos de analizadores, yacc y lex, et cetera...

Si usted está dispuesto a utilizar LLVM, mira esto: http://llvm.org/docs/tutorial/.Se enseña cómo escribir un compilador a partir de cero con LLVM del marco, y no asuma que usted tiene algún conocimiento sobre el tema.

El tutorial sugieren que escribir su propio analizador y el analizador léxico etc, pero yo le aconsejo que busque en bison y flex una vez que usted consigue la idea.Ellos hacen la vida mucho más fácil.

He encontrado el Dragón libro demasiado difícil de leer con demasiado énfasis en la teoría del lenguaje que no es realmente necesaria para escribir un compilador en la práctica.

Me gustaría añadir la Oberon libro que contiene el código fuente completo de un increíblemente rápido y sencillo Oberon compilador Proyecto De Oberon.

Alt text

Recuerdo que hace esta pregunta hace unos siete años cuando yo era bastante nuevo en la programación.

Yo era muy cuidadoso cuando me preguntó y sorprendentemente no me como mucho la crítica como usted llegar aquí.No obstante, me apunte en la dirección de la "Dragón Libro"que es, en mi opinión, un gran libro que explica todo lo que necesitas saber para escribir un compilador (que por supuesto tendrá que dominar un idioma o dos.Los idiomas más sabes, mejor.).

Y sí, muchas personas dicen que la lectura de ese libro es de locos y no aprender nada de ella, pero no estoy de acuerdo totalmente con eso.

Muchas personas también dicen que la escritura de compiladores es estúpido y sin sentido.Bueno, hay un número de razones por las que el compilador de desarrollo son útiles:

  • Porque es divertido.
  • Es educativo, para aprender a escribir compiladores usted va a aprender mucho acerca de la informática y otras técnicas que son útiles al escribir otras aplicaciones.
  • Si nadie escribió compiladores de los lenguajes existentes no conseguir nada mejor.

Yo no escribí mi propio compilador de inmediato, pero después de preguntar sabía por dónde empezar.Y ahora, después de aprender muchos idiomas diferentes y la lectura del Dragón Libro, la escritura no es mucho de un problema.(También estoy estudiando ingeniería informática de la atm, pero la mayoría de lo que sé acerca de la programación es autodidacta.)

En conclusión, El Dragón Libro es una gran "tutorial".Pero pasar algún tiempo para dominar un idioma o dos antes de intentar escribir un compilador.No esperes a ser un compilador gurú dentro de la próxima década o así, a pesar de.

El libro también es bueno si usted desea aprender cómo escribir analizadores/intérpretes.

"...Vamos a Construir un Compilador ..."

Me gustaría segundo http://compilers.iecc.com/crenshaw/ por @sasb.Olviden de comprar más libros para el momento.

Por qué?Herramientas y lenguaje.

El idioma requerido es de Pascal, y si recuerdo correctamente se basa en Turbo Pascal.Lo que pasa es que si van a http://www.freepascal.org/ y descargar el compilador de Pascal de todos los ejemplos de trabajo directamente desde la página ~ http://www.freepascal.org/download.var El beaut cosa acerca de Free Pascal se puede usar en casi cualquier procesador o OS puede cuidar.

Una vez que hayas dominado las lecciones, a continuación, intente la más avanzada "Dragón Libro" ~ http://en.wikipedia.org/wiki/Dragon_book

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

Crear un Compilador de Lenguaje para el .NET Framework no está seguro de que esto ha ido

Crear un Compilador de Lenguaje para el .NET Framework - pdf copia de la original doc

él habla de un alto nivel de concepto de un compilador y procede a inventar su propio lenguaje para el .Net framework.A pesar de que su objetivo en el .Net Framework, muchos de los conceptos debe ser capaz de ser reproducido.El Artículo cubre:

  1. Lenguaje de definición de
  2. Escáner
  3. Analizador (el bit im principalmente interesado)
  4. La orientación de la .Net Framework El
  5. Generador De Código De

hay otros temas, pero usted consigue el justo.

Su objetivo a las personas que comienzan, escrito en C# (no Java)

HTH

los huesos

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

La generación de código en C es tan fácil como la generación de HTML (sólo el uso de la impresión, o equivalente), que a su vez es mucho más fácil que escribir una C parser o analizador de HTML.

A partir de la comp.los compiladores de preguntas frecuentes:

"Programación de un Ordenador Personal" por Brinch Hansen Prentice-Hall, 1982 ISBN 0-13-730283-5

Por desgracia, este-libro titulado se explica el diseño y la creación de un usuario único entorno de programación para los micros, el uso de un Pascal como lenguaje llamado Edison.El autor presenta todo el código fuente y explicaciones para el paso a paso de la implementación de un Edison compilador y simples de apoyo, sistema operativo, todos escritos en Edison sí mismo (a excepción de un pequeño núcleo de apoyo escrito en un simbólico ensamblador para PDP 11/23;la fuente completa también puede ser ordenado para el IBM PC).

La mayoría de las cosas interesantes acerca de este libro son:1) su capacidad para demostrar cómo crear un completo, autónomo, auto-mantenimiento, útil compilador y el sistema operativo, y 2) el interesante debate de el lenguaje de diseño y especificación de problemas y trade-offs en el Capítulo 2.

"Brinch Hansen en los Compiladores de Pascal" por Brinch Hansen Prentice-Hall, 1985 ISBN 0-13-083098-4

Otra luz-en-la teoría de la pesado-en-la pragmática aquí-how-to-código-libro.El autor presenta la el diseño, la aplicación y el código fuente completo para un compilador y el código p el intérprete de Pascal (Pascal "menos"), de Pascal subconjunto booleanos y los tipos enteros (pero no a los personajes, reales, subranged o tipos enumerados), constante y las definiciones de variables y matrices y tipos de registro (pero no de lleno, variante, conjunto, puntero, sin nombre, cambiado de nombre o tipos de archivo), las expresiones, instrucciones de asignación, procedimiento anidado definiciones con el valor y la variable los parámetros, si las declaraciones, mientras que las declaraciones, y los bloques begin-end (pero no las definiciones de funciones, de procedimientos de los parámetros, las instrucciones goto y etiquetas, el caso de las declaraciones, la repetición de declaraciones, declaraciones, y con declaraciones).

El compilador y el intérprete está escrito en Pascal* (Pascal "estrella"), un Pascal subconjunto ampliado con algunos Edison-características de estilo para la creación de desarrollo de software de sistemas.Un Pascal* compilador para el PC de IBM se vende por el autor, pero es fácil de puerto del libro de Pascal compiler para cualquier conveniente Pascal plataforma.

Este libro hace que el diseño y la implementación de un compilador parezca fácil.Yo gusta especialmente la forma en que el autor se preocupa por la calidad, fiabilidad y pruebas.El compilador y el intérprete puede ser utilizado fácilmente como la base para una mayor participación del idioma o compilador del proyecto, especialmente si estás presionado para obtener rápidamente algo en marcha y funcionando.

Usted debe comprobar fuera de Darío de Bacon "ichbins", que es un compilador para un pequeño dialecto de Lisp, la orientación de C, en poco más de 6 páginas de código.La ventaja que tiene sobre la mayoría de los juguetes de los compiladores es que el idioma es lo suficientemente completos que el compilador está escrito en ella.(El archivo también incluye un intérprete para que arranque de la cosa.)

Hay más cosas acerca de lo que he encontrado útil en el aprendizaje de la escritura de un compilador en mi Ur-Esquema De página web.

Python viene con un compilador de python escrito en Python.Usted puede ver el código fuente, y que incluye todas las fases, desde el análisis, el árbol de sintaxis abstracta, emisores de código, etc.Hack.

El compilador LCC (wikipedia) (página de inicio del proyecto) de Fraser y Hanson se describe en su libro "al que puede aplicar retargeting Compilador de C:Diseño e Implementación".Es bastante fácil de leer y explica el compilador, abajo a la generación de código.

Lo siento, 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 de lenguaje formal de la teoría a la creación de compiladores, y estos son los temas que usted necesita para construir, al menos, un simple compilador:

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

    Prentice-Hall.1990.

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

  • Compilador De La Construcción.
    Niklaus Wirth

    Addison-Wesley.1996.

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

  • El arte de compilador de diseño.La teoría y la práctica.
    Thomas Pittman, James Peters.

    Prentice-Hall.1992.

  • Orientado A Objetos Compilador De La Construcción.
    Jim Holmes.
    Prentice Hall, Englewood Cliffs, N. J.1995

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

    Addison-Wesley Iberoamericana.1995.

  • Introducción a la Teoría de Autómatas, Lenguajes y Computación.

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

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

    Mc Mcgraw 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:Sin Embargo, Otro Compilador-Compilador.
    Stephen C.Johnson
    Ciencias De La Computación Informe Técnico Nº 32, De 1975.Bell Los laboratorios.Murray Hill, Nueva
    Jersey.

  • Lex:Un Analizador Léxico Del Generador.
    M.E.Lesk, E.Schmidt.Ciencias De La Computación Técnica Informe Nº 39, De 1975.Los Laboratorios Bell.Murray Hill, Nueva Jersey.

  • lex & 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.U. C. S. E.2001.

  1. Este es un gran tema.No hay que subestimar este punto.Y no subestimes mi punto a no subestimar.
  2. Oigo el Dragón Libro es una (la?) lugar para empezar, junto con la búsqueda.:) Mejorar en la búsqueda, finalmente va a ser su vida.
  3. La construcción de su propio lenguaje de programación es absolutamente un buen ejercicio!Pero saben que nunca podrán ser utilizados para cualquier propósito práctico en la final.Las excepciones son pocas y muy distantes entre sí.

No es un libro, sino un documento técnico, y un enorme experiencia de aprendizaje divertida si quieres saber más acerca de los compiladores (y metacompilers)...Esta página web le guiará a través de la construcción de una completamente independiente del compilador, sistema que se puede compilar en sí mismo y en otros idiomas:

Tutorial:Metacompilers Parte 1

Todo esto se basa en un increíble poco de página 10 documento técnico:

Val Schorre META II:Una Sintaxis Orientada Al Compilador De Lenguaje Escrito

desde honesto-a-dios 1964.Aprendí a construir compiladores de este en 1970.Hay un alucinante momento cuando finalmente grok cómo el compilador puede regenerarse a sí mismo....

Sé el sitio web de autor de mis días de colegio, pero yo no tengo nada que ver con el sitio web.

Hay un montón de buenas respuestas aquí, así que pensé en añadir uno más a la lista:

Tengo un libro que se llama Proyecto Oberon hace más de una década, que tiene algunos muy bien el texto escrito en el compilador.El libro realmente se destaca en el sentido de que la fuente y explicaciones es muy práctica y de fácil lectura.El texto completo (la edición de 2005) se ha hecho disponible en pdf, así que usted puede descargar ahora mismo.El compilador se discute en el capítulo 12:

http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth, Jürg Gutknecht

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

He leído varios libros sobre compiladores, y puedo segundo el dragón libro, el tiempo empleado en este libro es muy valioso.

Si usted está interesado en escribir un compilador para un lenguaje funcional (en lugar de una norma procesal) Simón Peyton-Jones y David Lester del "La implementación de lenguajes funcionales:un tutorial"es una excelente guía.

El conceptual conceptos básicos de cómo la evaluación funcional de las obras es guiado por ejemplos en un sencillo pero potente lenguaje funcional llamado "Core".Además, cada parte del Núcleo compilador de lenguaje se explica con ejemplos de código en Miranda (un puro lenguaje funcional muy similar a la de Haskell).

Varios tipos diferentes de los compiladores se describe, pero incluso si sólo seguir el llamado de la plantilla compilador para el Núcleo tendrá una excelente comprensión de lo que hace a la programación funcional de la garrapata.

Me gustó la Crenshaw tutorial también, porque se hace absolutamente claro que un compilador es un programa que lee algo de entrada y escribe algunos que poner.

Leer.

Trabajo si quieres, pero entonces mire en otra referencia sobre cómo grande y más completa de los compiladores son realmente escritas.

Y leer Confiando En La Confianza, para obtener una idea acerca de la no obvio cosas que se pueden hacer en este dominio.

Puede utilizar BCEL por la Apache Software Foundation.Con esta herramienta, usted puede generar ensamblador-como el código, pero es la versión de Java con la BCEL de la API.Usted puede aprender cómo usted puede generar código de lenguaje intermedio (en este caso el código de bytes).

Ejemplo sencillo

  1. Crear 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 ejecute BCELifier con esta clase

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

Usted puede ver el resultado en la consola para toda la clase (cómo construir el código de bytes MyClass.java).El código de 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();
}

No se incluyen en la lista hasta el momento es este libro:

Fundamentos de Compilador de Diseño (Torben Mogensen) (desde el dpto.de Ciencias de la computación de la Universidad de Copenhague)

Yo también estoy interesado en aprender acerca de los compiladores y el plan para ingresar a esa industria en el próximo par de años.Este libro es el ideal de la teoría de libro para comenzar el aprendizaje de los compiladores, por lo que puedo ver.Es LIBRE de copiar y reproducir, de manera limpia y cuidadosamente escrito y le da a usted en la llanura inglés sin ningún tipo de código, pero aún se presenta la mecánica por medio de instrucciones y diagramas, etc.Vale la pena un vistazo de la omi.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top