读书笔记——《深入理解计算机系统》

HelloWorld其实并不简单

这周开始拜读这本在豆瓣被赐予9.8分的圣书,‘CMU’的计算机导论教材。好的文章内容都会让人眼前一新,豁然开朗的感觉。这书给我的就是这种感觉。刚刚看完第一章节,就从书中所引出的”Hello World“讲起吧

 

说起Hello World,对于任何一个programmer来说简直太熟悉不过了好吧,甚至在我求学期间还有一个朋友跟我吹嘘,学语言(指的是'计算机语言'),会写”Hello World”就基本上搞懂了这语言(((╯‵□′)╯︵┻━┻ 那还要程序员干个球啊)。当然这只是个玩笑话而已。不过,Hello World其实也不是那么简单的哟 = ̄ω ̄=

#include <stdio.h>
int main(){
    printf(“Hello Wrold”);
    return 0;
}

 

HelloWorld的出生:

计算机的运行其实就是所谓的0, 1操作,只是人们定义了0,1组合排列,给定其指定的意义(如图1),才造就了我们现在各种狂拽酷炫的程序。

ASCII表图1.ASCII表

HelloWorld也是一个程序,由程序员通过编辑器一个个的码上去的,其中就是由0,1组成的,然后就生成 了这样一个存储这些0,1文件的源程序(源文件),HelloWorld.c 文件。

生成好文件后,我们就需要运行它,这里的话是要将这个.c文件编译起来。那么问题来了,编译是什么呢?

 

HelloWorld的编译

编译,说简单点,就是把人类语言转成机器语言,让电脑能读懂,再执行你想要的操作(这里用的翻译官,就是编译器是gcc)。这里以.C文件的编译来走一下流程:

 图2. 编译流程

预处理阶段:在C语言的语法中,就是将#include所指向的一些文件,包那些写入到程序文本中。(我感觉有点像是c++的inline function),然后形成一个.i为后缀的文件;

编译阶段:这就是讲.i后缀的所有内容翻译成汇编语言,是一种低级语言,如图3所示。这是一个复杂度为O(n^2)的玩意,记得以前学计算机组成原理的时候是用MIPS来讲汇编,也是看的一愣一愣的。早也忘得七七八八了。

汇编语言图3.汇编语言

汇编阶段:接下来就是汇编器崭露头角的时候了,他会把.s汇编码转成机器指令,就是我们的cpu,计算机的大脑能看懂的东西。将结果以.o后缀文件名保存下来。

链接阶段:由于这个HelloWorld引用了标准C库 “stdio.h”,并调用了其中的方法, "printf"。这个类库一定编译好了这个 "printf"的方法并生成了.o文件了(就是经过了前三个阶段),然后我们需要调用它,就以链接的形式,将2者连接起来。从而这个程序就可以直接执行了。这个生成的文件就叫做可执行文件。可执行文件其实可以理解成你要打开一个应用的入口点。

 

 HelloWorld的执行:

到这一步的话可执行文件都出来,那么接下里的就是交由硬件去处理啦。这里主要想说的一点就是各个硬件之间的沟通(如图4)。

那条长长的Bus(es)就是连同硬件的玩意(总线),所有设备所产生的信号(0,1)都会通过总线到达目的地。

就比如我们现在HelloWorld。可能现在等待着输入端(常见的是鼠标或键盘)启动这个程序,然后发送信号,通过总线找到CPU,然后CPU再去硬盘(或者内存)找,找到后并处理,最后交由给显示屏显示出来。

图4

 


Ending:

关于HelloWorld的就写到这里吧。下次再继续续篇吧。

(其实上述的绝大多数内容都是来自书中的 ( ̄△ ̄;),水分很重,我就是匹划水狼,轻喷。(ㆀ˘・з・˘)。 另外,有哪儿不妥不对劲的欢迎指出。新手光环求罩求罩 ╭(′▽`)╭(′▽`)╯)

 

 

 

 

posted @ 2017-03-10 02:11  DennyZ  阅读(6177)  评论(1编辑  收藏  举报