compiler construction - programacion - Recursos de aprendizaje sobre analizadores, intérpretes y compiladores
que es un compilador en programacion (12)
Hace tiempo que quería jugar con la escritura de mi propio idioma (aparentemente para la experiencia de aprendizaje) y, como tal, necesito estar relativamente cimentado en la construcción de Parsers, Intérpretes y Compiladores. Asi que:
- ¿Alguien sabe de algún buen recurso para construir Parsers, Intérpretes y Compiladores?
EDITAR: no estoy buscando compiladores compiladores / compiladores de analizadores como Lex, Yacc y Bison ...
El "Libro del dragón" de Aho es la referencia estándar, pero otra buena opción es la Implementación del compilador moderno de Andrew Appel en Java (también disponible en los sabores ML y C ). Lo guía paso a paso a través de cada uno de los componentes necesarios de un compilador / intérprete y proporciona una gran cantidad de código fuente útil.
El mejor artículo que he leído sobre compiladores data de 1964, "META II, un lenguaje de escritura de compilador orientado a la sintaxis" de Val Schorre. ( http://doi.acm.org/10.1145/800257.808896 )
En 10 páginas, le muestra cómo crear un compilador-compilador asombrosamente simple pero muy efectivo, le proporciona la gramática compilador-compilador y le proporciona los detalles suficientes para implementarlo a mano en una tarde (con un momento conceptual sorprendente) cuando te das cuenta de cómo recurses), y solo por sonrisas implementa un lenguaje tipo ALGOL. El documento es un gas completo y realmente debería ser una lectura obligatoria para cualquiera que trabaje con tecnología de compilación.
Aquí hay un enlace para jugar con un gran tutorial sobre metacompilación, basado en el documento. http://www.bayfronttechnologies.com/mc_tutorial.html
El sitio MIT OpenCourseWare (OCW) tiene una clase cuyo proyecto es construir un complier ... se refieren al libro del Dragón y al libro de Appel, pero además, también hay notas de clase y conferencias disponibles. La clase es 6.035 - Ingeniería de lenguaje informático .
Las notas de clase me parecieron muy útiles para explicar los analizadores sintácticos de descenso recursivo.
Es un libro viejo, bastante anticuado, pero he encontrado a Brinch Hansen en Pascal Compilers como una introducción muy práctica para crear un lenguaje y construir los elementos de un compilador. A pesar del nombre, no es específico de Pascal. Vale la pena si puedes encontrar una copia.
Esta entrada de blog altamente entretenida de Steve Yegge ( Rich Programmer Food ) no le dirá todo lo que necesita saber acerca de cómo compilar un compilador (aunque sí incluye una buena cantidad de buena información), pero hace un gran trabajo de explicando por qué quieres entender a los cumplidores
Diablos, ese post casi me hizo comenzar a estudiar compiladores, y tengo un trabajo de tiempo completo, un niño de 3 años en casa, y aproximadamente -1.5 horas gratis por día en promedio.
He encontrado "Construyamos un compilador" : el tutorial de Jack Crenshaw, muy fácil de seguir y entender. Jack construye un compilador para Pascal, desde cero, con explicaciones muy detalladas de cada paso.
No es muy fácil, pero exhaustivo: el libro de dragones
Por si acaso:
- Están dispuestos a jugar
- Al igual que la posibilidad de construir algo más rápido, entonces profundiza
- Están de acuerdo con el uso de .NET en una plataforma subyacente
... entonces le recomendaría que compruebe el Dynamic Language Runtime de Microsoft, que se proporciona como código fuente dentro de todo el SDK de Dynamic Silverlight.
http://www.codeplex.com/sdlsdk
Algunas cosas buenas de esto es que proporciona muchas características listas para usar como una consola, un sistema de tipo común, un árbol de sintaxis abstracto genérico, etc. Y el paquete incluye tres implementaciones: Python, Ruby y Javascript.
Tal vez sea una buena oportunidad para implementar un lenguaje corto, otro tipo de DLR, luego comience a verificar el código DLR real y luego comience a desarrollar las cosas básicas por su cuenta.
En cualquier caso, ¡mejor suerte de otro fanático de la lengua!
RE: lex, yacc, bisonte
¿Quiere decir que no necesita punteros para ellos o que no está interesado en usarlos? No recomiendo escribir un lexer o analizador a mano.
EDITAR: Puede tener un sentido exagerado de lo que puede lograr un "compilador compilador": la parte realmente difícil de la compilación comienza después de que haya creado el AST. Los libros Aho, Louden y Appel son todos bastante buenos.
Recientemente leí Procesadores de lenguaje de programación en Java y se lo recomendaría a usted, ya que comienza con conceptos básicos y luego lo guiará a través de la implementación de un compilador de descendencia recursiva que incluye generación de código con abundante discusión de enfoques alternativos. Aunque no he leído los otros libros sugeridos en este hilo, por lo que no puedo ofrecer una comparación con ellos. No se deje intimidar por la parte de Java, si no conoce Java, ya que los conceptos y su implementación están lo suficientemente bien explicados como para obtener la esencia sin necesidad de una comprensión detallada de Java.
Recomiendo el diseño de compilador en C que, desgraciadamente, debería encontrar en un sitio de libro usado. El único problema real con el libro es que se escribió cuando la velocidad de compilación era un factor importante, por lo que el compilador está escrito en C. Es un lenguaje de bajo nivel que a veces la teoría de la implementación queda oculta bajo el código de implementación.
Mencionaste tanto intérpretes como compiladores. De hecho, recomendaría comenzar con un intérprete en lugar de un compilador. Es mucho más fácil comenzar con un intérprete y tienden a ser más divertidos para trabajar porque puede obtener comentarios inmediatos sobre cómo lo está haciendo.
Construcción del compilador: Principios y práctica es el mejor libro sobre el tema.