Aquí podría ser tu PUBLICIDAD


Aprendiendo a escribir un compilador

votos
699

Lenguas preferidas : C / C ++, Java y Ruby.

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

Publicado el 04/08/2008 a las 23:46
fuente por usuario Anton
En otros idiomas...        العربية       

40 respuestas

votos
1017

Gran lista de recursos:

Leyenda:

  • ¶ Enlace a un archivo PDF
  • $ Enlace a un libro impreso
Respondida el 04/08/2008 a las 11:52
fuente por usuario Michael Stum


Aquí podría ser tu PUBLICIDAD


votos
69

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 idioma de origen y lo convierte en una representación intermedia, y la mitad inferior se ocupa 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 al construir la mitad superior.

Simplemente haciendo la mitad superior le permite obtener la experiencia de escribir el analizador léxico y el analizador e ir a generar algún "código" (esa representación intermedia que mencioné). Por lo tanto, tomará su programa de origen y lo convertirá a otra representación y hará algo de 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 Gramáticas sin contexto de una manera realmente accesible. Además, para construir el analizador léxico y el analizador, probablemente use las herramientas * nix lex y yacc. Y lo que es menos interesante, el libro llamado " lex y yacc " recogió donde el Libro del Dragón lo dejó para esta parte.

Respondida el 21/07/2009 a las 12:01
fuente por usuario mrduclaw

votos
54

Creo que la implementación Modern Compiler en ML es el mejor texto introductorio para la compilación de compiladores. También hay una versión Java y una versión C , cualquiera de las cuales podría ser más accesible dado el contexto de tu idioma. El libro contiene una gran cantidad de material básico útil (escaneo y análisis sintáctico, 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 una sola forma de asignación estática) en un espacio relativamente pequeño (~ 500 páginas).

Prefiero la Modern Compiler Implementation al libro de Dragon porque la implementación de Modern Compiler abarca 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 trabajar en este libro, estará listo para abordar los artículos de investigación directamente para obtener más detalles si lo necesita.

Debo confesar que tengo un punto débil serio para la construcción del compilador de Niklaus Wirth . Está disponible en línea en formato PDF. La estética de programación de Wirth me parece simplemente hermosa, sin embargo, algunas personas consideran que su estilo es demasiado minimalista (por ejemplo, Wirth prefiere los analizadores sintácticos de descenso recursivo, pero la mayoría de los cursos de CS se centran en herramientas de generación de analizadores sintácticos, los diseños de lenguaje de Wirth son bastante conservadores). de las ideas básicas de Wirth, así que si te gusta su estilo o no, te recomiendo leer este libro.

Respondida el 10/08/2008 a las 08:54
fuente por usuario Dominic Cooney

votos
45

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

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

Sigue siendo una lectura decente, especialmente si puedes comprarlo barato en Amazon. Si solo desea una introducción fácil a los compiladores, Game Scripting Mastery no es un mal camino a seguir. Si quieres ir al hardcore por adelantado, entonces deberías conformarte con nada menos que el Dragon Book.

Respondida el 05/08/2008 a las 12:08
fuente por usuario user316

votos
28

"Construyamos un compilador" es increíble, pero está un poco desactualizado. (No estoy diciendo que lo haga 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 toma un enfoque de 7 pasos para enseñarte 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.

Respondida el 04/08/2008 a las 11:56
fuente por usuario saniul

votos
24

Si está buscando utilizar 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 motor de análisis ANTLR de Java. Puede obtener el libro para el curso como PDF de los programadores pragmáticos .

El curso repasa las cosas del compilador de compilador estándar que verías en otro lugar: análisis sintáctico, tipos y verificación de tipos, polimorfismo, tablas de símbolos y generación de código. Casi todo lo que no está cubierto son las optimizaciones. El proyecto final es un programa que compila un subconjunto de C . Debido a que utiliza 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 la ingeniería práctica utilizando herramientas modernas, un poco más ligero en teoría.

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

Respondida el 05/08/2008 a las 12:13
fuente por usuario Peter Burns

votos
20

Si tienes poco tiempo, recomiendo "Compilador de construcción" de Niklaus Wirth (Addison-Wesley. 1996) , un pequeño librito que se puede leer en un día, sino que explica los conceptos básicos (incluyendo la forma de aplicar lexers, analizadores de descenso recursivo, y sus propias máquinas virtuales basados en la pila). Después de eso, si quieres una inmersión profunda, no hay forma en torno al libro del dragón como otros comentaristas sugieren.

Respondida el 29/08/2010 a las 12:14
fuente por usuario jochenleidner

votos
17

Es posible que desee buscar en 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 usará para definir qué sucede cuando se analiza cada token. Esto podría ser, pero definitivamente no se limita a, imprimir el código C, para un compilador que compilaría en C, o ejecutar las instrucciones dinámicamente.

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

Respondida el 20/07/2009 a las 11:47
fuente por usuario Zachary Murray

votos
16

En general, 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 suelen interpretarse. Quizás también quieras comenzar con un intérprete. En general es más fácil.

El primer paso es escribir una descripción formal del lenguaje, 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 en la que puede operar. Este paso se suele denominar análisis y el software que analiza el código fuente se denomina analizador. A menudo, el analizador es generado por un generador de analizador sintáctico que transforma una gramática formal en código fuente o 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 que puede elegir aquella que sea adecuada para usted. Dependiendo del generador de analizador que elija,

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

En el segundo paso, el árbol de sintaxis abstracta se transforma de una estructura de árbol a una representación lineal intermedia. Como un buen ejemplo para este bytecode de Lua a menudo se cita. Pero la representación intermedia realmente depende de tu lenguaje.

Si está construyendo un intérprete, simplemente tendrá que interpretar la representación intermedia. También puede compilarlo justo a tiempo. Recomiendo LLVM y libjit para 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 va a compilar el idioma, será más complicado. Deberá 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 para uso general. La mayoría de ellos son demasiado académicos o demasiado prácticos. No existe el "Enséñale a ti mismo el compilador escribiendo en 21 días" y, por lo tanto, tendrás 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 haya una biblioteca universitaria cerca de ti donde puedas tomar prestados libros sobre compiladores.

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

Respondida el 21/07/2009 a las 11:37
fuente por usuario user141335

votos
14

Echar un vistazo al libro a continuación. El autor es el creador de antlr .

Lengua patrones de implementación: Crear su propio dominio-específicas y generales lenguajes de programación .

texto alternativo

Respondida el 18/05/2010 a las 12:38
fuente por usuario Taylor Leese

votos
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 con su programa final. Incluso si está utilizando un ensamblador externo, probablemente deba comprender las reubicaciones y cómo funciona todo el proceso de carga del programa para hacer una herramienta de trabajo. Este libro recopila gran cantidad de conocimientos sobre este proceso para varios sistemas, incluidos Win32 y Linux.

Respondida el 18/08/2008 a las 09:18
fuente por usuario Ben Combee

votos
10

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

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

texto alternativo

Respondida el 09/08/2010 a las 07:33
fuente por usuario Lothar

votos
10

Si estás dispuesto a usar LLVM, mira esto: http://llvm.org/docs/tutorial/ . Le enseña a escribir un compilador desde cero utilizando el marco de LLVM, y no supone que tenga ningún conocimiento sobre el tema.

El tutorial sugiere que escribas tu propio analizador y lector, etc., pero te aconsejo que busques bison y flexiones una vez que entiendas la idea. Hacen la vida mucho más fácil.

Respondida el 20/08/2008 a las 11:01
fuente por usuario wvdschel

votos
10

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

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

Respondida el 05/08/2008 a las 05:16
fuente por usuario Chris Bunch

votos
9

Recuerdo haber hecho esta pregunta hace 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 está recibiendo aquí. Sin embargo, me señalaron en la dirección del " Libro del Dragón ", que en mi opinión es un gran libro que explica todo lo que necesita saber para escribir un compilador (por supuesto, tendrá que dominar un idioma o dos. idiomas que conoces, mejor.).

Y sí, muchas personas dicen que leer ese libro es una locura y que no aprenderán 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 una serie de razones por las cuales el desarrollo del compilador es útil: - Porque es divertido. - Es educativo, al aprender cómo escribir compiladores aprenderá mucho sobre informática y otras técnicas que son útiles al escribir otras aplicaciones. - Si nadie escribió 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 ATM de ingeniería informática, pero la mayor parte de lo que sé sobre programación es autodidacta).

En conclusión: - El Libro del Dragón es un gran "tutorial". Pero dedique un tiempo a dominar un idioma o dos antes de intentar escribir un compilador. Sin embargo, no esperes ser un gurú del compilador dentro de la próxima década.

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

Respondida el 06/08/2009 a las 11:37
fuente por usuario Pandafox

votos
9

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

Crear un compilador de lenguaje para .NET Framework

discute un concepto de alto nivel de un compilador y procede a inventar su propio lenguaje para el framework .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. Parser (el bit que más me interesa)
  4. Orientación al .Net Framework The
  5. Generador de códigos

hay otros temas, pero obtienes el justo.

Su objetivo para las personas que comienzan, escrito en C # (no del todo Java)

HTH

huesos

Respondida el 31/12/2008 a las 12:01
fuente por usuario dbones

votos
9

"... Construyamos un compilador ..."

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

¿Por qué? Herramientas y lenguaje.

El lenguaje requerido es Pascal y si no recuerdo mal se basa en Turbo-Pascal. Ocurre que si vas a http://www.freepascal.org/ y descargas el compilador de Pascal, todos los ejemplos funcionan directamente desde la página ~ http://www.freepascal.org/download.var Lo mejor de Free Pascal es que puedes usar casi cualquier procesador o sistema operativo que puedas cuidar.

Una vez que hayas dominado las lecciones, prueba con el " Dragon Book " más avanzado ~ http://en.wikipedia.org/wiki/Dragon_book

Respondida el 20/08/2008 a las 12:28
fuente por usuario bootload

votos
8

Desde el comp.compilers FAQ :

"La programación de un ordenador personal" por Per Hansen Brinch Prentice-Hall 1982 ISBN 0-13-730283-5

Este libro titulado desgracia-explica el diseño y la creación de un entorno de programación de un solo usuario para micros, utilizando un tipo Pascal lenguaje llamado Edison. El autor presenta todo el código fuente y las explicaciones para la ejecución paso a paso de un compilador de Edison y sencillo sistema operativo compatible, todas escritas en sí mismo (a excepción de un pequeño núcleo de apoyo escrito en un ensamblador simbólico para PDP 11/23 Edison, el fuente completo también se puede pedir para el IBM PC).

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

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

Otro libro claro sobre la teoría pesada-en-pragmática-tope aquí tienes-cómo-a-código de la misma. El autor presenta el diseño, implementación, y el código fuente completo para un compilador e intérprete de p-código para Pascal-(Pascal "menos"), un subconjunto de Pascal con booleanos y enteros tipos (pero no los personajes, reales, subranged o tipos enumerados) , constante y definiciones y tipos de matriz y el registro de la variante (pero sin llevar, variante, establecidos, indicador,, cambiado de nombre o tipos de archivo sin nombre), expresiones, instrucciones de asignación, definiciones de procedimientos anidados con los parámetros de valor y variables, sentencias if, while, bloques y begin-end (pero no definiciones de funciones, parámetros de procedimiento, declaraciones Goto y etiquetas, instrucciones Case, estados de repetición, para las declaraciones, y con afirmaciones).

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

Este libro hace que el diseño e implementación de un compilador de arco. Particularmente me gusta la forma en que el autor se refiere a la calidad, fiabilidad, y las pruebas. El compilador y el intérprete se puede utilizar fácilmente como base para un proyecto de lenguaje o compilador más complicado, especialmente si usted está presionado para obtener rápidamente algo en marcha y funcionando.

Respondida el 26/06/2010 a las 09:17
fuente por usuario joe snyder

votos
8

Debería echarle un vistazo a los " ichbins " de Darius Bacon , que es un compilador de un dialecto de Lisp pequeño, que apunta 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 iniciar el proceso).

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

Respondida el 05/10/2008 a las 05:00
fuente por usuario Kragen Javier Sitaker

votos
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 idioma 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 imprimir, o equivalente), que a su vez es mucho más fácil que escribir un analizador C o un analizador HTML.

Respondida el 20/08/2008 a las 10:56
fuente por usuario Peter Stuifzand

votos
7

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 desde la teoría del lenguaje formal hasta la construcción del compilador, y estos son los temas que necesita para compilar, 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 Compilador Orientado 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 los autómatas, los idiomas y la computación.

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

  • Introducción a los lenguajes 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: Sin embargo, otro compilador-compilador.
    Stephen C. Johnson
    Informe Técnico de Ciencias de la Computación Nº 32, 1975. Bell Laboratories. Murray Hill, Nueva
    Jersey.

  • Lex: un generador de analizadores léxicos.
    ME Lesk, E. Schmidt. Informe Técnico de Ciencias de la Computación Nº 39, 1975. Bell Laboratories. 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.

Respondida el 25/04/2009 a las 06:23
fuente por usuario eKek0

votos
7

El compilador de LCC ( wikipedia ) ( página de inicio del proyecto ) de Fraser y Hanson se describe en su libro "Un compilador Retargetable C: diseño e implementación". Es bastante legible y explica todo el compilador, hasta la generación de código.

Respondida el 16/09/2008 a las 05:21
fuente por usuario mfx

votos
7

Python viene incluido con un compilador de Python escrito en Python. Puedes ver el código fuente e incluye todas las fases, desde el análisis sintáctico, el árbol sintáctico abstracto, el código emisor, etc. Cortarlo.

Respondida el 12/08/2008 a las 12:25
fuente por usuario yeruham

votos
6

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

Tutorial: Metacompiladores Parte 1

Todo esto se basa en un increíble pequeño artículo 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í cómo compilar compiladores de esto en 1970. Hay un momento alucinante en el que 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.

Respondida el 28/08/2009 a las 01:01
fuente por usuario Ira Baxter

votos
5
  1. Este es un vasto tema. No subestimes este punto. Y no subestimes mi idea 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 tu propio lenguaje de programación es absolutamente un buen ejercicio! Pero sepa que nunca se usará para ningún propósito práctico al final. Las excepciones a esto son pocas y están muy alejadas entre sí.
Respondida el 20/07/2009 a las 11:44
fuente por usuario Sam Harwell

votos
5

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

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 funcionar la programación funcional.

Respondida el 01/10/2008 a las 10:30
fuente por usuario Mark Reid

votos
5

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

Recibí un libro llamado Project Oberon hace más de una década, que contiene un texto muy bien escrito sobre 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) está disponible en formato pdf, por lo que puede descargarlo ahora mismo. El compilador se trata en el capítulo 12:

http://www-old.oberon.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 de dragones, el tiempo que dedico a este libro es muy valioso.

Respondida el 19/09/2008 a las 12:31
fuente por usuario tovare

votos
4

Puede utilizar BCEL por la Apache Software Foundation. Con esta herramienta puede generar código ensamblador similar, pero es Java con la API BCEL. Usted puede aprender cómo se 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 corre 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 de la función es la siguiente:

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();
}
Respondida el 14/07/2011 a las 04:42
fuente por usuario timaschew

votos
4

También me gustó el tutorial de Crenshaw , porque deja absolutamente en claro que un compilador es simplemente otro programa que lee algunos datos y escribe algunos.

Léelo.

Trabaja si quieres, pero luego mira otra referencia sobre cómo se escriben realmente los compiladores más grandes y más completos.

Y lea Sobre Confianza en Confianza , para obtener una pista sobre las cosas obvias que se pueden hacer en este dominio.

Respondida el 22/08/2008 a las 04:57
fuente por usuario dmckee

votos
3

No incluido en la lista hasta el momento es este libro:

Fundamentos de Diseño de Compiladores (Torben Mogensen) (desde el dept. De Ciencias de la Computación, Universidad de Copenhague)

También estoy interesado en aprender acerca de los compiladores y el plan para entrar en esa industria en el próximo par de años. Este libro es el libro de la teoría ideal para comenzar compiladores de aprendizaje por lo que yo puedo ver. Es libre de copiar y reproducir, de manera limpia y cuidadosamente escrita y se la da a usted en la llanura Inglés sin ningún código, pero aún presenta la mecánica por medio de instrucciones y diagramas, etc. Vale la pena verlo imo.

Respondida el 12/03/2014 a las 05:05
fuente por usuario magneto12321

votos
3

Desaparecidos de la lista: Recolección de basura: Algoritmos para la gestión automática de memoria dinámica, por Jones y Lins.

(Suponiendo que está escribiendo el compilador y el sistema de tiempo de ejecución, y que va a implementar un lenguaje de basura recogida.

Respondida el 27/06/2010 a las 12:43
fuente por usuario Jay

votos
3

Escribí un tutorial en línea sobre diseño de compiladores, titulado "Construyamos un compilador de motor de scripting", así como un compilador de código nativo llamado Bxbasm. Los documentos en línea están en: http://geocities.com/blunt_axe_basic/tutor/Bxb- Tutor.doc

Los documentos, los archivos de soporte y el compilador, en formato zip, se encuentran en: http://geocities.com/blunt_axe_basic

También: http://tech.groups.yahoo.com/group/QDepartment

Steve A.

Respondida el 13/01/2009 a las 11:31
fuente por usuario Steve A

votos
3

El Libro del Dragón es muy complicado. Así que ignóralo como punto de partida. Es bueno y te hace pensar mucho una vez que ya tienes un punto de partida, pero para empezar, tal vez deberías intentar escribir un evaluador matemático / de expresiones lógicas usando técnicas de análisis RD, LL o LR con todo lo que está escrito (lexing / analizando) a mano quizás en C / Java. Esto es interesante en sí mismo y le da una idea de los problemas involucrados en un compilador. Luego puede saltar a su propia DSL utilizando algún lenguaje de scripting (ya que el procesamiento de texto suele ser más fácil) y, como alguien dijo, generar código en el lenguaje de scripting o en C. Probablemente debería usar flex / bison / antlr, etc. haz el lexing / parsing si vas a hacerlo en c / java.

Respondida el 01/10/2008 a las 09:24
fuente por usuario user9529

votos
2

Me sorprende que no haya sido mencionado, pero The Art of Computer Programming de Donald Knuth fue originalmente escrito como una especie de tutorial sobre escritura de compiladores.

Por supuesto, la propensión del Dr. Knuth a profundizar en los temas ha llevado a que el tutorial de compilación de compiladores se haya expandido a un volumen estimado de 9, de los cuales solo tres se han publicado. Es una exposición bastante completa sobre temas de programación, y cubre todo lo que necesitaría saber sobre cómo escribir un compilador, en detalles minuciosos.

Respondida el 21/07/2009 a las 01:20
fuente por usuario greyfade

votos
2

Como punto de partida, será bueno crear un analizador de descenso recursivo (RDP) (digamos que desea crear su propio estilo de BASIC y crear un intérprete BASIC) para comprender cómo escribir un compilador. Encontré la mejor información en C Power Users de Herbert Schild, capítulo 7. Este capítulo se refiere a otro libro de H. Schildt "C The Complete Reference" donde explica cómo crear una calculadora (un simple analizador de expresiones). Encontré ambos libros en eBay muy baratos. Puede consultar el código del libro si visita www.osborne.com o ingresa en www.HerbSchildt.com Encontré el mismo código pero para C # en su último libro

Respondida el 20/08/2008 a las 12:16
fuente por usuario Romjin

votos
1

Si usted no está sólo en busca de libros, pero también interesado en los sitios web que tienen artículos sobre el tema, he blog acerca de diversos aspectos de la creación de un lenguaje de programación. La mayoría de los mensajes se pueden encontrar en el blog de mi categoría "Diseño de idiomas" .

En particular, cubro la generación de código de máquina Intel manualmente, generando automáticamente a máquina o código de bytes, la creación de un intérprete de código de bytes, escribiendo un tiempo de ejecución orientado a objetos, creando un cargador simple, y escribir un simple recolector de basura marca / barrido. Todo esto de una manera muy práctica y pragmática en lugar de aburrirle con mucha teoría.

Apreciaría retroalimentación sobre éstos.

Respondida el 02/04/2014 a las 01:39
fuente por usuario uliwitness

votos
1

El enfoque más rápida es a través de dos libros:

Versión 1990 de una introducción a las técnicas de compilación, un primer curso utilizando ANSI C, Lex y Yacc por JP Bennett - un equilibrio perfecto de ejemplo de código, análisis de la teoría y diseño- contiene un compilador completo, escrito en C, lex y yacc para una gramática sencilla

Dragón libro (versión antigua) - sobre todo una referencia detallada de las características que no están cubiertos en el primer libro

Respondida el 01/04/2011 a las 08:39
fuente por usuario Bubbles

votos
1

Cada vez que quiero probar una nueva idea de lenguaje, solo escribo un analizador simple y hago que genere un lenguaje para el que sea fácil obtener buenos compiladores, como C.

¿Cómo crees que se hizo C ++?

Respondida el 21/07/2009 a las 01:42
fuente por usuario Mike Dunlavey

votos
1

Si eres como yo, que no tiene educación formal en informática, y está interesado en construir / querer saber cómo funciona un compilador:

Me recomiendan "Programación de procesadores de lenguaje en Java: compiladores e intérpretes", un libro increíble para un programador de computadoras autodidacta.

Desde mi punto de vista, comprender esa teoría básica del lenguaje, automatizar la máquina y la teoría de conjuntos no es un gran problema. El problema es cómo convertir esas cosas en código. El libro anterior te dice cómo escribir un analizador, contexto de análisis y generar código. Si no puede entender este libro, entonces tengo que decir que renuncie a construir un compilador. El libro es el mejor libro de programación que jamás haya leído.

Hay otro libro, también es bueno, compilador de Diseño en C . Hay un montón de código, y te dice todo sobre cómo construir un compilador y herramientas de lexer.

Crear un compilador es una práctica de programación divertida y puede enseñarle un montón de habilidades de programación.

No compre el libro de Dragon . Fue una pérdida de dinero y tiempo y no es para un practicante.

Respondida el 05/02/2009 a las 03:55
fuente por usuario Anru

votos
0
  • Comience por asegurarse de que puede responder la mayoría de las preguntas etiquetadas C ++ aquí en Stack Overflow.
  • Después de eso, debe asegurarse de comprender cómo funcionan otros compiladores y comprender [partes de] su código fuente.
  • Notarás que necesitas ensamblador y comenzarás a aprender ensamblador hasta que puedas responder muchas preguntas con esa etiqueta.
  • Si ha llegado hasta aquí, encontrará que han pasado varios años y se da cuenta de cuán grande es ese proyecto y posiblemente sonría ante su propia pregunta desde ese momento (si esta página todavía existe en ese momento) ...
Respondida el 21/07/2009 a las 12:01
fuente por usuario soulmerge


Aquí podría ser tu PUBLICIDAD