编译、解释

编译的整个过程(从源代码到可执行文件) ##预处理(Preprocessing)

这是编译的第一步,处理源代码中的预处理指令,比如 #include、#define 等。 例如,#include 会把头文件的内容插入到源代码中,#define 会替换宏定义。 预处理后的结果是一个没有宏、头文件等特殊指令的纯粹源代码,准备进入编译阶段。 编译(Compilation)

这一步,编译器将源代码转换为 汇编代码。 汇编代码 是一种低级语言,它与机器码非常接近,但仍然使用了可以人类理解的助记符(例如 MOV、ADD 等),而不是二进制代码。 编译器分析源代码的语法、语义,将其转化为一个平台特定的汇编语言代码。 汇编代码 示例:

asm 复制 编辑 mov eax, 10 add eax, 5 在这一步,编译器还会进行 优化,试图减少生成代码的大小和提高执行效率。

##汇编(Assembly)

汇编阶段是将编译生成的 汇编代码 转换成 目标代码 的过程,目标代码是一种机器指令的二进制形式,但它并不完全是机器码。 目标代码是经过编译的低级语言代码,通常是 CPU 指令集的中间表示,能够在特定平台上运行,但还需要进一步的链接才能生成最终的可执行文件。 汇编器(Assembler)将汇编代码转换成二进制的目标文件(通常是 .o 或 .obj 文件)。 例如,如果你的程序包含 mov eax, 10,汇编器会把它转换为相应的机器指令:

asm 复制 编辑 mov eax, 10 –> 0xB8 0x0A 0x00 0x00 0x00 这就是 目标代码,它是二进制表示的机器指令,但它是局部的,还没有成为完整的可执行程序。

##链接(Linking)

链接是将多个目标文件(以及可能的库文件)合并成一个完整的可执行文件的过程。 如果程序由多个源文件组成,那么编译器会分别将每个源文件编译成目标代码文件。然后,链接器会将这些目标代码文件(.o 或 .obj)以及库文件(如标准库)链接在一起,解决符号引用(如函数调用)等问题,生成最终的 可执行文件(如 .exe 或无扩展名的文件)。 链接过程涉及到: 符号解析:例如,一个函数调用可能在一个目标文件中,而其实现可能在另一个目标文件中,链接器需要将它们链接起来。 地址重定位:不同的目标文件中可能使用了相同的内存地址,链接器会处理这些地址冲突,将它们调整到不同的位置。 库文件链接:如果程序依赖外部库(如 C 标准库),链接器会将相应的库文件与目标文件合并。 生成最终可执行文件

链接器将所有目标文件和库文件合并,生成一个完整的可执行文件(如 .exe、.out 等)。这个文件包含了程序所有的机器码,计算机可以直接运行它。 可执行文件中的 机器码 是计算机可以直接执行的指令,不需要再经过解释或翻译。

解释器 直接执行,不生成可执行文件 词法分析、语法分析、语义分析、字节码生成、执行、输出

Table of Contents