第2周-编译程序需要实现的8项功能 对应8个模块
编译程序需要实现8项功能,对应8个模块
编译的遍(Pass)
遍指的是从头到尾扫视一遍源代码或者目标代码,并实现所规定的工作。遍可以和编译的各个阶段相对应,也可无关。根据系统资源的状况、运行目标的要求等,可以将一个编译程序设计成多遍扫描的形式,在每一遍扫描中,完成不同任务。右边的编译程序的组织就是:词法分析作为第一遍,语法分析作为第二遍,代码优化作为第三遍,目 标代码生成作为第四遍。
一边扫描的编译程序
以语法分析为核心(可以想成 语法分析为主控模块,用于控制其他模块,都是为“语法分析”服务的)
编译程序的伙伴工具
A.
B.预处理器
最常见的例子是C预处理器,采用以'#'为行首的指示。因为它不知道底层语言,它的使用被批评并且它的许多功能被其它语言直接内建。例如,宏替换被显示内联和模板替代,包含变为编译期导入(compile-time import,这需要在目标代码中预先保存类型信息,使这个功能无法改进一个语言);条件编译被if-then-else和死代码消除替代。
- eg:#define prompt(s) fprintf(stderr,s)
“#” 就是开始预处理指令 - #include <stdio.h>
预处理,把 stdio.h 拷贝到我们的源代码中,下面才是我们自己的代码,再送到词法分析中去。
C.连接器
我们有2个文件,test.c 和 xyz.c 首先会编译成:test.o 和 xyz.o 这2个目标文件。合并成一个,并在 linux 操作系统上可执行文件。
版权声明:
作者:三炮不吃鱼
链接:https://www.keke.moe/archives/1277.html
文章版权归作者所有,未经允许请勿转载。
THE END