“了解一门语言的最基础知识,不如敲代码有趣,但是,不知道语言的基础知识会使你在敲代码时缺少乐趣”
这里是目录
前言
本章介绍程序的翻译和执行,也就是代码在执行前做了些什么。是学习C和C++的基础。
环境
ANSIC:ANSIC是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准。
在ANSIC的任何一种实现中,存在两种不同的环境:
本篇主要大的方面主要介绍C语言的 翻译 和 执行 环境
1.翻译环境 :在这个环境中,C源代码被转换为可执行的机器指令(指令也就是一串二进制数字)。
2.执行环境:它用于实际执行代码。
一、翻译环境
翻译环境做了什么事?
一句话可以概括为:由多个源文件组成的.C程序,经过预编译、编译、汇编、链接等阶段会生成最终的 (.exe)可执行程序
具体做了什么事如下。
1.编译
编译阶段做了什么事?
一句话概括:由多个源文件组成的.C程序 各自经过 编译器生成.obj为后缀的目标文件。
具体如下。(是不是感觉这话很在哪见过,这句话和递归似的哈哈)
(1).预编译
预编译也叫做预处理,预处理阶段做了什么事情?
一句话概括:预处理阶段只会处理以#开头的语句。例如#include,#define
具体如下
1.展开头文件。比如展开#include的800多行代码
2.处理条件编译指令。把该屏蔽代码的都屏蔽掉了
3.宏定义的替换。比如替换#define定义的宏。
4.删除注释。因为注释是给程序员看的,机器不需要看。
这样就会产生一个和 只是在内容上和之前有所不同的文件。功能上实际不变。
(2).编译
什么是编译?
一句话概括:将预处理完的文件经过一系列处理产生相应的汇编代码文件
具体如下
1.语法分析。
2.词法分析。
3.语义分析。
4.符号汇总(重点):符号汇总,符号指的是已经声明的函数的名字,例如Add,main等函数名。编译器将这些符号汇总下来记录下来,以便于后面链接时根据函数名符号找函数的定义。
总结:编译是针对单个文件编译的,只校验本文件的语法是否有问题和 汇总符号,不负责寻找函数的定义。
编译完成后生成了 汇编代码。
(3).汇编
汇编发生了什么事情?
一句话概括:就是把汇编代码转化为由0和1组成的二进制指令并 生成了符号表
符号表:就是将上一个编译阶段 汇总的 符号形成一个符号表格
符号表中显示的 是: 函数名 和 函数的地址的一一对应的关系。
此阶段结束后生成了以.obj为后缀的目标文件。就此编译阶段到此结束。
2.链接
链接阶段发生了什么事?
一句话概括:通过链接器将一个个**目标文件(或许还会有库文件)**链接在一起生成一个完整的可执行程序。
所以链接程序的主要工作就是将有关的目标文件彼此相连接。
解释:就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
结论: 所以在链接阶段会发现被调用的函数未被定义。
注意:链接阶段只会链接调用了的函数/全局变量,如果存在一个不存在实体的声明(函数声明、全局变量的外部声明),但没有被调用,依然是可以正常编译执行的。
总结
再回过头来看看翻译阶段做了什么事情?
翻译阶段:
1.就是将一个程序的每个源文件(有可能有多个源文件)通过编译器分别转为**.obj的目标代码**。
2.然后各个目标文件和 C函数库中和程序员的个人程序库 由 链接器(linker) 捆绑在一起,形成一个单一而完整的 以.exe为后缀的的可执行程序。