Pregunta

Suponga que el propósito de una asignación es escribir un compilador que funcione en un subconjunto de lenguaje C (puede asumir un subconjunto de cualquier idioma, simplemente apoye la expresividad básica de scripting sin tener cosas complejas).

¿Qué tipo de código intermedio se podría usar para verificar la corrección del compilador?Estaba hablando con un profesor y habló sobre el hecho de que no sabía qué dar a sus estudiantes a la VM que se utilizará para el "código compilado", así que me pregunté cuál podría ser una buena solución.

Subset of C -> Compiler -> Code? -> VM

En qué código podría estar en formato binario o en un formato ASCII (algo así como Pseudo-ASM).

Estoy buscando algo ya hecho, no cómo estructurar este código intermedio y la máquina virtual, solo una fácil y simple lista para probar algunos programas compilados.

¿Fue útil?

Solución

Puede describir un diseño abstracto de la máquina y luego le proporcionará un conjunto de instrucciones en formato de lista.I pequeño analizador Lisp es un nobariner en analizadores.

(label add-two)
(init-stack-frame 2)
(load r1 0)
(load r2 1)
(add val r1 r2)
(goto cont)

Además, escribir un intérprete LISP para leer esto en es un nobariner.

load_labels (index, expr, env)
    if expr.first == 'label'
        env.set(expr.second, index)

interpret (machine, expr, env)
    return env.lookup(expr.first).eval(machine, expr.tail)

Otros consejos

Puede encontrar muchos ejemplos de código intermedio / bytecode en VMS existentes.Dependiendo de su definición, pueden o no ser simples.Ejemplos:

¿Qué tal si compila con un lenguaje de scripting (por ejemplo, javascript)?Es legible por humano y ya hecho.

¿Qué tal si se dirigía a la máquina virtual Java?No estoy seguro de lo sencillo que es, pero está muy bien documentado, por lo que si los alumnos estaban curiosos, podrían dirigirse a Amazon.com y obtener un libro sobre lo que realmente significa el código intermedio y cómo funciona la VM.

También podría crear un ensamblaje real 80x86 o 68000, use un ensamblador para obtener el código de la máquina y luego usar un emulador para ejecutarlo.El hardware real no me parece más complicado que algunos VM de maquillaje si ya has pasado por escribir un compilador y tiene toneladas de depuradores y otras utilidades disponibles.

Pero me gusta la sugerencia de LISP: -)

¿Qué tal llvm ?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top