2011-02-09 11 views
6

Estoy buscando un lenguaje simple, formalmente definido que se pueda utilizar mientras se aprende sobre la construcción del compilador. Debería ser simple implementar una primera pasada y luego ser susceptible de mayores esfuerzos de optimización.Lenguaje simple y formalmente definido para el aprendizaje del compilador

No dude en señalarme en la dirección de ceceo, pero específicamente estoy buscando otras opciones también.

+1

puede intentar implementar un subconjunto de Pascal; echa un vistazo a [Pascal Implementation] (http://homepages.cwi.nl/~steven/pascal/book/) –

Respuesta

1

especificación Oberon es lo suficientemente pequeño para sus propósitos: http://www-vs.informatik.uni-ulm.de:81/projekte/Oberon-2.Report/

R5RS o un subconjunto funcional puro no es demasiado grande (si ignora la torre numérica).

+0

Hehe, tengo un libro de Wirth donde compilas un compilador para un subconjunto de Oberon. Parece bastante apropiado para la tarea. – Skurmedel

2

Sugeriría Wirth's PL/0.

¿Por qué?

  • La gramática es pequeño, pero todavía hay suficiente allí para obtener un buen sabor para el desarrollo de un compilador:

    program = 
        block "." . 
    
    block = 
        [ "const" ident "=" number {"," ident "=" number} ";"] 
         [ "var" ident {"," ident} ";"] 
         { "procedure" ident ";" block ";" } statement . 
    
    statement = 
        [ ident ":=" expression 
        | "call" ident 
        | "begin" statement {";" statement } "end" 
        | "if" condition "then" statement 
        | "while" condition "do" statement 
        ]. 
    
    condition = 
        "odd" expression 
        | expression ("="|"#"|"<"|"<="|">"|">=") expression 
        . 
    
    expression = 
        [ "+"|"-"] term { ("+"|"-") term} . 
    
    term = 
        factor {("*"|"/") factor} . 
    
    factor = 
        ident | number | "(" expression ")" . 
    
  • se puede implementar un compilador de la máquina virtual para PL/0 en C en alrededor de 1000 líneas de código.

    • Lo suficientemente grande como para ser no trivial, pero lo suficientemente pequeño como para ser factible.
  • Hay tres libros relacionados con ella:

    • Wirth, Niklaus (1975), Estructuras de datos Algoritmos + = Programas, ISBN 0-13-022418-9 (PL originales/0 especificación e implementación (en Pascal)) Una excelente introducción a la compilación.

    • Liffick, Blaise W., Ed (1979), The Byte Book of Pascal, ISBN 0-07-037823-1 (los autores desarrollan un superconjunto menor de PL/0, en Northstar Basic para un CP inicial/M computadora).

    • Wirth, Niklaus (1986), Compilerbau, B.G. Teubner, Stuttgart ISBN 3-519-32338-9 (un superconjunto menor de PL/0, implementado en Modula 2. En alemán).

  • La Web está llena de ejemplos.

    • He encontrado implementaciones en C, C++, Pascal, Modula 2, Java y Ruby. Apuesto a que hay aún más.
  • Hay una entrada de Wikipedia: :-)

  • Además, un par de grupos de votos, con una gran cantidad de personas dispuestas a ayudar a responder a su escritura compilador preguntas:

3

pensé capítulo 8 de Kernighan y Pike de El Entorno de programación Unix fue excelente. Cubre gran parte de la programación en el entorno Unix, todo mientras se implementa un lenguaje de programación.

El capítulo 8 se llama Desarrollo del programa. Discute el desarrollo de un programa no trivial a través de varias etapas de diseño. Ese programa no trivial es hoc, la calculadora de orden alto. Para obtener más detalles sobre el modo, consulte http://en.wikipedia.org/wiki/Hoc_(programming_language)

Es una gran introducción práctica para implementar un lenguaje sencillo utilizando las herramientas estándar yacc y lex. Yacc y Lex son demasiado para cubrir aquí, pero al seguir los ejemplos de este libro y hacer los ejercicios, desarrollarás una comprensión de ellos.

El desarrollo dura a través de varias fases; en la primera fase, ni siquiera tiene variables en el idioma. En la tercera etapa, tiene variables, constantes definidas (PI, E, etc.) y funciones incorporadas, como sin() y log(). En la última etapa, tienes el lenguaje completamente implementado.

Ahora, ¿es el mejor idioma para intentar implementar? No tengo ni idea, pero sé que El entorno de programación Unix fue un excelente libro para leer en paralelo con un libro de compilación tradicional. Cuando comencé a leer el libro compilador de Aho (librito de dragones) volví a leer el capítulo 8 de TUPE y seguí los ejemplos y ejercicios. Claro, cualquiera puede volver a escribir el código del libro, pero los ejercicios requieren que entiendas bien lo que está sucediendo.

Al final, no creo que importe exactamente qué idioma eliges hacer, sino el proceso que sigues mientras lo implementas.

Cuestiones relacionadas