2010-09-16 10 views
34

¿Hay una serie más moderna, tal vez orientada a objetos, equivalente a la serie "Let's Build a Compiler" de Jack Crenshaw?¿Existe una versión OO más moderna de "Construyamos un compilador"?

Hace un tiempo tropecé con "Let's Build a Compiler" y no pude resistir la tentación de escribir algún código. Escribí un compilador C de bajada recursiva en C# que daba salida a .NET CIL. "Escribir una vez, fugas en todas partes" era mi lema.

Lástima que no me di cuenta hasta muy tarde que el análisis C es una pesadilla.

Ahora estoy interesado en escribir un compilador Java en Java que emita .NET CIL o ensamblajes con el objetivo de ser auto-bootstrapping. Esperaba que pudiera haber algunos tutoriales más nuevos dando vueltas.

Como un lado, ¿pasarías más tiempo con el diseño inicial o simplemente escribirías un montón de pruebas para apoyar la capacidad de refactorizar sin piedad. Pensando hacia atrás, me estoy inclinando hacia este último. El compilador funcionó, pero el código fue realmente horrible.

+3

Te recomiendo que pruebes con los combinadores de analizadores. Ha sido una experiencia iluminadora para mí. http://en.wikipedia.org/wiki/Parser_combinator – ChaosPandion

+4

Para aquellos que no están familiarizados con él, el tutorial de Crenshaw casi no hace teoría, pero concentra una demostración de cómo resolver un compilador que funcione en un mínimo de código. Lo sorprendente es cómo * mucho * uno puede aprender sobre los compiladores en general. ASÍ QUE, Justin no está pidiendo cualquier referencia de compilación, sino algo muy específico. No sé de uno. – dmckee

+1

@dmckee - Exactamente. Usted comprende mi pregunta por completo. @ ChaosPandion - Gracias. Los combinadores de analizadores son una de las cosas con las que planeo jugar en Scala. Sin embargo, quiero que esté en Java vainilla. – Justin

Respuesta

1

¿Has echado un vistazo al proyecto PyPy? Es una implementación de Python del lenguaje Python. Tal vez puede proporcionar algo de inspiración para su objetivo de auto-bootstrapping Java?

2

Soy un fan de "MiniJava" y el trabajo asociado en base a la "Aplicación del compilador moderno en Java" familia de libros. Esto no cumple con todos los requisitos que menciona, ya que la implementación de MiniJava generalmente generará código nativo, pero el servidor puede cambiarse fácilmente para emitir MSIL o lo que sea.

0

Si te gusta aprender por ejemplo, el código para Finch, un poco de lenguaje de programación mío:

  1. está escrito en orientado a objetos C++.
  2. Está muy limpio.
  3. Incluye un compilador de códigos de bytes.
5

Parece que te perdiste por completo el sentido de los tutoriales de Crenshaw. LBC no se trata de escribir código bonito, limpio o eficiente. Se trata de llevar algo que está empapado en la teoría formal a un nivel en el que el codificador casual puede piratear de forma rápida y sencilla un compilador rudimentario (¡pero funcional!).

Cuando leí LBC años atrás, reescribí los ejemplos en C#. Estoy seguro de que el diseño de la clase no es el mejor, o las tareas segregados correctamente, pero es comparable a su Pascal. Me gustaría compartir el código con usted si lo desea, hágamelo saber y puedo publicarlo en línea y compartir el enlace.

En mi tiempo libre he estado escribiendo un poco con el objetivo de unificar las filosofías de LBC y Basics of Compiler Design juntos, siguiendo con el código de trabajo práctico al final de cada unidad/capítulo, con también discuta algunas cosas teóricas después de explorar las ideas para que el lector entienda por qué las cosas son como son. Pero a Crenshaw le tomó años escribir sus series incompletas, así que mía sea un sueño imposible ... y uso C (exactamente porque no es C++ o Java).

+1

Lo siento, siento que no entendí el punto. Al leer en mi pregunta, escribí un compilador de C en C# usando el tutorial de Crenshaw. El resultado también se parecía a su Pascal. Esto estuvo bien porque quería reescribirlo en C, pero tiene poco sentido para C#. Debería ser posible escribir un tutorial similarmente práctico para "piratear rápidamente" un compilador de una manera OO que sea similar en espíritu a Crenshaw pero más moderna. Mi pregunta es si hubo una. Si no escribe el suyo primero, puedo escribirlo yo mismo. Tengo algunas ideas – Justin

0

¿Qué hay de Watt & procesadores de lenguaje de programación Brown en Java. Demuestra qué patrones de OO usar en el diseño del compilador (simple). Lo utilicé con C# con éxito.

3

Eche un vistazo a Terence Parr's "Language Implementation Patterns". Escribió ANTLR, un generador de analizadores para Java, así que sabe lo que hace. Explica los principios del diseño del compilador muy bien y se desarrolla gradualmente.

Martin Fowler's "Domain Specific Languages" también es bueno. Tiene una agenda ligeramente diferente a ser un curso de compiladores puro, pero es una buena referencia sobre los conceptos clave del diseño del lenguaje.

1

Recientemente construí un compilador en mi empresa usando BNFC, al principio me pidieron que utilizara Flex y Bison (C/C++) pero encontré que era un problema, así que usé BNFC para generar los archivos Flex y Bison .

No puedo decir que me gustó el código, mi gramática era bastante grande y el visitante generado pero nada que no pudiera manejar, TDDed desde el principio, así que siempre tuve suficientes pruebas para refactorizar y también mantuve un diagrama UML para ayudarme a pensar en las clases adicionales que escribí.

En realidad hay un libro llamado Implementing Programming Languages autodescrito como "un libro de autoaprendizaje, y hasta cierto punto, un manual de la herramienta BNFC" si lo hubiera leído probablemente habría batallado menos con las decisiones de implementación pero en general encontré BNFC que ser lo suficientemente intuitiva para poder usarlo sólo por la lectura de la manual y la tutorial

por último, pero no menos importante, también se puede utilizar con otros lenguajes como Java (con la taza y JLex)

0

es un viejo tema, pero me gustaría compartir en muchos casos que las personas descubran esta publicación a través de google.

Había leído el libro de Jack Crenshaw y aplicado las técnicas allí usando el emulador Easy68K Motorola 68K. El compilador en el texto se dirige al procesador Motorola 68K, por lo que debe tener un sistema con ese procesador o un emulador.

Luego, decidí escribir un intérprete usando las técnicas que aprendí a través de esta experiencia. El nombre de mi intérprete es Contra, aquí es github repo.

Lo he escrito en java. Por lo tanto, es fácil de leer para cualquier programador que conozca java, C# o un lenguaje de programación similar.

Puede descargar el código fuente y aprender de él. Su código base es limpio y ordenado.

Mehmet.

Cuestiones relacionadas