鱼C论坛

 找回密码
 立即注册
查看: 22587|回复: 71

[扩展阅读] 编译器的工作流程

  [复制链接]
发表于 2016-11-1 19:03:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
编译器的工作流程


众所周知,在 CPU 的眼里只有 1 和 0,虽然简单,但它们却构造出了世界上人类最难理解的语言 —— 机器语言。

因此,想要让计算机运行你的代码,你必须将你的源代码“翻译”成 CPU 认识的语言才行。

下边小甲鱼以 GCC 为例,尝试给大家讲下编译器的工作流程!


要将 C 语言翻译成机器语言,简单来说需要两个步骤:编译 -> 链接

111.png

对于 GCC 来说,执行 gcc test.c 命令,其实相当于依次执行下面四个步骤:

  • 预处理(Pre-Processing)-- 对 C 语言进行预处理,生成 test.i 文件
  • 编译(Compiling)-- 将上一步生成的 test.i 文件编译生成汇编语言文件,后缀名为 test.s
  • 汇编(Assembling)-- 将汇编语言文件 test.s 经过汇编,生成目标文件,后缀名为 test.o
  • 链接(Linking)-- 将各个模块的 test.o 文件链接起来,生成最终的可执行文件

注:前三个步骤均属于编译过程。

先敲几行最简单的源代码:
#include <stdio.h>

#define FISHC "FishC.com"

int main(void)
{
        printf("I love %s\n", FISHC); // 打印字符串

        return 0;
}

预处理(Pre-Processing)



使用 -E 选项执行预处理命令并停下来,生成后缀为 .i 的预编译文件:
gcc -E test.c -o test.i
这时 GCC 将对各种预处理指令(#include、#define 和 #ifdef 这些以“#”开始的代码行)进行处理,并删除注释,添加行号以及文件名标识。

现在代码仍然是源代码文本形态,所以你可以使用 vi test.i 命令打开查看:

搜狗截图20161104023328.png

使用 G 命令跳转到末尾,看到注释被删除了,#define 宏定义也在这里进行了替换:

搜狗截图20161104023805.png


编译(Compiling)



编译就是将预处理完的文件,通过一系列的词法分析、语法分析、语义分析及优化后产生相应的汇编代码文件。

这一步使用 -S 选项来实现:
gcc -S test.i -o test.s
同样,使用 vi test.s 命令可以查看转换后的汇编代码:

搜狗截图20161104024646.png


汇编(Assembling)



汇编过程是将汇编代码转换为 CPU 认识的二进制文件,执行到这一步,这叫目标文件。

这一步使用 -c 选项来实现:
gcc -c test.s -o test.o
这时候你就无法使用 vi 来打开 test.o 文件了,因为是二进制编码,如果一定要使用文本模式打开的话,也只能是以乱码的形式呈现了:

搜狗截图20161104025119.png

查看二进制文件,正确的打开姿势是使用 xxd test.o 命令:

搜狗截图20161104025621.png


链接(Linking)



我们看到源代码中调用了 printf 函数,但并没有定义 printf 函数的实现过程,这是因为我们知道这是一个 stdio 的标准库函数。虽然在预处理(第一步)中,将 stdio.h 头文件导了进来,但那里边只有 printf 函数的声明而已:

搜狗截图20161104031544.png

从程序员的角度看,函数库实际上就是头文件(.h)和库文件(.so 或 .a)的结合,头文件中声明函数,库文件中定义函数的实现。所以在最后一步的链接,就是把相关的库文件给链接进来(也就是把 printf 的实现代码添加进来)。

注:Linux 下的库文件分为两大类,分别是:动态链接库(通常以 .so 结尾)和静态链接库(通常以 .a 结尾)

执行 gcc test.o -o test 命令,生成最终的可执行文件:

搜狗截图20161104032427.png


评分

参与人数 11荣誉 +53 鱼币 +43 贡献 +26 收起 理由
samhao + 3 + 3 + 2
hangfrieddays + 5 + 5 + 3 鱼C有你更精彩^_^
不懂安慰爱发呆 + 5
sijor + 5 + 5 + 3
XYcarpenter + 5 + 5 + 3
白昼 + 5 + 5 + 3 感谢楼主无私奉献!
zzr0910 + 5 + 5 + 3
a77367885 + 5 + 5 + 3 写的很清楚!
小脑斧 + 5
杜安 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-4 11:37:14 | 显示全部楼层
鱼币多少钱一个啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 4

使用道具 举报

发表于 2016-11-4 21:21:36 | 显示全部楼层
好文支持~~~~~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 1

使用道具 举报

发表于 2017-1-9 13:43:59 | 显示全部楼层
挺好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-27 00:28:04 | 显示全部楼层
比书本上的清楚些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-1 21:35:16 | 显示全部楼层
get it
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-1 19:44:51 | 显示全部楼层
怎么看鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-26 21:33:10 | 显示全部楼层
鱼币啊啊啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 17:44:12 | 显示全部楼层
666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-29 10:58:27 | 显示全部楼层
知识比论坛币重要..买了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-11 21:32:14 | 显示全部楼层
支持一下,加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 16:12:00 | 显示全部楼层
看看。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-19 15:11:15 | 显示全部楼层
厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-10 12:32:16 | 显示全部楼层
多谢楼主分享!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-17 11:49:14 | 显示全部楼层
支持小甲鱼!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-12 19:26:30 | 显示全部楼层
文章很好!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-6 17:12:52 | 显示全部楼层
棒棒的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-31 12:56:19 | 显示全部楼层
sbk100 发表于 2016-11-4 11:37
鱼币多少钱一个啊?

1块3个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 02:16:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-31 08:13:38 | 显示全部楼层
为小甲鱼点赞,强烈推荐小甲鱼课程能直接在大学课程里普及起来,还省了一批老师了 哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表