5.2 翻译

编译器一般会把源代码从一种语言翻译为另一种语言。例如从高级语言翻译到机器码的过程,就包含多个内部的小步骤。这些步骤使我们将中间代码 IR(Intermediate Representation) 逐渐转换为目标语言。每一次对 IR 的处理都使我们向着目标语言更进了一步。在产生汇编代码之前的最后阶段,IR 和汇编就非常相似了,这时候我们可以将汇编转为一个可读的列表,而不是已经编码过的机器指令。

翻译过程是一个复杂的过程,在这个复杂过程中同时还会一步步地丢失掉原始的源代码结构信息,从汇编中重建原始的高级语言源代码是不可能的。

编译器操作的代码单元称为 module。一个 module 一般对应一个源代码文件(但并不是一个头文件或者一个 include 文件)。每一个 module 编译时与其它 module 都是彼此独立的。每一个 module 会产生自己的目标文件。目标文件中包含被编码过的机器指令,不过由于一些原因,还不能马上就执行。

例如,目标文件和其它文件是完全分离的,但又引用了其外部的代码或数据。而那段被引用的代码或数据是否还在内存中驻留,如果是,那么依赖的目标文件在内存的哪个位置。这些都是比较难判断的。

汇编语言和机器操作之间的转换是非常直观的,由于汇编和机器码之间的转换几乎都是一对一的关系。除了 label 的问题之外没有其它什么特殊的工作了。因此,现阶段我们将聚焦在编译过程的链接阶段。

results matching ""

    No results matching ""