第2周-编译程序需要实现的8项功能 对应8个模块

编译程序需要实现8项功能,对应8个模块

编译的遍(Pass)

遍指的是从头到尾扫视一遍源代码或者目标代码,并实现所规定的工作。遍可以和编译的各个阶段相对应,也可无关。根据系统资源的状况、运行目标的要求等,可以将一个编译程序设计成多遍扫描的形式,在每一遍扫描中,完成不同任务。右边的编译程序的组织就是:词法分析作为第一遍,语法分析作为第二遍,代码优化作为第三遍,目 标代码生成作为第四遍。

一边扫描的编译程序

以语法分析为核心(可以想成 语法分析为主控模块,用于控制其他模块,都是为“语法分析”服务的)

编译程序的伙伴工具

A.

B.预处理器

最常见的例子是C预处理器,采用以'#'为行首的指示。因为它不知道底层语言,它的使用被批评并且它的许多功能被其它语言直接内建。例如,宏替换被显示内联和模板替代,包含变为编译期导入(compile-time import,这需要在目标代码中预先保存类型信息,使这个功能无法改进一个语言);条件编译被if-then-else和死代码消除替代。

  1. eg:#define prompt(s) fprintf(stderr,s)
    “#” 就是开始预处理指令
  2. #include <stdio.h>
    预处理,把 stdio.h 拷贝到我们的源代码中,下面才是我们自己的代码,再送到词法分析中去。

C.连接器

我们有2个文件,test.c 和 xyz.c 首先会编译成:test.o 和 xyz.o 这2个目标文件。合并成一个,并在 linux 操作系统上可执行文件。

 

THE END