Aprender a escribir un compilador [cerrado]

Resuelto Anton asked hace 16 años • 38 respuestas

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 recursos que involucren uno de esos tres, pero cualquier buen recurso es aceptable.

Anton avatar Aug 05 '08 05:08 Anton
Aceptado

Gran lista de recursos:

  • Un marco Nanopass para la educación sobre compiladores ¶
  • Diseño e implementación de compiladores avanzados $
  • Un enfoque incremental para la construcción de compiladores ¶
  • Vídeo tutorial ANTLR 3.x
  • Conceptos básicos del diseño del compilador
  • Construyendo un compilador Parrot
  • Conceptos básicos del compilador
  • Construcción del compilador $
  • Diseño y construcción del compilador $
  • Elaboración de un compilador con C $
  • Elaboración de intérpretes
  • [Diseño del compilador en C] 12 ¶
  • Compiladores: principios, técnicas y herramientas $ - también conocido como "El libro del dragón" ; ampliamente considerado "el libro" para la redacción de compiladores.
  • Ingeniería de un compilador $
  • Fundamentos de los lenguajes de programación
  • Archivo de artículos Flipcode (busque "Implementación de un motor de secuencias de comandos de Jan Niestadt")
  • Dominio de las secuencias de comandos del juego $
  • Cómo construir una máquina virtual desde cero en C# ¶
  • Implementación de lenguajes funcionales
  • Implementación de lenguajes de programación (con BNFC)
  • Implementación de lenguajes de programación usando C# 4.0
  • El patrón de intérprete (descrito en Patrones de diseño $) especifica una forma de evaluar oraciones en un idioma.
  • Patrones de implementación de lenguajes: cree sus propios lenguajes de programación generales y específicos de dominio $
  • Construyamos un compilador de Jack Crenshaw: la versión PDF ¶ (los ejemplos están en Pascal, pero la información es de aplicación general)
  • Vinculadores y cargadores $ (Google Books)
  • Ceceo en trozos pequeños (LiSP) $
  • Tutorial LLVM
  • Implementación del compilador moderno en ML $: también hay una versión de Java $ y C $; se considera ampliamente un muy buen libro.
  • Construcción del compilador orientado a objetos $
  • Técnicas de análisis: una guía práctica
  • Proyecto Oberon ¶ - Mira el capítulo 13
  • Programar una computadora personal $
  • Lenguajes de programación: aplicación e interpretación
  • Rabbit: un compilador para Scheme ¶
  • Reflexiones sobre la confianza : una guía rápida
  • Haga su propio compilador para .NET framework : un tutorial rápido de MSDN
  • Estructura e interpretación de programas informáticos.
  • Tipos y lenguajes de programación
  • ¿Quieres escribir un compilador? - una guía rápida
  • Escribir un compilador en Ruby Bottom Up
  • Compilación de un Lisp : compilar directamente en x86-64

Leyenda:

  • ¶ Enlace a un archivo PDF
  • $ Enlace a un libro impreso
Anton avatar Aug 04 '2008 22:08 Anton

Creo que esta es una pregunta bastante vaga; 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 fuente y lo convierte en una representación intermedia, y la mitad inferior se encarga de la generación del código específico de la plataforma.

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

Simplemente hacer la mitad superior le permite obtener la experiencia de escribir el analizador léxico y el analizador sintáctico y generar algún "código" (esa representación intermedia que mencioné). Entonces tomará su programa fuente, lo convertirá a otra representación y realizará alguna 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 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 libres de 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, curiosamente, el libro llamado " lex y yacc " continuó donde lo dejó el Libro del Dragón para esta parte.

 avatar Jul 20 '2009 23:07

Creo que la implementación del compilador moderno en ML es el mejor texto introductorio para escribir compiladores. Hay una versión Java y también una versión C , cualquiera de las cuales podría ser más accesible dada su experiencia en idiomas. El libro incluye 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 lenguajes orientados a objetos y funcionales, polimorfismo, recolección de basura, optimización y formulario de tarea estática única) en un espacio relativamente pequeño (~500 páginas).

Prefiero la implementación del compilador moderno al libro Dragon porque la implementación del compilador moderno 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 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 gran debilidad por Compiler Construction de Niklaus Wirth. Está disponible en línea como PDF. La estética de la programación de Wirth me parece simplemente hermosa, sin embargo, algunas personas encuentran su estilo demasiado minimalista (por ejemplo, Wirth prefiere los analizadores de descenso recursivos, pero la mayoría de los cursos de informática se centran en herramientas generadoras de analizadores; los diseños del lenguaje de Wirth son bastante conservadores). Compiler Construction es una destilación muy concisa de las ideas básicas de Wirth, así que te guste o no su estilo, recomiendo encarecidamente leer este libro.

Dominic Cooney avatar Aug 10 '2008 07:08 Dominic Cooney

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

Si desea un libro que sea más ligero en teoría, Game Scripting Mastery podría ser un mejor libro para usted. Si es un novato total en la teoría del compilador, le proporciona una introducción más sencilla. No cubre métodos de análisis más prácticos (optar por el descenso recursivo no predictivo sin discutir 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 de máquina, compila en un código de bytes que se supone que se ejecuta en una máquina virtual que usted también escribe.

Sigue siendo una lectura decente, especialmente si puedes conseguirla por poco dinero en Amazon. Si solo desea una introducción sencilla a los compiladores, Game Scripting Mastery no es un mal camino a seguir. Si quieres ser duro desde el principio, entonces deberías conformarte con nada menos que el Libro del Dragón.

 avatar Aug 04 '2008 23:08

"Construyamos un compilador" es fantástico, pero está un poco desactualizado. (No digo que eso lo haga ni siquiera un poquito 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. Viene con un tutorial en PDF que adopta un enfoque de 7 pasos para enseñarle un compilador. Agregar el enlace de quora ya que tiene los enlaces a todos los distintos puertos de SLANG, en C++, Java y JS, también intérpretes en python y java, escritos originalmente usando C# y la plataforma .NET.

RBz avatar Aug 04 '2008 22:08 RBz