hello的实现过程

原创 2017年01月03日 17:34:29

在学习语言一开始我们都学习了打印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的一些参数,见下表



版权声明:本文为博主原创文章,未经博主允许不得转载。

使用wireshark观察SSL/TLS握手过程--双向认证/单向认证

SSL/TLS握手过程实际上就是通信双方协商交换一个用于对称加密的密钥的过程。 这个过程实际上产生三个随机数:client random, server random, pre-master secr...
  • fw0124
  • fw0124
  • 2014年11月11日 17:04
  • 36479

Hello World!的编译过程(C语言)

几乎所有学C语言编程的同学第一个接触的程序都是Hello World!。但是它是怎么由c文件转换为可执行文件的呢? 源文件(helloworld.c)如下:#include int main() {...
  • LuckySou
  • LuckySou
  • 2016年12月26日 20:58
  • 421

SSL通信过程分析

SSL通信过程分析 一、SSL建立握手连接目的 1.身份的验证,client与server确认对方是它相连接的,而不是第三方冒充的,通过证书实现。 2.client与server交换session k...
  • hpp205
  • hpp205
  • 2015年10月09日 09:37
  • 826

linux设备驱动第二篇:一个简单hello world驱动如何实现

上一篇介绍了linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序。而这个驱动的唯一功能就是输出h...
  • lihui130135
  • lihui130135
  • 2015年03月29日 17:10
  • 2069

Java HelloWorld实现及Java运行原理介绍

首先我们新建一个后缀是java的HelloWorld文件; 然后编写HelloWorld代码;(代码暂时不需要全部理解,后面会详细讲到) 上代码: ...
  • djfgduyhgfu
  • djfgduyhgfu
  • 2016年10月17日 10:38
  • 2023

【iOS开发】在界面上显示“HELLO”

大家学习iOS开发,都想有朝一日看到自己的第一个界面程序。本文介绍了在界面上显示“HELLO”的整个开发过程,可供iOS初学者参考。...
  • zhouzxi
  • zhouzxi
  • 2016年07月23日 17:02
  • 1858

24种编程语言的Hello World程序

这篇文章主要介绍了 24 种编程语言的 Hello World 程序,包括熟知的 Java、C 语言、C++、C#、Ruby、Python、PHP 等编程语言,需要的朋友可以参考下。 Hello...
  • yilovexing
  • yilovexing
  • 2016年11月21日 10:14
  • 2661

OSPF建立邻居、邻接关系

Ospf中路由器之间存在两种连接关系:邻居关系和邻接关系。本博文将详细介绍这2种关系建立及工作原理。 如果两台路由器之间共享一条公共数据链路(两台路由器中间没有其它路由器,或者两台路由器之间存在...
  • yiluyangguang1234
  • yiluyangguang1234
  • 2016年01月23日 23:25
  • 2468

手动编译链接一个HelloWorld

集成开发环境让我们对程序的调试编译链接都变得如何轻松.作为一名极客怎会止步于这种表象?你或许听说过”编译”“链接”这种最熟悉的生僻词.编译和链接到底是怎么完成的?今天我们来动手链接一个自己的程序:1寻...
  • dalerkd
  • dalerkd
  • 2015年06月01日 21:35
  • 645

JavaScript脚本语言介绍并实现第一个Hello World程序

1.JavaScript是Web页面中的一种脚本编程语言,也是一种通用的、跨平台的、基于对象和事件驱动并具有安全性的脚本语言,具有与Java类似的语法。它不需要进行编译,而是 直接嵌入在HTML页面中...
  • u012561176
  • u012561176
  • 2015年03月06日 12:38
  • 6595
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hello的实现过程
举报原因:
原因补充:

(最多只允许输入30个字)