本文旨在讲解一段源程序如何翻译成机器所能识别的二进制的命令的,希望通过本文,能使读者对一段程序的翻译过程有进一步的认识!
这里首先要介绍的是一段程序从编写完成到执行需要经过以下几个步骤!
1.预处理
首先讲到的是预处理!预处理在整段翻译的过程中主要有着以下几种功能!
1.1头文件的展开
1.2宏替换
1.3去掉注释
1.4条件编译
下面我将通过简单的代码进行对预处理阶段所做的事情做出证明!
下图为linux环境下的代码,有兴趣的小伙伴也可以自己下来试试看看!
通过本图,小伙伴们可以发现原来注释的代码在经过预处理之后就没有了,并且在进行编译之后由以前的十几行代码直接增加到了八百多行!这是因为预处理将头文件展开了,所以代码行数也自然就增加了!还有最后打印的Max的时候,经过预处理之后被替换掉了!!!还有一点条件编译没有展现出来,那么通过以下代码就可以来看出预处理也对条件编译做出了相应的处理!
通过以上代码我们可以看出,当进行预处理的时候,编译器也会对条件编译进行优化!对于条件编译,它实现了动态切割代码的功能!正如我们日常使用的好多软件,都分为会员版与免费普通版,那么对于程序员来说,如果维护这几种不同版本
的代码,那么代价肯定是非常大的!所以条件编译就起到了作用!仅仅就需要维护一份代码就可以满足需求!
至此,预处理阶段的工作简单介绍到这里!
2.编译
现在就来介绍编译的功能!
编译的功能就是将源代码转化为汇编语言的代码!
通过下图我们可以看出编译阶段所做的事情!
虽然我们可能没有学习过汇编代码,但是通过右图的风格,我们不难看出,编译阶段将c代码转化为了汇编代码!
编译的作用就是将c代码转化为了汇编代码!
3.汇编
汇编的作用是将汇编代码转化为可重定位的二进制文件!
下图为可重定位的概念!
通过下图我们可以看出这里汇编的作用确实是将汇编代码转化为了二进制文件!
可以看出经过汇编之后,汇编代码就变成了二进制的文件!只能通过二进制的格式进行读取!
4.链接
最后要将的链接就是结合以上过程,最终形成我们日常看见的.exe后缀文件!
至此,通过上文,已经将程序的翻译过程简单了介绍!
下面我来为大家为大家补充如何使用指令来进行证明这些过程!
//
gcc -E test.c -o code.i;
gcc -S code.i -o code.s ;
gcc -c code.s -o code.o;
下面来介绍其中代码的含义!
其中 -E 操作,是仅仅进行预处理操作!当预处理结束之后,就停止, -o code.i 的作用是生成一个.i后缀的文件!其中.i 通常是经过预处理之后的后缀标志!
-S 操作是进行编译操作! 此时可以直接使用code.i文件进行编译!当然使用test.c 文件也是没有问题!
-c 操作是进行汇编操作!生成目标文件!
至此,本文对程序的翻译过程介绍结束,希望读者能有所收获!也欢迎大家评论区多多讨论!