源文件(.c 或 .cpp文件)要想运行起来需要经过预编译、编译、汇编、链接、运行几个阶段。那么,这几个阶段中计算机内部又做了什么呢?
预编译阶段:
1.删除 #define (宏定义)并作文本替换;
2.处理 #if #endif 等预编译指令;
3.递归展开 #include (头文件中可能包含其他头文件);
4.删除注释;
5.添加行号和文件标识;
6.保留 #pragma指令。
编译阶段:
1.词法分析(检查单词是否合法规则);
2.语法分析;
3.语义分析;
4.代码优化;
5.生成汇编指令(生成汇编语言,不是机器指令)。
汇编阶段:
1.翻译汇编指令,生成目标文件(可重入二进制文件)。
链接阶段
1.合并段和符号表;
2.符号解析;
3.分配地址和空间;
4.符号的重定位。
链接执行后生成的可执行文件是不能直接运行的,因为,可执行文件是存储在磁盘上的,而运行是需要在内存上去进行的,不具备运行环境。因此运行阶段中还需要做以下事情。
运行阶段
1.建立虚拟地址空间和物理内存的映射,创建内核映射结构体(PCB)页表和页目录;
2.加载指令和数据;
3.把可执行文件的入口地址放入下一行指令寄存器中。
简单的整理如下: