前言
编译和链接是计算机程序开发中的两个关键步骤,它们共同确保了高级语言编写的源代码能够被计算机系统有效地执行。
一、翻译环境和运行环境
在翻译环境中,源代码被转换为可执行的机器指令(二进制指令)
在执行环境中,用于实际执行代码
二、翻译环境精讲
翻译环境由编译和链接两大过程组成,而编译又可以分为预处理(有些书上也叫做预编译),编译,汇编三个过程
一.编译
1.预处理
预处理阶段主要处理那些源文件中#开始的预编译指令。如:#include,#define
处理规则:
- 将所有的#define删除,并展开所有的宏定义(即将所有标识符替换成对应的文本,注意宏定义没有类型,仅仅是文本替换,注意上下文的类型是否一致)
- 处理所有的条件编译指令,如:#if,#else
- 处理#include预编译指令,将包含的头文件的内容插入到该预编译指令的位置
- 删除所有注释(所以咱们注释是写给程序员看的哈!!!)
- 添加行号和文件名标识,方便后续编译生成调试信息
- 或保留所有的#pragma的编译器指令,编译器后续会继续使用
2.编译
将预处理后的文件进行一系列的:词法分析,语法分析,语义分析及优化,生成相应的汇编代码文件
- 词法分析:将源代码程序输入扫描器,把代码中的字符分割成一系列的记号(关键字,标识符,字面量,特殊字符)
- 语法分析:对上述记号进行语法分析,从而产生语法树。语法树是以表达式为节点的树
- 语义分析:对表达式的语法层面分析,包括声明和类型的匹配,类型的转换(简单来说就是看表达式是否书写错误)
3.汇编
经过上面的处理,源代码已经转换为汇编代码,此时汇编器将汇编代码转变成机器可执行的指令,每一个汇编语句几乎都对应一条机器指令
二.链接
链接的时候会把一堆文件链接在一起生成可执行程序。
注意:每个源文件都是单独 经过编译器处理生成对应的目标文件(此部分了解就行,如果大家想更加深入的了解可以看《程序员的自我修养》一书
三.运行环境
- 程序必须载入内存中
- 程序的执行便开始,接着便调用main函数
- 开始执行顺序代码。程序将使用一个运行时堆栈,存储函数的局部变量和返回地址。程序同时也使用静态内存,存储于静态内存中的变量在程序的整个执行过程中。
- 终止程序。正常使用终止main函数;也有可能是意外终止。
总结
总的来说,编译和链接的意义在于将人类可读、便于开发维护的高级语言代码转化为计算机可以理解和执行的形式,同时处理好程序各个部分间的依赖关系,保证程序的完整性和正确性。只有经过编译和链接成功生成的可执行文件才能在操作系统下直接运行。