【C语言】编译链接
你不用对每个过客负责,也不用对每个路人说教。
前言
这是我自己学习C语言的第八篇博客总结。后期我会继续把C语言学习笔记开源至博客上。
上一期笔记是关于C语言的自定义类型,没看的同学可以过去看看:【C语言】自定义类型-CSDN博客https://blog.csdn.net/hsy1603914691/article/details/142288412https://blog.csdn.net/hsy1603914691/article/details/142288412https://blog.csdn.net/hsy1603914691/article/details/142288412https://blog.csdn.net/hsy1603914691/article/details/142288412https://blog.csdn.net/hsy1603914691/article/details/142288412
两种环境
1. 翻译环境 , 源代码 被转换为 可执行的机器指令 ( 二进制指令 ),生成 可执行程序 。2. 运行环境 ,实际 执行可执行程序 。
翻译环境
1. 翻译环境是由编译和链接两个过程组成。
2. 编译过程又可以分为预处理、编译、翻译三个过程。
翻译过程
1. ⼀个C语言的项目中可能有多个.c文件⼀起构建。
2. 多个.c文件单独经过编译器,编译处理生成对应的目标文件。(在Windows环境下的目标文件的后缀是.obj,Linux环境下目标文件的后缀是.o)
3. 多个目标文件和链接库⼀起经过链接器处理生成最终的可执行程序。
编译
预处理
1. 在预处理阶段,源文件和头文件会被处理成为.i为后缀的文件。
2. 预处理阶段主要处理那些源文件中那些以#开始的预编译指令。
3. 将所有的#define删除,并展开所有的宏定义。
4. 处理#include预编译指令,将包含的头文件的内容插入到该预编译指令的位置。这个过程是递归进行的,也就是说被包含的头文件也可能包含其他文件。
5. 删除所有的注释,添加行号和文件名标识,方便后续编译器生成调试信息等。
编译
1. 编译过程 就是将预处理后的文件进行⼀系列的: 词法分析 、 语法分析 、 语义分析及优化 ,生成相应的 汇编代码文件 。(将 C语言代码 转化成 汇编代码 )
词法分析
1. 源代码程序 输入 扫描器 中, 扫描器 进行 词法分析 ,把代码中的 字符 分割成⼀系列的 记号 ( 关键字、标识符、字面量、特殊字符等 )。
语法分析
1. 语法分析器对扫描产生的记号进行语法分析,从而产生语法树。
2. 这些语法树是以表达式为节点的树。
语义分析
1. 语义分析器 进行 语义分析 ,即对表达式的语法层面分析。编译器所能做的分析是语义的 静态分析 。2. 静态语义分析通常包括 声明和类型的匹配 , 类型的转换 等。这个阶段会 报告错误的语法信息 。
汇编
1. 汇编器 是将 汇编代码 转变成 机器可执行的指令 ,每⼀个 汇编语句 几乎都对应⼀条 机器指令 。就是根据 汇编指令 和 机器指令 的对照表⼀⼀的进行翻译,也不做指令优化。
链接
1. 链接是⼀个复杂的过程,链接的时候需要把⼀堆文件链接在⼀起才生成 可执行程序 。2. 链接过程主要包括: 地址和空间分配 , 符号决议 和 重定位 等这些步骤。3. 链接解决的是⼀个项目中多文件、多模块之间 互相调用 的问题。
运行环境
1. 操作系统会自动帮用户完成操作。
致谢
感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!