如何在COMPILATION期间查看解析树,中间代码,优化代码和汇编代码?

时间:2009-09-30 07:00:23

标签: gcc compiler-construction parsing disassembly

我正在学习编译程序课程,程序汇编遵循以下步骤

  1. 词法分析
  2. 语法分析
  3. 语义分析
  4. 中间代码生成
  5. 代码优化
  6. 目标代码生成。
  7. 如何查看每个步骤的输出,例如我希望在语法分析后看到解析树。

    我正在使用GCC编译器在Linux机器上编译程序。

    我们可以通过在gcc中使用-Wa编译器选项来查看程序的汇编代码,同样可以看到Tokens,Parse tree和Inetmediate代码。

3 个答案:

答案 0 :(得分:18)

虽然您可以在gcc中使用-fdump-tree-all-fdump-rtl-all选项,但我认为它们的输出对编译器学生没有用。 FWIW,我开始研究gcc作为博士研究的一部分,已完成两门本科课程,我发现gcc及其调试文件不透明且难以理解。

另外,gcc并没有真正遵循编译器的教科书设计。真的,没有人这样做,因为它不能那么好用。我很确定gcc不会生成解析树或抽象语法树。它确实构建了一个IR(称为gimple),用于执行其高级优化。

我建议尝试使用LLVM,因为它设计精良且易于理解。另一种方法是从教科书中下载代码,特别是Appel书,假设它可用。

另一个建议是,如果我可以推荐自己的,我会使用phc。 使用phc,您可以将解析树视为图像,并在编译器中的每次传递后查看AST和源代码。 Here is a comparison of parts of the AST and the parse tree。它们是使用phc简单生成的。您可以看到编译器IR,CFG,SSA表单以及类型推断和别名分析的调试输出。您还可以打开和关闭优化并传递以查看它们具有的效果。

我认为这对你有用。

答案 1 :(得分:11)

您可以使用-E查看预处理器输出。 -fdump-tree-*转储树内部表示,例如-fdump-tree-all。存在各种-d选项以转储RTL中间表示,例如, -fdump-rtl-all(请参阅手册,了解您获得的遗留通行证);此外,-dD转储所有宏定义。

答案 2 :(得分:0)

clang编译器的角度来看,您看不到编译器生成的每个输出。这是因为与其他编译器相比,clang的工作方式有所不同。

  

词法分析

可以通过以下方式发出令牌:

clang test.c -Xclang -dump-tokens
clang test.c -Xclang -dump-raw-tokens
  

中间代码生成

字节码可以通过以下方式发出:     clang test.c -S -emit-llvm

  

语义分析

在生成AST的同时执行语义分析。 AST可以通过以下方式发出:

clang test.c -Xclang -ast-dump
clang test.c -Xclang -ast-view (this generates a graph for the textual AST)
  

代码优化

您可以通过打印应用于C代码的优化管道来查询代码优化:

clang test.c -S -mllvm -print-after-all
  

目标代码生成

生成的代码(即程序集输出)可以通过以下方式查看:

clang test.c -S

奖金

您还可以看到clang为程序调用的完整管道。例如,可以通过以下方式查看用于发出目标文件的管道:

clang -ccc-print-phases test.c -c

在终端上生成的输出是:

0: input, "test.c", c
1: preprocessor, {0}, cpp-output
2: compiler, {1}, ir
3: backend, {2}, assembler
4: assembler, {3}, object