XY

没有任何借口
posts - 9, comments - 31, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

                                                                                       程序是如何运行的

作为一个程序员,已不知编了多少行代码。但若问我程序是如何在计算机中运行的,我怕只有张口结舌。书中第一章就给了我们相关的答案。

首先,看如下最简单的C语言Helloword的代码

1#include <stdio.h>
2
3int main()
4{
5   printf("hello, world\n");
6}
上面的代码我们保存在helloworld.c文件中。其本质实际上是由0、1的比特(位)序列构成的。8位为一个字节。每个字节对应某个文本字符。不少系统用ASCII来表示文本字符。实际是由一个唯一的同字节大小的整数值来表示每个字符。下面给出helloworld.c的ASCII表示。
#      i         n        c       l       u       d      e     <sp>   <     s     t        d        i       o      .
35   105    110    99    108  117  100   101   32     60  115  116   100   105  111  46
h       >      \n       \n      i        n      t     <sp>   m      a      i       n       (       )      \n     {
104  62     10     10     105  110  116   32    109    97   105  110   40    41   10   123
\n     <sp> <sp> <sp> <sp>   p      r      i       n        t       f      (       "      h       e       l
10    32     32     32     32    112  114  105  110    116  102  40    34   104   101   108
l       o       ,        <sp>  w      o      r       l      d        \       n       "       )       ;       \n      }
108 111    44     32     119  111  114  108  100    92    110  34    41   59      10     125
以此类推,在计算机系统中,任何介质中的数据都是比特序列。把他们区分成不同的数据对象,是通过数据对象的上下文来确定的。

程序编译
程序的编译过程如下图所示,分为预处理、编译、汇编、链接等几个阶段。

预处理:预处理相当于根据预处理命令组装成新的C程序,不过常以i为扩展名。
编译:    将得到的i文件翻译成汇编代码。s文件。
汇编:    将汇编文件翻译成机器指令,并打包成可重定位目标程序的O文件。该文件是二进制文件,字节编码是机器指令。
链接:    将引用的其他O文件并入到我们程序所在的o文件中,处理得到最终的可执行文件。

硬件组成:
从下图中看出一个典型的系统由总线、Cpu、I/O设备、主存等构成。

CPU: Central Processing Unit,  ALU: Arithmetic/Logic Unit,  PC: Program counter,  USB: Universal Serial Bus.

程序执行
我们已经讨论了可执行文件产生的过程。接下来讨论哈可执行文件执行的过程。从上面途中的彩色线条可以清晰的看到这个过程,我们简单的把它分为6步。
1.shell程序执行指令,等待用户输入,这里我们输入“hello”。
2.shell程序将字符逐一读到寄存器中
3.再从寄存器取出放到主存中
4.当我们敲入回车时,shell程序得知输入结束,将hello目标文件的代码和数据拷贝到主存,从而加载hello文件数据包括最终被输出的字符串“hello,world\n”.利用了DMA访问技术,数据可不经CPU直接到主存
5.执行主程序中的机器语言指令,将“hello,world\n”串的字节从主存拷贝到寄存器堆。
6.从寄存器中把文件拷贝到显示设备。

Feedback

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2008-07-05 17:53 by passerby
顶。
是本好书,只是现在还没时间去看。

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2008-07-05 23:33 by 访客
你这个基本上就是摘抄的

前3章看着比较吃不消

特别是第三章 y86架构的研究与实现

剩下的直到unix io 网络编程 多线程之前 是本书的精华部分 值得通读

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2008-07-05 23:51 by 路缘
@访客
第一章内容很少,也没有其他自己的体会。就把自己认为主要的东西罗列一下。
第二章信息表示和处理,以及第三章C的汇编表示,就肯定会用自己的理解来描述。因为我在阅读时,确实很多地方都是反复阅读,才明白了其中的道理。
后面我还会继续相关的随笔,会加入自己是如何从不明白到明白这个过程的描述。

其次感觉这本书习题也编得很好,看书看不明白,把题做了过后,感觉就明白了。

可能我以后若是归纳总结书上的内容,注明读书笔记可能会好些。因为就算是写理解,也是来源书上的观点。

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2008-07-06 11:19 by ZelluX
@访客
y86是第四章
这本书是我们专业课的教材,上一年,除了第九章都讲了,收获很大

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2008-07-08 22:48 by 刘远清
这本书确实很牛逼!那天看了你的文章就去网上找了电子书来看,刚看完了一章,讲的够清楚,值得一看!

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2008-07-10 23:17 by 梦在天涯
看了你的第一张就知道是好书了,谢谢,以前没有看过啊,要是有的化,给大家个地址,大家保证更高兴啊!

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2008-07-10 23:23 by 梦在天涯
能不能说下,书的全名,说是chinapub的连接!谢谢先!

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2008-07-11 12:55 by 路缘
@梦在天涯
我还以为大家都知道这本书呢。全名就是我写的啊,
英文名是《Computer Systems A Programmer’s Perspective》
不过电子版我只有英文版的。这本书觉得值得买本纸版的来珍藏。
本来说共享个电子版的链接,但老是出问题上传不上去。很好找的。
http://www.programsalon.com/ 像这个网站上就有。

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2008-07-14 12:19 by larryliuqing
网上有啊!上次我看了这篇文章才到网上下的!

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2009-02-26 09:32 by 戈多
楼主有没有这本书的家庭作业答案啊,我小菜一个,很多题目做的是似是而非。

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2009-10-06 01:33 by dads
一般不看这样的书,细细松松的,还是把大学里的那些书看好吧,
比如数字电路,计算机原理,编译原理
这些充分理解了再来看这篇文章,那简直是高屋建瓴;

# re: 深入理解计算机系统1_程序是如何运行的  回复  更多评论   

2011-09-14 09:24 by 图—图—
抄袭

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理