hello的实现过程

在学习语言一开始我们都学习了打印hello这个字母,

无非就是

#include<stdio.h>
int main()
{
	printf("hello");
	return 0;
}



然后调试执行,屏幕就会输出一个hello的字段。但是我们知道计算机在处理程序时,他是以二进制的形式处理着,那究竟是怎样的呢!!!

我们了解了这些,我们想了解这个hello.c我们称之为源程序是在电脑中怎样走的,也就是说从我们写hello.c到 屏幕上输出hello,都经历了些什么,这让我想起了高中时生物课本里的放射性元素示踪法。

好奇推动的着我去发掘。

于是知道了一个源文件到我们可以可行程序文件的几个步骤      

一个源文件我们就拿hello.c 举例,要经过预处理器的加工再经过编译器的加工再经过汇编器的加工以再经过链接器的加工。最终形成了可执行程序。这又不得不让我想起了高中生物酶的生成过程,核糖体,高尔基体,内质网,还有细胞膜等。

那我们就看看预处理器究竟做了些什么,它在生成可执行程序的过程中起了什么作用。

预处理阶段:预处理(cpp)根据字符#开头的命令,修改原始的C程序。比如我们的hello.c里的第一行的#include<stdio.h>命令告诉预处理读取系统文件stdio.h文件的内容,并把它插入程序文本的中,结果就得到另一个C程序,通常以.i作为文件的扩展名。

我就在linux下编写了一个hello.c我看我将预处理后的文件命名为hello.i 我们就看看hello.i文件中有些什么(因为内容太多,我就截取了一小部分)

                     

我们可以看出我们的#include<stdio.h>被换成了一系列的文件。

2.我们在看看编译阶段是怎样的。

编译阶段:编译器(ccl)Complier Collection:作用将文本文件的hello.i翻译成hello.s 它包括以一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切地描述一条低级机器语言指令。汇编语言是非常有用的,最接近机器语言的一种语言,还有不同种的高级语言的不同种编译器器生成的汇编一样。这么说吧,不过你是哪java还是c++还是C写的hello源程序,经过不同的C编译器或者Fortran编译器输出的文件都是一样的。

我们就看看hello.s生成的文件是怎样的。

          

3.汇编阶段。汇编器(as)Assembler将hello.s翻译成机器语言指令,也就是转换为二进制指令,计算机可以真正运行的指令,它是通过这样处理,它 把这些指令打包成可重定位目标程序 并将所有的结果保存在目标文件中hello.o。目标英文(object) 就是一个二进制文件,它的里面装的全是二进制,而不是字符。我们以二进制的形式可以看看hello.o

我是以16进制形式查看的。如果我们文本格式查看直接就是一篇乱码

                                                                                                                          4.链接阶段                                                                                                                                                                                                                 hello调用了printf函数(看hello.s图)。这个函数它是由C编译器提供标准库C库提供的。ptintf函数本身存在一个printf.o的目标文件中,它早已经预处理好了,而这个文件通过某种方式就合并在我们的hello.o文件中,链接器就是负责合并,相当与一个“胶”。结果生成hello文件,这个文件就是我们所说的可执行文件,可以加载到内存中,由系统执行。现在它放在磁盘中。


像不像一个“酶”的产生过程。

还有gcc的一些参数,见下表



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuaomo/article/details/53996401
个人分类: Linux
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

hello的实现过程

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭