C语言——编译和链接
编译和链接
- 环境
- 翻译环境
- 预处理
- 编译
- 汇编
- 链接
- 运行环境
环境
在ANSI C的任何一种实现中存在两种不同的环境:
- 翻译环境(将源代码翻译为可执行的机器指令即二进制指令)
- 执行环境(用于执行代码)
一般来讲,翻译环境是编译器,执行环境是操作系统。
翻译环境
将源代码翻译为可执行的机器指令即二进制指令 / 源文件变为可执行程序文件
Windows系统中的目标文件就是以 .obj 为结尾的。
linux系统中的目标文件就是以 .o 为结尾的。链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库。
cl.exe是编译器。
link.exe是链接器。
Microsoft Visual Studio 是集成开发环境,包含了:编辑器、编译器、链接器、调试器、等。
下面是Linux环境下的gcc文件,编译链接如下:
编译又被分为:预处理、编译、汇编 三个部分。
C语言代码(.c.h) —> 预处理(.i) —> 编译(.s) — 汇编(.o) —> 链接 —> 可执行程序(.exe)
预处理
编译
编译过程就是将预处理后的文件进行⼀系列的:词法分析、语法分析、语义分析及优化,生成相应的汇编代码文件。
编译之后的文件里就是汇编。
词法分析
将源代码程序被输入扫描器,扫描器的任务就是简单的进⾏词法分析,把代码中的字符分割成⼀系列、的记号(关键字、标识符、字⾯量、特殊字符等)。
语法分析
对扫描产生的记号进行语法分析,从而产生语法树。这些语法树是以表达式为
节点的树。
代码->词法分析->语法分析
语义分析
由语义分析器来完成语义分析,即对表达式的语法层面分析。
编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息。
静态分析:不执行代码,只做分析。
汇编
汇编器将汇编代码转变成机器可执行的指令,每⼀个汇编语句几乎都对应⼀条机器指令。
根据汇编指令和机器指令的对照表⼀⼀的进行翻译。(只做翻译)
链接
链接是⼀个复杂的过程,链接的时候需要把⼀堆文件链接在⼀起才生成可执行程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。
链接解决的是⼀个项目中多文件、多模块之间互相调用的问题。
运行环境
-
程序必须载入内存中。在有操作系统的环境中:⼀般这个由操作系统完成。
-
在独立的环境中(比如嵌入式),程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
-
程序的执行便开始。接着便调用main函数。
-
开始执行程序代码。这个时候程序将使用⼀个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程⼀直保留他们的值。(因此动态申请的内存一定要free否则会一直占用空间)
-
终止程序。正常终止main函数;也有可能是意外终止。
上述过程就是程序的大致运行流程。