一。‘这是一个牛人的时代’,突然很想如是感叹。这几天在CSDN,JAVAEYE,ITPUB,CHINAUNIX等几个社区逛来逛去,可能是太过闲适,见博客就看,见微博就跟,这几日状态犹如闽南话‘碎碎念’,不过如‘无心插柳’般,也有所收获,听过一句话‘在计算机领域,所有书本都是用来查的’,之前看了《深入理解计算机系统》,对计算机底层算是有一个大概轮廓的了解,这几天把《程序员的自我修养》也给看完了,但谈不上消化,相对《深入理解计算机系统》,有一些知识点如‘静态链接’和‘动态链接’有更深入细致的描述,相比这本书的知识详尽深入带给我震撼的同时我更觉得难能可贵的是这本书的两个作者在作书时还是在校的研究生,确实感叹‘有些知识点你很难理解,不等于别人理解不了,甚至有人可以不费毫发之力优雅地实现’,我想他们也是不断地尝试,不断地阅读外文,不断地总结,才能有如此高的造诣。说到这,我还想提一个牛人‘刘未鹏’。
二。这一段时间也把‘刘未鹏’的大部分博文给看了一遍,不得不叹服他的思维方式,而跟让敬佩的是昨天晚上在看到他的资料时才知道他是1984年生人,算起来也不比我大几岁,说到这实感惭愧。我记得最清楚的是一篇关于‘暗时间’的博文,我能从中学到的是(1)每一个人所拥有的时间都是一样的,无非是一星期7X24小时,一年365天,而你要所要做的是如何在一些琐碎的事情中挣脱出来(2)大部分人在各个方面都不算很突出,而当你可以在其中一个方面有很深的造诣时,你的核心竞争力就很自然的出现了(3)在某一段时间尽量专注于一件事情,这就犹如计算机中的进程上下切换一样,往往从一件事情切换到另一件事情,在从另外一件事情切换回来会需要更多的时间进入先前的状态,这就是一种专注精神,而被打扰后重新进入状态的快慢也是另外一种能力,另外抗干扰则又是一个必备的能力,总结起来就是:专注,进入状态,抗干扰。
另外,有一点我不太赞同的就是似乎‘刘未鹏’给人感觉功利性太强,做任何事情都讲究性价比,甚至于上个厕所都得抱着本书,这种生活或许太过认真太过谨慎,如之前一位朋友所说‘一杯热咖啡,一曲慢歌,电脑面前敲敲文字’,也算是一种惬意。不过,罗永浩曾经说‘唯有偏执狂才能生存’,很多牛人很多时候在做一件事情已经达到了疯狂甚至癫狂的地步,如‘刘未鹏’,他涉足了心理学,机器学习与人工智能,数学等诸多领域,确实收获颇丰,我想牺牲的其他玩乐时间也不少吧,不过也许他以研究为乐,就像‘子非鱼 ,安知鱼之乐’,也许你又会说‘子非吾,安知吾不知鱼之乐’。。。。。
三。回到正题。因为自己功力尚浅,所以可能对于本书也只是一个浅认识,也出于时间关系,只是略微了解一下,尽量做到‘莫到用时再读书’,另外也应了这句话‘经典的书籍都是C或汇编进行表述的’,所以对于本书很多细节知识点都是跳着看,自己只是从大的脉络进行把握。
四。在这本书看篇就是‘Any problem in computer science can be solved by another layer of indirection.’,这句话似乎道出了很多计算机领域的一个相通处-------‘分层思想’,确实如此,无论是在网络协议体系,如TCP/IP网络协议的多层结构,还是Java Web开发中的MVC思想以及Linux操作系统中的内核模式与用户模式,几乎任何一个计算机的知识领域中,都存在‘层’的概念,其目的无非是使系统设计可以模块化,以使问题可以分块解决及软件可以更好的进行维护升级 。
五。本书以对实现打印‘HelloWorld’的C语言的简单程序进行一系列的发问来引出一系列的问题。当点击‘ctrl+F5’,控制台会打印出‘HelloWorld’,这从中发生了什么?
(1)预处理Prepressing
(2)编译Compilation
(3)汇编Assembly
(4)链接Linking
其中编译和链接是本书的核心
编译分为六步,对于具体的内容可以参考《编译原理》
(1)扫描
(2)语法分析
(3)语义分析
(4)源代码优化
(5)代码生成
(6)目标代码优化
链接就是把生成的各个目标文件的相似段进行合并,而合并之后还有一些细节,如地址和空间分配,符号解析,对于地址分配,这里指的是虚拟地址空间的分配,对于虚拟地址空间分配又会涉及到操作系统,即内存管理,这个问题在操作系统中也是一个非常经典的问题,内存管理源于多个程序同时运行内存造成不够用或者一个太大的程序运行造成内存不够用,有两种方法可以解决:一是覆盖装入,现在已经很少用到了,不过在有些嵌入式开发还是存在,其方法就是程序员自身调配内存,比如对于内存块X,可能刚开始是程序A使用,当A不使用时马上使用,接着是B使用,依次类推,所以这无非是一种用时间换空间的方法;二是页映射,即需要哪个模块,则从磁盘调出来,不需要的时候即放在磁盘,这种方法得益于MMU的出现,一方面使内存得益最大化利用,另一方面使得内存管理复杂化,页映射即是现代操作系统常用的内存管理,另外还有分段式,段页式,而其中的缺页调度算法则又是另外一个话题了。
上面提到的链接属于静态链接,还有一个概念是‘动态链接’,其思想很简单,就是几个模块共用一个高度抽象化的功能模块,即某一个模块静态链接时不把这个功能模块链接进来,而是在运行时动态的链接进来,而其他的模块在运行时需要的话也是直接链接内存的这个副本就可以了,所以一方面减小了内存的耗费,比如如果有一千个程序都用到了printf,则这一千个程序都一个printf的副本,算起来也是一个不小的浪费,而另外一方面,万一需要对这个功能模块进行修改升级,则只要改一处代码就行,而不用牵一发而动全身,所以应该说‘动态链接’是一个很不错的思想,而现今的Windows操作系统也是大部分基于DLL的,有的缺点无非是实现难度大,比如在链接时的虚拟地址动态分配等等。。。
六。再谈谈其他的,什么是目标文件?
目标文件是在编译连接过程的一种中间文件。其保存在磁盘中,其中在Windos中即为PE文件格式,而在Linux上则为ELF文件格式,这种格式其实就是一个文件的全部信息的一个结构体,其中包括有很多段,段包括:代码,数据及其他信息,如图:
所以说,目标文件就是一种‘存储着程序装载入内存的一些准备信息’的文件,从操作系统的进程的角度来看目标文件装入的过程,如图:
七。写到这,突然觉得,很多东西很自认为已经搞懂了,但真当要你表述出来时,却又感觉无法真切的把它描述清楚,就如同今天写这篇读后感,本以为可以很顺畅的写下来,却不知,中途一度打开原书进行参考并截图,所以说也感到写博文确实是一种很好的方法以检验自己是否真的懂得了而不是想当然的认为自己已经掌握了!