The Translator's Words译者序
虽说计算机软件编程领域的技术发展日新月异,但我始终坚信所有程序开发技术的演进都万变不离其宗,其本质自始至终从未发生过改变。就编程语言来说,无论抽象到何种层次,使用何种风格,最终都会回归到本质——机器代码。而在我们常用的高级语言中,最贴近机器及操作系统底层的恐怕就是C语言了。
从某些方面讲,C语言堪称一门革命性的语言,它完美平衡了语言中机器相关与机器无关的部分,使得我们可以用机器无关的方式来处理程序逻辑,但必要时又可以直接控制底层硬件。C语言被广泛运用在操作系统开发中正是这一点的绝佳例证。同时,C语言的核心是非常简单的,一切细节都暴露在程序员面前,不会因为某种语法构造而导致隐藏的性能消耗。这使得C语言成为程序员在追求程序效率时的一个绝佳选择。C语言为了保证核心语言的简单(包括标准库的简单)与高效,没有将很多必要的现代语言特性融入标准中,比如C语言自身没有提供任何反射机制。这是一把双刃剑,也就是说,如果想在C语言中实现任何动态语言特性,必须使用和系统相关的特性,尤其是在动态库、共享库、插件等概念日益重要的今天。这给C程序员带来很多麻烦。虽说现在各种主流操作系统中都很好地支持动态库或共享库,也提供了相应接口,但是不同平台中的概念都会有细微差别,而且在具体技术细节上也会不同。这使得程序员在处理跨平台问题时会遇到很多问题。
C++的出现则让这一切变得更加错综复杂。
C++是一门多范式语言,在提供了面向对象和泛型编程的同时,为了保证效率,依然坚持不加入任何动态特性,或者提供某些非常有局限性的动态特性(比如RT T I),为了实现多态则采用了虚函数表这种折中方法。除了C++语法给编译器实现带来的复杂性之外,受到更大挑战的则是C++的链接器和装载器实现。符号名称修饰、全局对象管理、模板支持等各种特性使得链接器和装载器为了支持C++需要付出更多的努力。
同时,C++程序员处理动态库或共享库时也同样需要更加细心、耐心。很多时候,我们一不留意就会被链接器或者装载器的各种错误提示搅得心乱如麻,而查遍代码也找不出问题所在。编译器优化的不确定因素更加剧了这种情况。另外,现在的计算机教育中包括了程序设计语言课程、编译原理课程、操作系统课程,但并没有一门关于链接和装载的课程,链接和装载往往只是在这些课程中一带而过。或许这是由于链接和装载是非常纯粹的技术性话题,并不像其他课程那样需要传授各种理论。但这导致很多人对链接和装载一知半解,根本没有系统认识。
这些因素叠加起来的后果是,许多初级C/C++程序员遇到链接和装载问题时感到束手无策,根本不知问题出在何处。如果说Windows平台下的程序员得益于Visual Studio这种强大的IDE,在处理动态链接库时颇为方便,那么对Linux程序员来说,这便是一场噩梦。他们需要手动集成各种第三方库,有的是开源的,有的是非开源的,有的只提供了源代码,有的只提供了二进制文件,有的文档详尽,有的文档匮乏……他们永远不知道会遇到什么情况。即便是使用IDE的初级程序员,有时也不得不手动解决各种链接问题,但往往由于他们满足于IDE的良好封装,而忽略其底层编译链接的细节,因而在处理这些问题时更加盲目。在这种情况下,对链接和装载(其实也包括C/C++语言本身以及编译过程)认识并不深刻的那些程序员在日常工作中很容易在处理这类问题时“触礁”。由于缺乏系统认知,他们需要在一次又一次的失败实践中总结,这会走许多弯路。
由于我本人在大规模分布式实时系统研发方面具有一定的经验,因此许多人在C/C++开发中遇到问题时会咨询我,其中一部分问题出在C++语法上,而更多的问题则出在链接和装载上。本书在这些方面进行了翔实总结和讨论。与纯粹讲解理论与技术细节的书不同,本书一方面阐述基本的理论,另一方面则聚焦于C/C++使用静态库和动态库的一些注意事项,并举例说明如何解决实际的链接与装载问题。此外,本书尽量使用通俗易懂的语言来阐述这些知识,并补充了大量示例,避免让读者纠结于枯燥的理论。
相信你会和我一样,能在本书中发掘出大量有价值的资料,以便在日后的工作中游刃有余,并在处理C/C++相关问题的时候厘清思路,排除障碍。
在翻译本书的过程中,我不仅查阅了大量国内外的相关资料,还与英文原著作者进行了深入沟通,力求做到专业词汇准确权威,准确表达原著思想,即便个别地方采用意译的方式,也能无偏差地反映原著意境。在翻译过程中得到了很多人的帮助,这里一一感谢。感谢我的家人,他们是我学习和前进的动力。感谢鲁昌华教授,他在我的成长道路上给予了很大的支持和鼓励。感谢我在思科系统(中国)研发的同事们,他们在我的学习、工作中给予了很大帮助。感谢我的好友金柳颀,他在我翻译本书过程中与我通力合作。还要感谢机械工业出版社的编辑对我的信任。
现在我怀着期盼和忐忑的心情将这本译著呈献给大家,我渴望得到你的认可,更渴望和你成为朋友,如果你有任何问题或建议,请与我联系(samblg@me.com),让我们一起探讨,共同进步。
卢誉声