我学习编译过程中,程序编译如下下面的步骤
- 词法分析
- 语法分析
- 语义分析
- 中间代码生成
- 代码优化
- 生成目标代码。
我怎么能看到每一步例如,我想看看语法分析后分析树的输出。
我的Linux机器上编译的程序与GCC编译器。
我们可以通过使用GCC编译器-Wa选项,查看该程序的汇编代码,同样是有选择看令牌,解析树和Inetmediate代码。
我学习编译过程中,程序编译如下下面的步骤
我怎么能看到每一步例如,我想看看语法分析后分析树的输出。
我的Linux机器上编译的程序与GCC编译器。
我们可以通过使用GCC编译器-Wa选项,查看该程序的汇编代码,同样是有选择看令牌,解析树和Inetmediate代码。
虽然你可以使用-fdump-tree-all
和-fdump-rtl-all
gcc的选择,我不认为他们的输出是一个编译器的学生非常有用的。 FWIW,我开始对海湾合作委员会的工作为我的博士研究的一部分,在已经完成了两个本科课程,我发现gcc
和调试文件是不透明的,难以跟踪。
此外,海湾合作委员会并没有真正遵循编译器的教科书设计。 没有人做,真的,因为它不能很好地工作的方式。 我敢肯定的gcc不会产生一个解析树,或抽象语法树。 它建立在其上执行它的高级优化的IR(称为GIMPLE)。
我会建议尝试LLVM代替,这对被精心设计和易于遵循的声誉。 另一种方法是从一本教科书,尤其是阿佩尔本书下载代码,假设其可用。
另一项建议,如果我可以推荐我自己了一下,就是用PHC 。 原发性肝癌,可以看到解析树为图像,并查看AST和源代码在编译器中的每一个传球后。 这里是AST和解析树的部件比较 。 他们使用PHC产生平凡。 你可以看到编译国税局,地CFG,SSA形式和类型推断和别名分析的调试输出。 您还可以将优化并通过开启和关闭,看看他们有没有效果。
我认为这可能是对你有用。
你可以看到预处理器输出-E
。 -fdump-tree-*
转储树内部represenation,如-fdump-tree-all
。 各种-d
选项存在转储RTL中间表示,如-fdump-rtl-all
(请参阅invidual手工传递,你得到的转储); 此外, -dD
转储所有的宏定义。
从图中的点clang
编译器,你不能看到由编译器生成的每一个输出。 这是因为铛以不同的方式工作相比其他的编译器。
词法分析
令牌可以发射通过:
clang test.c -Xclang -dump-tokens
clang test.c -Xclang -dump-raw-tokens
中间代码生成
字节代码可以被发射通过:铛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
奖金
您还可以看到完整的流水线铛所调用的程序。 例如,对于发射目标文件中的管道可通过viewd:
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