PoEdu培训 C语言提高班5 编译
文章类别: 培训笔记 0 评论

PoEdu培训 C语言提高班5 编译

文章类别: 培训笔记 0 评论

编译

编译概述

Alt 思维导图

编译过程

  1. 预处理

    • 预处理首先会将我们的注释, 预编译指令, 条件编译指令, #include等进行展开或替换, 生成真正的代码.
  2. 编译

    • 对我们的语法, 词法, 语义等进行解析
    • 成功解析后进行代码优化(Release/Debug模式不同), 并生成我们的二进制汇编码文件<div class=""></div>
  3. 汇编

    • 汇编器将汇编码翻译成机器码
  4. 链接

    • 链接器对我们的程序进行动态或者静态链接, 然后生成相应平台的可执行程序.

预处理器

处理注释, 使用空格代替.
处理预处理指令, 比如 #define, 进行宏的展开和替换.
处理条件编译指令, 比如处理 #ifndef 来进行条件编译.
处理#include, 进行文件包含.

想要看到预处理文件吗?

以Viual Studio 2015为例:
在我们的解决方案视图中, 在项目上点击"右键", 选择"属性".
在打开的对话框窗口中, 找到"C++"-->"预处理器"-->"预处理到文件",
将本选项改为"是".
此时, 重新编译程序后, 在Debug文件夹下, 会看到 ".i" 的文件, 
也就是我们的预编译文件.

编译器

语句分析, 对词法, 语法, 语义进行分析检测.

语义分析, 是近年来才出现的.
旨在提醒一些"未定义的操作", 或者手写的失误, 比如 if 中的 == 写成了 = 

代码优化

一般的, 编译器会分为 Debug 和 Release 版本.
Debug版会方便调试, 会自动初始化一些变量, 会产生一些多余的代码, 并且原代码不会被精简.
Release版会更加注重执行效率, 会自动去掉一些无用代码, 并达到速度优化.

经过编译器的编译, 将会生成二进制汇编文件.

汇编器和链接器

汇编器

将编译器生成的 汇编码 解释为 机器码.

链接器

链接器会将外部的函数导入到当前项目中, 并生成相应平台的可执行程序.

链接分为 静态链接 和 动态链接 两种.

静态链接

就像我们预处理器对#include所处理的那样, 
在预处理阶段将所需要的函数进行查询并拷贝到当前文件中, 进行拼接,
这种方式就是静态链接.

静态链接所生成的文件体积较大, 执行效率比动态链接方式快

动态链接

当我们程序运行时, 在我们需要使用到功能的时候, 
就对我们的操作系统或者公共函数库进行查询, 
查询到之后就进行动态的调用, 实现方式并不在程序本身,
这就是动态链接.

动态链接还可以达到节约内存的目的, 因为函数库都共用了.

动态链接所生成的文件体积较小, 执行效率比静态链接方式慢

如有错误,请提出指正!谢谢.

回复