由读《深入理解计算机系统》一书引发对程序本质的探讨以及自己的一些理解

来源:互联网 发布:金山强力卸载软件 编辑:程序博客网 时间:2024/05/21 15:38

        首先不得不说《深入理解计算机系统》着的是一本很不错的书,有一种强烈推荐给咱们计算机科学学院的同学把它作为程序设计及计算机科学入门书籍的冲动,当然,话说我也只是一个学生的角色,还是要“在其位,谋其政”啊。但是强烈推荐每个学习计算机专业的同学看下这本书的愿望还是有的。就像一条书评说的“计算机专业的同学越早接触这本书越好”,自认为这本书是迄今为止对我影响最深的一本书,是我对计算机系统不只是编程有了一个全面深入的理解,看到了计算机的本质。现在觉得学东西还是要看清本质再学,否则知识学习表面东西就像是只学招式而不练内功一样,不会有真正地提高的。

        从这学期开始一段时间后就突发奇想,相对程序和计算机有更深入的了解,不想只是停留在会写代码,会调用别人程序的基础上,对写好代码后编译器、CPU、操作系统做的事很好奇,很想去知道他们是怎么样运行一个程序的,怎么样把一个个字母,数字,值,语句,函数,类,组织到一起,然后运行出我们行要的结果的。类似于这样的问题让我不安,因为有问题却没有学习过相关的内容,感觉无从下手。我想如果我们学习过《编译原理》这本科应该不会这么迷惑了吧。于是开始在网上大量下载资料(CSDN上用免积分下载器狂下),只要是有关程序的设计底层点的就下载(包括硬盘结构,因为当时对硬盘上如何存数据也很着迷),包括计算机构造,计算机组成,冯诺依曼结构等等的相关资料:                                                                                                

          这期间淘到两本好书(自认为):《操作系统:精髓与设计原理中文第六版》和深入理解计算机系统(原书第2.)》。尤其是第二本,至于第一本我是这样想的:引用别人的理解“操作系统就是覆盖在计算机硬件上的一层软件”,计算机由硬件和软件组成,而操作系统是最大的软件,所以我认为掌握好,学好操作系统就可以最大程度的直接操作硬件了,所以想深入了解下OS。但是开始读读二本(《深入理解计算机系统(原书第2.)》时,才发现这本书才是我寻寻觅觅已久的“圣经”。于是爱不释手,每天早上开始巴在演示器上认真的拜读……终于忍不住了,PDF的版本看的眼睛疼,在京东上搜索了一下,有这本书就果断买下来了(之前去图书馆借过,但是此书不知道被那位同仁借去拜读忘了归还了……)。

         花了了几个星期,大概略读了一遍(个别难点第一次读时放过,第四六章节放过,因为考虑到要找实习了时间紧张……),感觉心中的一些疑惑解决了一半。但还是不够透彻,又过了两星期,决定再读一遍,不然干什么呢?学计算机的连计算机系统都没有理解学别的不都是学点乱七八糟的招式嘛,还自欺欺人(纯属个人观点)。于是又开始拉克第二编的阅读与理解。到现在已经读完第一部分和第二部分(第一张至第九章),第三部分(第十章)刚开始。

       书读到此书,已经颇有几分像写点东西和大家分享交流的感觉了,

       之前百度过几次“编程的本质”,有几篇文章写得不错,还有一本STL之父写的《编程原本》(汉语版),观点不尽相同,但都有一些共同点。《编程原本》一直阐述的是:数学对于编程视觉好的东西,理论对于实际是绝好的东西。其他文章强调的是把一个实际问题转换为一个程序的思想的重要性。

       通过自己之前一些调试(VC6下看汇编语言,很多movmov那的)的体验和读书的理解,程序就是在倒腾数据,折腾寄存器,从一个寄存器到另一个寄存器,从一个寄存器到另一个存储器,比如:把数据从内存倒腾到显卡就能显示各种画面文字了,把数据从客户电脑的内存上倒腾到网卡上,再从网卡上倒腾到服务器的网卡上,再从服务器网卡上倒腾到服务器内存上就能实现Web服务了。其他的图像,文字,音频,视频等的,都是先把他们转化成数字,然后倒腾来倒腾去的就成了各种图像处理,文字处理,音、视频处理软件了。但是了解了本质也能说就完全掌握了,因为关键就在于怎么倒腾上,就像你可以说人的本质就是“吃喝拉撒”,但是你能说人的作用就只有这些吗?

      就像《道德经》里说的,宇宙的本源是“无”,但是天地创造了万物,就是“有”。本质是“无”而“有”发挥了作用。

      一个完整的应用或者程序就像是这样的过程:

 

另一种理解:

     也有人说:“个人以为,从编程这一职业诞生开始一直至今,其本质就没有改变过。对概念的抽象对逻辑的描述始终都是编程过程中最核心的东西。”(引自http://topic.csdn.net/u/20120601/11/0639e82e-6183-4b7f-9ab1-090dd92ac13d.html?r=78767350 )。以及“程序设计的实质就是编制计算机加工数据的步骤!”的理解(引自http://bbs.chinaunix.net/thread-1029967-2-1.html )

         但为什么说理解本质了不能说是完全展购物了呢?因为“谁不知道程序是调用这个函数那个方法?问题是,你知道XX情况下可以调用哪个、适合调用哪个吗?你只有所谓的基础,你不知道。你可能将某个程序的流程图画得相当准确,处理过程说得头头是道,但你能写出具体的代码,正确编译出你描述的程序吗?你不能。”“让你参与某个项目,你一看,这工具不会,那函数没见过,你又看不上这些东西,那企业要你何用?企业又不是福利院。”(引自百度知道:http://zhidao.baidu.com/question/335060475.html可以理解为:“本质”发挥“作用”,本质永恒不变,但是作用却是千变万化的。所以,理解了程序本质只是说你也已在一个正确的指导思想下学习了,而且是学习更多的知识,我觉得学无止境永远是不断进步的途径,没有什么捷径,掌握的越多,你会的技术(包括编程语言)越多,你解决问题的方法就越多,引用一句经典“如果你手里只有锤子,那你看的所有问题都是钉子”。
               现在回头一想,了结了程序的本质,问题就来了:这倒腾来倒腾去干啥呀!??到底应该学点什么呢??
开复老师的这篇文章有很好的建议:
http://blog.csdn.net/l109383670/article/details/5273340
http://wenku.baidu.com/view/4fdf60956bec0975f465e29b.html
 
另还有一篇CSDN上的文章也不错:

http://blog.csdn.net/ex_net/article/details/7583396大学生如何让自己强大起来(计算机、电子方向)

(其实可以看出,大部分强调的事软实力,对基础的熟练掌握,对实践的体会,对细节的执着还有对计算机的深入理解)
其他相关文章推荐:
编程本质相关:
http://wenku.baidu.com/view/74e4d9482e3f5727a5e962d2.html
http://blog.csdn.net/a379039233/article/details/6929772
http://www.cnblogs.com/pm_2004/archive/2004/08/02/28654.html
http://topic.csdn.net/u/20110326/21/fa8e80ff-16a8-42af-9db9-d511cbc974a0.html
http://topic.csdn.net/u/20120601/11/0639e82e-6183-4b7f-9ab1-090dd92ac13d.html
http://www.aqee.net/the-singular-secret-of-the-rockstar-programmer/
 
关于计算机专业如何学习相关:
http://blog.csdn.net/fenghaibo00/article/details/6706869
http://hi.baidu.com/shfr1101/item/6336370ed7e4378802ce1b86
http://hi.baidu.com/%CF%E2%D3%D0%BD%F0%B1%DF%B5%C4%D4%C6/blog/item/6fde81a940ed2cb9cb130c9e.html

http://news.cnblogs.com/n/91108/                   给想当程序员的大二学生的建议

http://www.aqee.net/advice-from-an-old-programmer/              《一个老程序员的建议》http://blog.csdn.net/bing63983627/article/details/6595002              IT学生解惑真经》

 
希望对大家得学习起到一定的帮助作用,也就是实现这些文字的一点价值了。