40、预处理,编译,汇编,链接程序的区别
⼀段⾼级语⾔代码经过四个阶段的处理形成可执⾏的⽬标⼆进制代码。
预处理器→编译器→汇编器→链接器:最难理解的是编译与汇编的区别。
这⾥采⽤《深⼊理解计算机系统》的说法。
预处理阶段: 写好的⾼级语⾔的程序⽂本⽐如 hello.c,预处理器根据 #开头的命令,修改原始 的程序,如#include<stdio.h> 将把系统中的头⽂件插⼊到程序⽂本中,通常是以 .i 结尾的⽂件。
编译阶段: 编译器将 hello.i ⽂件翻译成⽂本⽂件 hello.s,这个是汇编语⾔程序。⾼级语⾔是源程序。所以注意概念之间的区别。汇编语⾔程序是干嘛的?每条语句都以标准的⽂本格式确切描述⼀条低级机器语⾔指令。 不同的⾼级语⾔翻译的汇编语⾔相同。
汇编阶段: 汇编器将 hello.s 翻译成机器语⾔指令。把这些指令打包成可重定位⽬标程序,即 .o⽂件。hello.o是⼀个⼆进制⽂件,它的字节码是机器语⾔指令,不再是字符。前⾯两个阶段都还有字符。
链接阶段:比如 hello 程序调⽤ printf 程序,它是每个 C 编译器都会提供的标准库 C 的函数。这个函数存在于⼀个名叫 printf.o 的单独编译好的⽬标⽂件中,这个⽂件将以某种⽅式合并到 hello.o 中。链接器就负责这种合并。得到的是可执⾏⽬标⽂件。
Last updated