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

28 compiler-construction parsing gcc disassembly

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

  1. 词汇分析
  2. 语法分析
  3. 语义分析
  4. 中间代码生成
  5. 代码优化
  6. 目标代码生成.

如何查看每个步骤的输出,例如我希望在语法分析后看到解析树.

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

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

Pau*_*gar 18

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

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

我建议尝试LLVM,它的设计精良且易于理解.另一种选择是从教科书中下载代码,特别是Appel书,假设它是可用的.

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

我认为这对你有用.


Mar*_*wis 11

您可以看到预处理器输出-E.-fdump-tree-*转储树内部表示,例如-fdump-tree-all.-d存在各种选项来转储RTL中间表示,例如-fdump-rtl-all(参见手册中有关转储的转换); 另外,-dD转储所有宏定义.

  • 读者注意事项:使用该选项,编译器将树转储到具有源代码名称和".optimized"等后缀的文件中.这一点并不明显,我花了大约20分钟,查看了一个文档,并搜索了gcc不会产生转储的情况,偶尔会注意到新文件*(这是不容易的,因为我做了测试`/ tmp /`,非常垃圾)*. (4认同)