“程序员的自我修养”的前世今生
CPU体系结构、汇编、C语言(包括C++)和操作系统,永远都是编程大师们的护身法宝,就如同少林寺的《易筋经》,是最为上乘的武功;学会了《易筋经》,你将无所不能,任你创造武功;学会了编程“易筋经”,大师们可以任意开发操作系统、编译器,甚至是开发一种新的程序设计语言!
——佚名
这些问题看似很简单但实际上有很多值得深入挖掘的地方,比如第一个问题围绕着main函数执行前后可以延伸出一大堆问题:程序入口、运行库初始化、全局/静态对象构造析构、静态和动态链接时程序的初始化和装载等。我们把这些问题归结起来,发现主要是三个很大的而且连贯的主题,那就是“链接、装载和库”。
事实上,现在市面上和网络上能找到的计算机技术方面的书籍和资料中,什么都很齐全,唯独关于这三个主题的讨论十分稀缺,即使能找到一些也是犹如残缺的典籍,不仅不完整而且很多已经过时了。关于现在通用的Windows和Linux平台的链接、装载及PE/ELF文件的详细分析,实在很少见。这个领域中,最为完整、也最为权威的莫过于John R. Levine的《Linkers & Loaders》,这本书我也前前后后通读了好几遍,虽然它对链接和装载方面的描述较为完整,但是过于理论化,对于实际的系统机制描述则过于简略。
我始终认为对于一个问题比较好的描述方式,是由一个很小很简单的问题或示例入手,层层剥开深入挖掘,不仅探究每个机制“怎么做”,而且要理解它们“为什么这样做”,力求深入浅出、图文并茂,尽力把每一步细节都呈现给读者。这是我一贯的想法,也是我们在本书中努力试图达到的效果。
第一次有想写这样一本书的念头是在2006年底,当时我正在念研一,想起未来还有一年多漫长而又相对空闲的研究生生涯,觉得写一本这样的书大概是比较好的“消遣活动”。于是我第一时间想到了在微软研究院实习时的导师潘爱民老师,潘老师在写作技术书籍方面有很深的功底和丰富的经验。我把想法告诉潘老师以后,他十分支持,于是我又找到了当时刚好保送研究生、时间上也相对充裕的石凡,我们三个都对这个选题十分感兴趣,可谓一拍即合。
当时也没多想,以为写书大概也就跟BBS发帖连载差不多吧。一旦写起来才发现自己完全轻视了写书的工作量。书中的每一个章节、每一个小段、每一个例子甚至每一个用词有时候都要斟酌很久,生怕用得不恰当误导了读者。“误人子弟”这四个字罪名可不轻,大有推出午门斩首五遍以儆效尤之过。写书的时间的确很仓促,虽然我们都是在读研时写的,按理说相对于已经工作的作者来讲,已经是有很多闲余的时间了,但还是经常手忙脚乱。想到以前看书看到作者写的序里,经常使用“时间仓促,水平有限”的话,推想作者不过是出于谦虚不免要客套一下。现在轮到自己写序了,终于感觉到了这八个字的分量。即使到现在已近完稿,我们还是心里十分忐忑,因为还有不少地方的确写得不够完善。也听到了很多第一批读者的反馈意见,很多建议都正中这本书的软肋,我们也根据大家的意见又一次进行了修改,这已经是反反复复的第N次修订了。
这本书前前后后花了两年多的时间一直没有完稿,由于截稿时间快到了,我们才终于定稿,因为实在没有办法做到完美,只能向无限接近完美努力。最后,我们在“著”和“编著”之间犹豫了很久,想到本书凝聚了我们很多的心血,还是诚惶诚恐地写上了“著”字,权当给自己壮胆了。我们也相信,本书虽然没做到完美,但是它一定会给你带来一些你以前想看、想了解而又找不到的东西。或者以前在编程过程中困惑了你很久,但始终没有找到解释的问题,当在本书中终于找到答案且大呼“原来如此!”时,我们也就很欣慰了!
关于本书的书名笔者们也讨论了很久,征询过很多意见,最终还是决定用“程序员的自我修养”作为书名,将“链接、装载与库”作为副标题。书名源自于俄罗斯的演员斯坦尼斯拉夫斯基创作的《演员的自我修养》,作者为了写这本书前前后后修改了三十年之久,临终前才同意不再修改,拿去出版。使用这个书名一方面是本书的内容的确不是介绍一门新的编程语言或展示一些实用的编程技术,而是介绍程序运行背后的机制和由来,可以看作是程序员的一种“修养”;另一方面是向斯坦尼斯拉夫斯基致敬,向他对作品精益求精的精神致敬。
在本书的创作过程中,很多人对我们的支持和帮助难以言表。这里我要感谢博文视点的几位编辑何艳、方舟、刘铁锋和陈元玉等,他们为本书付出了很多心血;特别要感谢博文视点的周筠老师,这本书能够面世离不开她的支持和努力。另外也要感谢浙江大学的张晓龙博士,他为本书提出了很多建议,并且贡献了“DLL HELL”一节。
俞甲子
2009年2月于杭州