一、需求场景
强大的IDE总是将自己干过的事隐藏起来(默认配置、编译、链接等),我们只需要点击调试按钮等结果。但很多时候bug并不会在编译阶段出现,等我们debug时就束手无策,计无所出。所以了解一下编译器的工作原理和机制很有必要。
二、忽视了什么?
通常我们写的源码(.c/.cpp文件)会经过预处理(预编译成.ii)->编译->汇编->链接->装载到内存等最后被执行
今天我们先聊预处理(预编译成.ii)->编译->汇编。
1、预处理
主要包括三方面:宏定义;头文件;条件编译。
也包含去注释等处理。
i、针对宏定义(#define)的变量进行直接展开替换。
ii、处理#include的头文件(.h),将其内容插入至预编译指令处,且这个行为是递归的(预处理指令中的头文件中可能仍包含其他头文件)。
iii、处理条件预编译指令 #ifdef #else #endif等
2、编译
主要将预处理后的文件(.ii格式)编译成汇编指令(如MOV R0,R1){针对硬件架构的迥异,编译器有谓之先生成中间代码再生成目标代码}。编译(编译原理)主要包含词法分析,语法分析,语义分析,代码优化等过程,主要阐述电脑以人类的思维理解并将源码编译成汇编指令(直接对寄存器和存储器等直接操作的指令)。
3、汇编
将汇编指令(MOV R0,R1)解释成机器指令(01010101)。
这个过程依赖于指令系统(硬件架构不同,指令系统一般也不同)。