2009-09-30 7 views
23

estoy estudiando curso de compiladores, compilación de programa sigue a continuación los pasos¿Cómo puedo ver el árbol de análisis sintáctico, el código intermedio, el código de optimización y el código de ensamblado durante la compilación?

  1. Análisis léxico
  2. Sintaxis análisis
  3. El análisis semántico
  4. generación de código intermedio
  5. optimización Código
  6. objetivo la generación de código.

¿Cómo puedo ver la salida de cada paso? Por ejemplo, quiero ver el árbol de análisis después del análisis de sintaxis.

Estoy compilando el programa en la máquina Linux con el compilador GCC.

Podemos ver el código de ensamblaje del programa utilizando la opción compilador -Wa en gcc, del mismo modo hay opciones para ver Tokens, árbol de análisis y código inmediato de Inet.

Respuesta

8

Puede ver la salida del preprocesador con -E. -fdump-tree-* vuelca la representación interna del árbol, p. -fdump-tree-all. Existen varias opciones de -d para volcar las representaciones intermedias de RTL, p. -fdump-rtl-all (vea el manual para los pases individuales que obtiene vertederos de); Además, -dD vuelca todas las definiciones de macro.

+2

Nota para los lectores: con la opción, el compilador coloca el árbol en un archivo con el nombre del código fuente y un sufijo como '.optimized'. No es nada obvio, pasé ≈20 minutos, revisé una documentación y busqué casos en los que gcc no produce el volcado, cuando ocasionalmente noté el nuevo archivo * (lo cual no es fácil ya que hice una prueba en '/ tmp /', que es bastante junky) *. –

15

Si bien puede utilizar las opciones -fdump-tree-all y -fdump-rtl-all en gcc, no creo que su salida sea muy útil para un compilador. FWIW, comencé a trabajar en gcc como parte de mis estudios de doctorado, ya había completado dos cursos de pregrado, y encontré gcc y sus archivos de depuración son opacos y difíciles de seguir.

Además, gcc no sigue realmente el diseño de los libros de texto de los compiladores. Nadie lo hace, realmente, porque no funciona bien de esa manera. Estoy bastante seguro de que gcc no produce un árbol de análisis sintáctico o un árbol de sintaxis abstracta. Construye un IR (llamado gimple) sobre el cual realizar sus optimizaciones de alto nivel.

Sugeriría probar LLVM, que tiene la reputación de estar bien diseñado y ser fácil de seguir. Otra alternativa es descargar el código de un libro de texto, especialmente el libro de Appel, suponiendo que esté disponible.

Otra sugerencia, si puedo recomendar la mía por un momento, es usar phc. Con phc, puede ver el árbol de análisis sintáctico como una imagen, y ver el AST y el código fuente después de cada pasada en el compilador. Here is a comparison of parts of the AST and the parse tree. Se generan trivialmente usando phc. En la rama dataflow, puede ver el IR del compilador, el CFG, el formulario SSA y la salida de depuración de inferencia de tipo y análisis de alias. También puede activar y desactivar optimizaciones y pases para ver el efecto que tienen.

Creo que esto podría ser útil para usted.

+0

Oh de ninguna manera, ¿ese es tu sitio? La explicación de ese sitio de la herencia virtual es fantástica.Después de leer, realmente obtuve el "por qué" de lo virtual y su presagio en los sistemas de objetos en C. ¿Sus pensamientos sobre los buenos compiladores pedagógicos hoy son diferentes? – Praxeolitic

+0

Pero 'phc' parece ser un compilador en sí mismo, es decir, no es una aplicación para facilitar la comprensión de bytecode de GCC. –

Cuestiones relacionadas