预处理,编译,汇编,链接程序的区别

时间:2022-04-18 00:55:47

预处理,编译,汇编,链接程序的区别

@(OS)

一段高级语言代码经过四个阶段的处理形成可执行的目标二进制代码。

最难理解的是编译与汇编的区别。这里采用《深入理解计算机系统》的说法。

  • 预处理阶段:写好的高级语言的程序文本比如hello.c,预处理器根据#开头的命令,修改原始的程序,如 #include<stdio.h> ,将把系统中的头文件插入到程序文本中,通常是以 .i 结尾的文件。
  • 编译阶段:编译器将hello.i文件翻译成文本文件*hello.s,这个是汇编语言程序。高级语言是源程序。所以注意概念之间的区别。汇编语言程序干嘛?每条语句都以标准的文本格式确切描述一条低级机器语言指令。*不同的高级语言翻译的汇编语言相同。
  • 汇编阶段:汇编器将hello.s翻译成机器语言指令。把这些指令打包成可重定位目标程序,即 .o 文件。hello.o是一个二进制文件,它的字节码是机器语言指令,不再是字符。前面两个阶段都还有字符。
  • 链接阶段:比如hello程序调用printf程序,它是每个C编译器都会提供的标准库C的函数。这个函数存在于一个名叫printf.o的单独编译好的目标文件中,这个文件将以某种方式合并到hello.o中。链接器就负责这种合并。得到的是可执行目标文件

于是,带着这个理解看2016年的一道命制的习题:
(2016.12)将高级语言源程序转换为机器目标代码文件的程序是(C)
A. 汇编程序
B. 链接程序
C. 编译程序
D. 解释程序

分析:根据上面的描述,这里需要明确的是机器目标代码文件可不可以用来指代汇编程序文件。按照很多文章的解释,这个就是指汇编程序文本。首先,经过汇编程序以后,得到的是可重定位的二进制目标程序,已经不再是含字符的文件了。此外,处理高级程序的一定是预处理程序或编译程序。汇编处理的对象是汇编程序文本,链接处理的是可重定位二进制程序。因此,这里就是在指代编译程序。

之所以会犹豫是因为,看到机器,很容易联想到就是汇编或者链接之后的东西,这是很难抛开的一个概念障碍。