Me encuentro adjunto a un proyecto para integrar un intérprete en una aplicación existente. El lenguaje que se debe interpretar es un derivado de Lisp, con builtins específicos de la aplicación. Los 'programas' individuales se ejecutarán por lotes en la aplicación.Referencias necesarias para implementar un intérprete en C/C++
Me sorprende que a lo largo de los años haya escrito un par de compiladores y varios traductores/analizadores de datos de idiomas, pero nunca antes he escrito un intérprete. El prototipo está bastante avanzado, implementado como un árbol de sintaxis en C++. Probablemente pueda influir en la arquitectura más allá del prototipo, pero no en el lenguaje de implementación (C++). Por lo tanto, las limitaciones:
- aplicación será en C++
- análisis probablemente será manejada con un yacc gramática/bisontes (que es ahora)
- sugerencias de completos ecologías VM/intérprete como NekoVM y LLVM son probablemente no es práctico para este proyecto. Independiente es mejor, incluso si esto suena como NIH.
Lo que realmente estoy buscando es material de lectura sobre los fundamentos de la implementación de intérpretes. Hice una navegación de SO, y otro sitio conocido como Lambda the Ultimate, aunque están más orientados hacia la teoría del lenguaje de programación.
Algunas de las cositas que he obtenido hasta ahora:
Lisp in Small Pieces, por Christian Queinnec. La persona que lo recomendó dijo que "pasa del intérprete trivial a técnicas más avanzadas y termina presentando códigos de bytes y compiladores de 'Esquema a C'".
NekoVM. Como mencioné anteriormente, dudo que se nos permita incorporar un marco VM completo para apoyar este proyecto.
Structure and Interpretation of Computer Programs. Originalmente, sugerí que esto podría ser excesivo, pero después de haber trabajado en un segmento saludable, estoy de acuerdo con @JBF. Muy informativo y expansivo de la mente.
On Lisp por Paul Graham. He leído esto, y si bien es una introducción informativa a los principios de Lisp, no es suficiente para comenzar a construir un intérprete.
Parrot Implementation. Esto parece una lectura divertida. No estoy seguro de que me proporcione los fundamentos.
Scheme from Scratch. Peter Michaux está atacando varias implementaciones de Scheme, desde un intérprete Scheme rápido y sucio escrito en C (para usarlo como un programa de arranque en proyectos posteriores) hasta el código compilado del Esquema. Muy interesante hasta ahora.
Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages, se recomienda en la secuencia de comentarios para Books On Creating Interpreted Languages. El libro contiene dos capítulos dedicados a la práctica de la construcción de intérpretes, por lo que lo estoy agregando a mi cola de lectura.
- Nueva (y sin embargo antiguo, es decir, 1979): Writing Interactive Compilers and Interpreters por P. J. Brown. Esto está agotado por mucho tiempo, pero es interesante para proporcionar un resumen de las diversas tareas asociadas con la implementación de un intérprete básico.He visto críticas mixtas para este pero como es barato (lo tengo en orden usado por alrededor de $ 3.50) voy a darle un giro.
¿Qué tal? ¿Existe un buen libro que tome al neófito de la mano y muestre cómo construir un intérprete en C/C++ para un lenguaje parecido a Lisp? ¿Tiene preferencia por sintaxis-tree walkers o bytecode intérpretes?
Para responder @JBF:
el prototipo actual es un intérprete, y tiene sentido para mí, ya que estamos aceptando una ruta a un archivo de código arbitrario y ejecutarlo en nuestro entorno de aplicación. Los builtins se usan para afectar nuestra representación de datos en memoria.
no debe ser terriblemente lento. El árbol andador actual parece aceptable.
El idioma es basado en en Lisp, pero no es Lisp, por lo que no se requiere el cumplimiento de las normas.
- Como se mencionó anteriormente, es poco probable que se nos permita agregar un proyecto de VM/intérprete externo completo para resolver este problema.
Para los otros carteles, también estaré revisando sus citas. ¡Gracias a todos!
Agregado para completar. Pregunta canónica http://stackoverflow.com/questions/1669/learning-to-write-a-compiler. Sí, el título de ese dice "compilador", pero los conceptos básicos son los mismos para los intérpretes. – dmckee