2021年10月底,博文视点的张春雨编辑联系到我,说Randall Hyde先生的《编程卓越之道(卷2):运用底层语言思想编写高级语言代码》出第2版了,问我有没有兴趣继续担任此书的译者。接到这个消息,我又惊又喜。是啊,时光飞逝,转眼间距离上一版中文版的出版已经过去了15年。这些年,信息技术日新月异:新的编程语言不断涌现;计算机编程正朝着多平台、网络化方向大步迈进,且物联网、人工智能、云技术大行其道;与此同时,手机移动端编程异军突起,大有取代桌面编程之势……软件的重要性越来越突出,对代码的质量要求也越来越高。
比起前辈程序员,我们这一代人要幸福得多—我们可以从几百种高级编程语言中挑选出自己顺手的那种语言来用,可以坐在显示器前面操作键盘,摆弄鼠标,使用各式先进的输入/输出设备。机器的处理和联网速度如此之快,硬盘如此之海量,文本编辑器的功能又是如此强大,集成开发环境如此方便,以至于我们只需用鼠标指指点点,偶尔敲几下键盘,就能得到一个像模像样的应用程序。大行其道的高级语言,一方面屏蔽了底层硬件的工作细节,降低了编程的难度,大大加快了程序的生成速度;另一方面也使得大多数新一代程序员不了解代码的底层实现,很容易忽略代码的效率问题。而汇编语言程序员由于以机器指令形式与硬件打交道,因此他们对指令的执行效率了解得很透彻。可是众所周知,汇编语言是一种底层语言,其效率虽高,但可读性差,编写、维护起来都很不容易,且没有可移植性,这让包括我在内的大多数程序员望而却步。怎样才能既利用高级语言开发周期短、维护便捷的优势,又不过分地丧失效率,逼近汇编语言程序的性能呢?这是每个专业程序员都应认真思考的问题。
如今计算机的资源如此丰富,让许多程序员觉得程序效率低一些也没什么大不了的。这种想法对于编写简单程序的非专业级程序员尚且说得过去,但实际上,商品级软件在功能越来越强的同时,也在变得越来越复杂,必须耗用更多的计算机资源才能运行。我们作为用户,经常会感到恼火,计算机性能已经够强了,为什么系统运行得更慢了呢?相信所有用过计算机或手机的人都会感同身受,计算机或手机有时莫名其妙地很卡,有时甚至会出现白屏死机、系统崩溃的情况。这要么是因软件运行了一大堆不必要的进程或功能所致;要么是因算法不够精良,耗用了太多的资源所致。作为一名专业程序员,我们应该明白,在当今的时代,具有编写可用程序的能力已经显得平平无奇,真正体现自身编程水平的是,能在资源受限的情况下编写卓越代码,即代码高效、可读性与可维护性强。这才能体现程序员的素养。因此,Randall Hyde先生的《编程卓越之道》系列图书可谓恰逢其时,它为广大程序员亟待解决的问题指明了解题思路,提供了完整的方法论。
《编程卓越之道》系列图书旨在讲解卓越编程的方法。具体到卷2,则是探讨怎样用高级语言(而非汇编语言)编程,即可得到高效率的机器代码。它将引导我们学习在确保实现设计目标的前提下,如何尽量少地占用系统资源,又能充分发挥代码性能的方法。该卷将使我们鱼与熊掌兼得,既让我们免受使用汇编语言编程之苦,免于牺牲程序的可读性、可维护性和可移植性,又能通过高级语言得到尽可能高效的机器码。其核心思想就是“Thinking Low-Level,Writing High-Level”,即在用高级语言编程的同时,思考其底层机器码会是怎样的。它不是一本入门级的编程教材,而是在我们用高级语言编程获得一些经验后,希望能再提高编程水平的用书。尽管其中的例子多数采用C/C++、Pascal、Swift等语言,汇编用的是HLA等汇编语言,但书中的理论超出了特定的编程语言和CPU架构,各种处理器平台的高级语言程序员都能从中汲取卓越编程的营养。本书还与时俱进,适时加入了ARM、Swift、64位架构等话题,对于程序员修炼卓越的编程能力极具指导价值。
本书作为中文版《编程卓越之道(卷2)》的第2版,翻译尽量承袭卷1的风格,并力图更上一层楼:改正原版书中已知的一些错误;为了方便读者查阅本书中提到的参考资料,我特意搜索了参考资料中一些原版图书在国内的引进版,并以“译者注”的形式标出了其中文版或影印版的书名、译者、出版社等信息。另外,若干术语的译法与本系列图书卷1有所区别,主要包括:padding byte(s)在卷1中译作“补齐字节”,本卷则译为“填充字节”;architecture在卷1中译作“体系结构”,本卷则主要译为“架构”;object在卷1中大都译作“对象”,尽管该单词确为此意,但考虑到这样容易让读者与“面向对象编程”中的对象混淆,因此除第12章讲述类时把object译作“对象”、另有一些地方译为目标(根据语境,会与其他词组合为目标码、目标文件……)外,其余位置均根据上下文语境改译为“数据”“变量”等。
本版原书和第1版一样,出现单词teach、you的地方比比皆是,在本书中,“you”尽量译作“我们”,而“teach”则改译为“研究、探讨、研讨、讨论、学习”等。另外,原文的叙述中用了大量括号,严重影响读者阅读的流畅性,因此在翻译过程中我设法去除了大部分括号,将括号内的文字融入正文。
对本书进行翻译的过程也是我学习的过程。在此期间,我对编译器的优化原理及编程时的注意事项有了更加理论化的认识。相信本书对渴望提高编程水平的程序员是很好的学习资料,且必然能让他们收获甚丰。
15年沧桑,在《编程卓越之道(卷2):运用底层语言思想编写高级语言代码》中译本出版后的这么多年,我从Visual C++编程转向了微软.NET的编程,专注于PC桌面应用程序的C#编程。由于第1版中译本的译者序留有我的个人邮箱,因此我经常收到热心读者探讨一些技术问题的邮件,每次我都非常认真地回复。能经常得到读者的反馈,让我知道了这本书和自己劳动的价值所在,并深感欣慰。这些年来,我个人的情况也发生了巨大变化—在儿子上小学那年婚姻破裂,我独自带着儿子,母亲赶来照顾我俩的起居。有了儿子和母亲的陪伴,我的生活既艰辛,又充满了乐趣。感谢上天眷顾,最近经同学介绍,我迎娶了新的爱妻,开启了新的生活。她既美丽,又温柔善良、贤惠达礼,还带来一个可爱的小仙女。儿子在我翻译第1版时刚呱呱坠地,如今已上高中,身高一米八五,成了我还得仰视的英俊小伙儿。家人听说我要翻译本书,都非常开心和支持,且积极参与。妻子刘坤玉在外企主管供应商质量管理,对系统和软件编程有相当深刻的理解,且有一定的造诣;儿子张益硕对计算机技术尤其是对编程充满了兴趣,从小就在我的熏陶下养成了较为严密的逻辑思维能力和高超的计算机操作能力。由于我平时的工作较忙,而图书翻译的时间紧、任务重,因此他们两人都主动请缨,分担了部分翻译工作。这样我就能从烦琐的字斟句酌中解脱出来,专注于整书翻译质量的把控。女儿李曼晴由于正上初三,面临中考,学习任务非常繁重,没有直接参与翻译工作,但她给了我们全家快乐轻松的氛围。除此之外,亲友王华敏、刘尚锁、赵钰霞、李爱义、刘胜崇、张璐、白荣献、宋韬、张永、王蕊、冯汉兴、方姝淯也参与了本书的部分翻译和审校工作,在此一并表示感谢!
博文视点的张春雨编辑策划了本书的引进与出版工作,正是他把这本书的翻译机会交给了我。李云静女士作为本书的文字编辑,对译稿提出了许多宝贵的建议,极大地提高了本书的翻译质量。在此向春雨老师和李云静女士表达我由衷的感谢和敬意。我还想借此机会向Randall Hyde先生致敬,这么多年还能孜孜不倦地撰写软件编程方面的专著,您的坚毅执着让我钦佩。
最后也是最重要的,我想感谢选择阅读本书的读者。市面上并不仅此一部讲述编程优化的著作,而且每个人的时间和精力都有限,您愿意研读本书,愿意为它投入时间和精力,表明了您对它的信任和期望。我希望本书能助您达成目标,一帆风顺!
本译作力争以通俗流畅的中文叙述方式再现原著的风采。由于译者水平有限,可能存在某些疏漏之处,请读者不吝赐教。您的意见、建议能够帮助我们改善本书的质量。也欢迎您发邮件到zhangfei97@163.com,与我交流本书的相关信息,再次感谢!
张菲
2022年6月