[Unix下C/C++开发] unix编程书籍推荐

Unix/Linux/BSD系统 

相对于Windows,在UNIX下编程获得相关文档要方便很多。由于历史原因,能够看到的教材基本上都经受了考验,几乎个个都是经典,不象Win下有鱼龙混杂泥沙俱下的现象。 
三本可以替换的入门书,任选其一即可: 
Bruce Molay的《Understanding Unix/Linux Programming A Guide to Theory and Practice》(Unix/Linux编程实践教程)应该是你的第一本书。一句话,大家都说好。 
Kay A.Robbins(美), Steve Robbin(美)的《UNIX Systems Programming》(UNIX系统编程)。他是一本介绍UNIX系统的工作原理以及学习UNIX系统程序编写方法的经典教材,一本程序员不可多得的案头必备参考书。 
Neil Matthew(英),Richard Stones的《Beginning Linux Programming》(Linux程序设计)。本书是Linux程序设计领域的经典名著,以筒单易懂、内容全面和示例丰富而受到广泛好评。 

随后,以下几本书排名不分先后,分属不同方面,想深入的伙计建议都看: 
W.Richard Stevens, Stephen A.Rago的《Advanced Programming in the UNIX Environment》(UNIX环境高级编程)
W.Richard Stevens,Bill Fenner, Andrew M. Rudoff,Richard W.Stevens的《Unix Network Programming》(UNIX网络编程),注意这套书是三卷本。 
宋宝华 的《Linux设备驱动开发详解》。一本介绍Linux设备驱动开发理论、框架与实例的书,是作者多年Linux设备驱动开发从业经验的总结。能够在众多海外强手的教材阵中脱颖而出,足见作者的实力。 
Robert Love 的《Linux Kernel Development》(Linux内核设计与实现)。内核相关概念及如何使用内核介绍的非常到位,全书偏应用,主要强调如何用,以及为了用而需要了解的内核实现。 
Daniel P. Bovet和Marco Cesati 的《Understanding the Linux Kernel》(深入理解Linux内核),分析内核代码几乎无出其右者。 
John Lions(澳)的《Lion'Cornmentary on UNIX 6th Edition With Source Code》(莱昂氏UNIX源代码分析) 。本书由上下两篇组成。上篇为UNIX版本6的源代码,下篇是莱昂先生对UNIX操作系统版本6源代码的详细分析。本书语言简洁透彻,曾作为未公开出版物 在黑客界广泛流传了二十多年。现在MIT的操作系统的研究生课程里面依然采用的是这本书,unixV6的代码量小,门槛比动辄数百万行的linux更适合 初学者。绝对是神作,很难买到这本书,所以如果遇上要毫不犹豫弄到手。 

和MSDN类似,Unix/Linux/BSD下也有一个文档大全似的东西,而且只要一个命令就能打开他。他就是所有Unix系统都会自带的man page,完整安装的情况下,他已经存在系统中,更重要的是,他是免费的,相对照的MSDN宇宙版至少需要几百美元。 
最后,在UNIX下无论如何都必须翻阅的教材是由公认的Unix编程大师、开源运动领袖人物之一Eric S. Raymond亲自撰写的《The Art of Unix Programming 》(UNIX 编程艺术),这本书著名到他有个专用缩写: TAOUP。他不是在技术层面讨论问题,而是从哲学角度来讨论UNIX编程,从而把编程上升到了艺术的高度。 

数据结构和算法 

数据结构就是在机器里组织数据的方法,而算法就是解决某个问题的总思路。数据结构和算法有两个层次,一开始的时候,它是语言相关的,尤其是对于数据结构来说,因此C和C++的教材要分开。后来在算法的层面,他就只是一种思想,也就和语言无关了。 
清华教授严蔚敏和广东工业大学教授吴伟民的《数据结构(C语言版)》,这是清华计算机系的标准教材,还有什么要补充的么。 
清华教授殷人昆的《数据结构(用面向对象方法与C++描述)》,也是清华的教材。 
Mark Allen Weiss的《Data Structures and Algorithm Analysis in C》(数据结构与算法分析--C语言描述)和《Data Structures and Algorithm Analysis in C++》(数据结构与算法分析--C++语言描述)。数据结构和算法分析的经典教材。 

之后就可以看深入一点的东西了: 
王晓东的《算法设计与分析》。国内本科教材,书写得不错。 
M.H.Alsuwaiyel(沙特)的 《Algorithms Design Techniques and Analysis》(算法设计技巧与分析)。本书结构简明,内容丰富,适合于作为计算机学科以及相关学科算法课程的教材和参考书,尤其适宜于学过数据结构 和离散数学课程之后的算法课教材。同时也可作为从事算法研究的一本好的入门书。 
Thomas H.Cormen, Charles E.Leiserson的《Introduction to Algorithms》(算法导论)。这是麻省理工学院计算机系的算法教材,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考书。 

经典中的经典,每一个想要掌握算法精髓的人都必须看的书,算法书中的圣经,他就是: 
大师中的大师 Donald E.Knuth的《Art of Computer Programming》(计算机程序设计艺术)。 
Donald E. Knuth(唐纳德 E. 克努特,中文名高德纳)是算法和程序设计技术的先驱者、计算机排版系统TEX和METAFONT的发明者,他因这些成就以及大量富于创造力和具有深远影响 的著作(19部书,160篇论文)而誉满全球。这么说吧,目前你所能听说过或者还活着的那些计算机软件大牛,没有哪个不直接或间接的受过Knuth的教 导。他强悍的程度只用一件小事就可以说明,在撰写这套《计算机程序设计艺术》的过程中,由于感到原有排版系统的不足,他特地重新制作了一套新的计算机排版 系统,这套称为TEX的东西目前已经是出版界的标准系统。 
《计算机程序设计艺术》这套关于算法分析的多卷论著已经长期被公认为经典计算机科学的定义性描述。迄今已出版的完整的三卷已经组成了程序设计理论和实践的 惟一的珍贵资源,无数读者都赞扬Knuth的著作对个人的深远影响,科学家们为他的分析的美丽和优雅所惊叹,而从事实践的程序员已经成功地将他的“菜谱 式”的解应用到日常问题上,所有人都由于Knuth在书中表现出的博学、清晰、精确和高度幽默而对他无比敬仰。微软的盖茨曾经说:如果你能完成他书中 50%的习题,请尽管给他寄简历。(事实上,用盖茨来衬托Knuth简直是对Knuth先生的侮辱) 

此书原定计划为七卷。目前已出版四卷,作者还在撰写后续部分。已出版的分别为: 
第1卷 基本算法 Volume 1: Fundamental Algorithms 
第2卷 半数值算法 Volume 2: Seminumerical Algorithms 
第3卷 排序与查找 Volume 3: Sorting and Searching 
第4卷 组合算法 包括: 
第4卷 第0册 组合数学和布尔函数 Introduction to Combinatorial Algorithms and Boolean Functions 
第4卷 第1册 尚未出版 
第4卷 第2册 生成所有元组和排列 Volume 4, Fascicle 2: Generating All Tuples and Permutations 
第4卷 第3册 生成所有组合和分划 Volume 4, Fascicle 3: Generating All Combinations and Partitions 
第4卷.第4册 生成所有树 Volume 4,Fascicle 4: Generating All Trees History of Combinatorial Generation 

各种图形以及其它库 
图形库,著名的有两个:OpenGL和DirectX。 
OpenGL(“Open Graphics Library”)是一个性能卓越的三维图形标准,是图形硬件的软件接口。他是在SGI等多家世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为 基础制定的一个通用共享的开放式三维图形标准,具有使用简便、效率高、便于移植、性能卓越等特点,独立于窗口系统和操作系统,以它为基础开发的应用程序可 以十分方便地在各种平台间移植。目前包括Microsoft、SGI、IBM、DEC、SUN、HP等大公司都采用了OpenGL做为三维图形标准,许多 软件厂商也纷纷以OpenGL为基础开发出自己的产品,其中比较著名的产品包括动画制作软件Soft Image和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软件ProEngineer、GIS软ARC/INFO等等。包括迪斯尼梦工厂等好莱坞厂商的大批电脑特效程序都是使用的OpenGL库。 
OpenGL有两大经典教材: 
OpenGL体系结构审核委员会,Dave Shreiner, Mason Woo, Jackie Neider, Tom Davis 联合撰写的《OpenGL Programming Guide: The Official Guide to Learning OpenGL》(OpenGL编程指南),此书因封面为红色,被大家爱称为“红宝书”。 
Richard S Wright和Benjamin Lipchak的《OpenGL SuperBible》(OpenGL超级宝典),是另一本合适的入门教材。 
OpenGL结构评审委员会的《OpenGL Reference Manual》(OpenGL 参考手册),就和他的名字一样,它是一本文档大全,和“红宝书”相对应,他被称为“蓝宝书” 。 
按照前辈的经验,有红蓝两宝书足矣。不过,OpenGL社区的实力雄厚的很,好为人师的大牛也不少。有一位昵称NeHe的大牛,他在自己的网站上放了一整 套完整的OpenGl教程,实例教学讲解清晰,而且会跟随OpenGL的发展在随时更新,更重要的是,除了C/C++的标准例程之外,他的例程还几乎涵盖 世界上的所有语言,如果想用自己喜欢的独特语言,可以参考页面最下方的联接。NeHe的教程在  http://nehe.gamedev.net/ 。同时,Nate Robin的例子对你理解OpenGL很有帮助。 http://www.gamedev.net/reference/articles/article839.asp 。 
OpenGL最权威的资料在他的官方网站  http://www.OpenGL.org 的Documentation中,可以下载到官方教程和例子程序。 

DirectX是微软提供的一种应用程序接口(Application Interface)。简单的说它是一个提高系统性能的辅助加速软件。"Direct"的意思是"直接的",而"X"则意味着"无限"。事实上它是一 个.dll(动态连接库Dynamic link library)的文件集合。通过这些动态连接库文件,开发者们可以在不考虑设备差异的情况下访问硬件最底层。这项特性使程序员从无尽的硬件驱动程序中解 脱了出来。DirectX同时封装了一些COM(Component Object Model)对象,这些 COM 对象为访问系统硬件提供了一个主要的接口。DirectX是一种游戏开发利器,Windows下的大量游戏在制作时都用到了它。DirectX包括很多组 件,他们按功能划分为  irectDraw,Direct3D,DirectMusic,DirectSound,DirectShow,DirectPlay,DirectInput,DirectSetup and AutoPlay等等。 
在DirectX中最重要并且最具有代表性的是Direct3D和DirectDraw(在DirectX7.0之后被合并进了Direct3D),它的 主要功能就是3D图形。Direct3D和OpenGL处于竞争关系,很难评论他们孰优孰劣。OpenGL专攻图形,而且适用众多平台。而DirectX 可以在Win平台下获得多样的服务,而不止是图形。 
如果你想学习如何使用DirectX,那么必须得掌握BASIC或Delphi或C++/C#等语言中的一种,纯C是不行的。同时,掌握Win32编程技术以及一些其他相关的知识也是必需的。 
Frank D.Luna的《DirectX 9.0 3D游戏开发编程基础 》可以作为你的入门书。DierctX合适的入门书其实很多,重点是要注意版本要跟上最新的DircetX才行。 
微软的东西,最标准的教材就是MSDN。想深入学习DirectX,就去翻阅MSDN好了。而且,那里也有不错的入门资料。 
OpenGL和DirectX的最新进展往往是由显卡厂商作出的,经常去Nvidia和ATI的主页上去关注最新技术是个好选择。 

其他库,比如用于构建窗口程序框架的GTK、QT、wxWidgets等,用于科学计算的Blitz、CGAL,网络通讯的ACE,加解密用的 Crypto++,测试用的CppUnit,XML用的xml4c、XMLBooster、Xerces c++,当然也少不了即将加入标准库的Boost,这些库由于在不断的发展进化中,实体出版物相对较少,但他们自带的电子文档和相关主站上的资料通常足以 满足需求。请记住,既然这些库的作者把他们发布给大家用,他当然要给齐资料让我们知道怎么用才行。 


软件工程思想 

当软件膨胀到一定程度,它就不是一个人能搞定的了。这个时候,就要像建筑上对待一个大型工程项目一样,通过有效的组织管理来进行软件生产。这种思想就叫软 件工程。而实际上,即使是个人开发者,在初窥编程门径之后,也建议学习软件工程,从而培养起好的编程习惯便于将来的集体合作。所谓好习惯的养成是很难的而 改掉坏习惯就更难,所以千万不要养成坏习惯。 
林锐、韩永泉的《高质量程序设计指南--C++/C语言》会让你大吃一惊,原来你原先的编程习惯就有这么多的漏洞。 
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides的《Design Patterns:Elements of Reusable Object-Oriented software》(设计模式:可复用面向对象软件的基础),这是软件复用的权威教材,不过似乎要有很久编程经验之后才能领会。 
Andrei Alexandrescu 著 侯捷 译的 《Modern C++ Design Generic Programming and Design Patterns Applied 》(C++设计新思维——泛型编程与设计模式之应用)是从实例上演示设计模式的。 
Martin Fowler著 侯捷 译的 《Refactoring: Improving the Design of Existing Code》(重构:改善既有代码的设计),与巨著《设计模式》并称"软工双雄",全美销量超过100000册,亚马逊书店五星书。 
Ian Sommerville的《Software Engineering》(软件工程)直接以软件工程为名的书,猜猜也知道有多强,此书已经再版8次。 
Frederick P.Brooks的《The Mythical Man-Month: The Essays on Software Engineering》(人月神话)。出版于1975年的《人月神话》是软件开发方面的经典作品。在软件领域,很少能有像《人月神话》一样具有深远影响 力并且畅销不衰的著作。Brooks博士为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践。32年后的今天, 他的思想仍然引领我们。他是和《计算机程序设计艺术》一样经典的著作。 

找书的诀窍 

    可能有一天你会踏入一个别的编程领域,比如人工智能、加解密和密码学、网络与通讯、嵌入式等等,我并没有在这里列出书单,又或者你打算自己找些书。有什么 能快速找到好书的技巧么,除了在线上论坛新闻组等地方寻找别人的推荐评价,在老师和前辈师兄师姐那里咨询之外,还有一个极为简洁的方法,那就是去找著名大 学的计算机教材。声名在外的麻省理工、加州伯克利和清华,他们的教授们的眼光绝对是你可以信任的。买书时参看出版社也是个好办法,国内的清华大学出版社、 机械工业出版社、电子工业出版社、人民邮电出版社四家出好书的机会很高,不过有时翻译质量是个问题。国外的O'Reilly可以说是最专业的计算机图书出 版商,他出的没有不是经典的。此外Addison Wesley、Microsoft Press、 Pearson几家也尽是出猛书的地方。这个经验可不止是适用于编程哦。


参考:http://search.bookuu.com/cd%5Bfl%5D_453.html


网络编程之四书五经

TCP/IP协议是当前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要。从应用上来说,现在 直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE、Java、.NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度。但是,如果想要在这个领域达到融会贯通的地步,不打下坚实的基础是不可想象的。 正如Richard Stevens在TCP/IP Illustrated中所说,在网络编程领域,开发者所遇到的实际问题中,大约有90%都与开发者对于TCP/IP的理解相关。高层的框架和控件总结了 TCP/IP的主要使用模式,并且进行了抽象和封装,这固然非常好,但是想要真正掌握TCP/IP网络编程的真谛,恐怕需要认真学习下面几本著作。

1.Richard Stevens,TCP/IP Illustrated, Vol.1 / Vol.2 / Vol.3
《 TCP/IP详解(第一卷)协议 》《 TCP/IP详解 卷2:实现 》《 TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议 》
《 TCP/IP详解卷1:协议(英文版) 》《 TCP/IP详解卷2:实现(英文版) 》《 TCP/IP详解卷3:TCP事务协议、HTTP、NNTP和UNIX域协议(英文版) 》
这 是一本众望所归的书。自从1994年出版以来,TCP/IP Illustrated就一直是TCP/IP领域具有传奇色彩的圣经级著作。这一套著作共分为三卷,第一卷通过实际动手实验的方式深入探讨TCP/IP协 议,第二卷逐行解释了4.4BSD系统TCP/IP协议栈的15,000行实现代码,第三卷探讨了T/TCP和HTTP等高级协议。整套书最大的特点就是 贴近实战,完全符合程序员的胃口,不空谈,不说教,用实验和代码来说明问题。写作这样的书,对于作者要求非常之高,即使在今天看来,敢于这么写作的作者也 是凤毛麟角。Richard Stevens以他的写作风格和作品,在TCP/IP编程领域竖立起一座丰碑,令其他作者高山仰止,心向往之。在下文将要提到的Effective TCP/IP Programming一书中,甚至把“读Stevens的书”专门列为一个条款。这套著作的地位,可见一斑。

学习这套 书,与其说需要读,不如说需要做。Stevens最强调程序员的两项能力,一是读代码,二是动手实验。他在自己所有的书里都敦促读者将范例输入电脑,亲自 编译、运行和调试。这当然需要花费大量的时间和精力,但是如果有读者能够扎扎实实地这么做,那么他所付出的每一分钟都将会有双倍的回报。

2.Richard Stevens, UNIX Network Programming, 2/e, Vol.1 / Vol.2
《 UNIX网络编程卷2:进程间通信(第2版) 》《 UNIX网络编程(第2版)第1卷:套接口API和X/Open传输接口API 》
又 是Richard Stevens,又是经典名著。这本书的第一版问世于1990年,是Stevens的开山之作,一举奠定了Stevens在网络编程领域的重要地位。如果 说TCP/IP Illustrated解答了“什么是TCP/IP”和“TCP/IP是怎么实现的”两个问题,那么这本书则是在回答“怎样运用TCP/IP开发网络应用 程序”的问题。显而易见,这本书的内容更加贴近普通程序员,因此,大多数人是先学习UNP,然后再深入学习TCP/IP Illustrated。

这 也是一本让人伤感的书,Richard Stevens从1997年开始撰写此书第二版,制定了一个宏大的计划,卷1阐述Socket API和TLI API,卷2阐述除Socket之外的其他IPC机制,卷3阐述网络编程应用。应该说,卷1和卷2都是为了给卷3打基础。然而天妒英才,就在世人翘首企盼 第三卷的时候,1999年9月1日,Richard Stevens英年早逝。留下这套未完成的巨著,让人感慨不已。不过最近从Prentice Hall传来好消息,出版社已经找到合适的作者,重新修订这套经典巨著,其中第一卷即将问世,并且已经在Amazon上热卖。相信会有当世高人沿着 Stevens的足迹给我们续写第三卷的,让我们拭目以待。

可选图书:Douglas E. Comer, Internetworking with TCP/IP, Vol.1 / Vol.2 / Vol.3
《 用TCP/IP进行网际互联第一卷:原理、协议与结构(第四版) 》《 用TCP/IP进行网际互联-第二卷:设计、实现与内核(第三版) 》《 用TCP/IP进行网际互联 第三卷:客户-服务器编程与应用(Linux/POSIX套接字版) 》
这 套书也是三卷,前两卷内容与TCP/IP Illustrated相似,最后一卷则偏重应用程序的开发。总体上来看,这三卷书的内容与上述Stevens的两套著作相当。Comer教授的这套书定 位是教材,因此写出来中规中矩,寓精彩于平和之中。读者如果喜欢阅读教材风格的书,这套应该是很好的选择。

3.Jon C. Snader, Effective TCP/IP Programming 
(中文版《 高级TCP/IP编程 》,中国电力出版社)
自 彻读Effective C++之后,我总结出一条经验。无论在哪个领域中,一旦掌握基础知识,则应该迅速去寻找该领域中一本名为“Effective XXX”的著作并阅读之,一定可取得事半功倍的效果。Effective C++如此,Effective STL如此,Effective Java如此,这本Effective TCP/IP同样如此,也是一剂功效强大的催化剂。

本书作者是经验丰富的TCP/IP程序员,他在这本书中总结了44个难得的TCP/IP开发经验,并且将每条经验背后的道理都详细地讲解。毫无疑问,这种“专家经验”型著作对于提高读者水平,能够起到最高效、最直接的作用。

初 学TCP/IP的朋友可能觉得,自己应该先把基本知识熟练掌握,再看这本书,效果会更好。我认为不必如此,您可以在基本观念建立起来之后直接品读此书。这 本书篇幅不大,起点不高,却对很多关键问题进行了全面而细致地介绍,在具体问题的阐述上颇有Richard Stevens之风,也是纯而又纯的程序员风格——拿代码说话。

系统学习和重点难点的突破相结合,历来是快速掌握一门技术的良方。由Scott Meyers开创的“Effective”之风,已有愈演愈烈之势,这是程序员们的巨大福音。我强烈建议大家,不要放过任何一本以“Effective”为名的技术书籍。

4. Douglas Schmidt, Steven Huston,C++ Network Programming, Vol.1 / Vol.2 (中文版将分别由华中科技大学出版社和电子工业出版社出版)
《 C++网络编程,卷2 基于ACE和框架的系统化复用 》
今 天的网络编程环境是建立在C的基础之上。如果你满足于C层次的TCP/IP编程,那么Stevens的书可以说达到了一个最高境界,你大可以登东山而小 鲁。但是如果再上一个层次,考虑如何运用C++强大的抽象机制是网络编程变得更加富于艺术性,更加高效可靠,那么恐怕必须要高度重视这套书。

这 套书共两卷,篇幅都不大,主要内容是介绍ACE。在C++领域,由于这套书被Bjarne Stroustrup编入C++ In Depth系列,因此具有崇高的地位。而在网络编程领域,也有人称赞此书为Stevens之后最重要的网络编程著作。作者Douglas Schmidt是C++、网络程序设计和模式领域中国际公认的权威专家,潜心研究C++网络编程已经十多年。他发起的ACE开源项目是目前当之无愧的最优 秀和最成功的C++网络编程环境,不仅具有非常出色的可移植性,而且性能卓越。美国国防部的ARPA已经支持这个项目好几年了,其最终目的是在ACE的基 础上建立可用于现代战争的分布式实时嵌入式系统。毫无疑问,ACE无论在理论上还是在实践中,都是最值得程序员关注的网络编程典范项目,而这一套两卷对 ACE的介绍性书籍,也毫无疑问是最值得网络程序员品读分析的经典。学习这两本书,你可以将经典的基于C API的网络编程知识与现代面向对象、模式和框架等最新技术思想结合起来,从而使你对网络编程的认识上升到一个新的高度。


Linux底层开发之四书五经(刘江)

操作系统
《Linux 内核设计与实现(第2 版)》
《深入理解Linux 内核(第二版)》
《Linux内核分析与编程》
Linux方面的好书最多。其中《Linux 内核设计与实现(第2 版)》(Robert Love著,机械工业出版社出版译
著)属短小精悍之作,用作《操作系统概念》的配套正好。
《深入理解L i n u x 内核(第二版)》(Daniel Bovet著,中国电力出版社出版译著)分析全面透彻,不过国外已经出版的最新版尚未引进。
此外,倪继利的《Linux内核分析与编程》(电子工业出版社)是国人的经验总结,赵炯的《Linux 内核完全注释》分析的是0.11 版内核,适合初学者,都可以列入候选。

驱动程序开发
《Linux 设备驱动程序》(第三版)
驱动程序的开发和操作系统内核其实息息相关。所以本书的内容与前面的大类难免会有一些重叠。作为黑客世界的经典,本书实在不需要我多加推荐了。值得一提的是译者(魏永明、耿岳、钟书毅)都是国内Linux 界有数的顶尖人物。

系统编程
《UNIX 环境高级编程》(英文影印版)(第2 版)
R. Stevens也许是有史以来最伟大的技术图书作家,虽然他辞世日久,但是人们对他的景仰反而因为其著作的少有褪色而与日俱增。如果本文的范围扩大到网络 编程,他的另外两部“圣经级”著作《TCP/IP 详解》和《UNIX 网络编程》也绝对应该入选。本书的地位相当于甚至还超过了Richter 著作在Windows世界的地位


嵌入式系统之四书五经(刘江)

嵌入式系统是从单片机、微控制器等工业控制技术发 展而来的,一种流行的定义认为,除PC为代表的通用计算机之外,几乎所有信息处理系统,包括网络设备、信息家电、工业控制、医疗设备、测试仪器、通信设 备、汽车电子等等都属于嵌入式系统。显然,我们早已经被嵌入式系统所包围。
嵌入式系统技术主要有硬件和软件两个层面。硬件包括处理器、存储、接口、总线和其他电路设计,软件则包括操作系统、编程语言与开发工具、驱动程序、接口程序、联网程序、用户界面等等内容。
本文将只选择讲述主流技术的图书推荐。

嵌入式系统开发大全
人民邮电出版社(即将出版)
学 习内容繁复庞杂的嵌入式系统,掌握宏观图景(big picture)是非常重要的。从一本好的总论型图书入手很可能会使你以后的旅途更加顺利。可以归入本类的图书大多是各种教材,而且往往局限于理论,与工 程现场有隔阂。正因为如此,当曾经供职于风河公司(以开发VxWorks而占据嵌入式市场大半份额的龙头企业)的嵌入系统专家T a m m yNoergaard 撰写的本书原版出版之后,迅速得到了广泛的欢迎,成为畅销之作。
本书的特点一是全面,不仅涵盖了前面我们提到的几乎所有方 面:嵌入式标准、处理器、内存、I/O、总线、设备驱动程序、操作系统、中间件,而且还讨论了分析到实现、测试等完整的嵌入式系统设计流程,后者是大部分 相关图书都很少讲述的。其次,由于作者实践经验和经历都很丰富(除风河外,还曾效力于索尼和Esmertec,负责过消费电子、操作系统等等项目的开发和 管理),加上曾经执教于加州大学伯克利分校和斯坦福大学,书中很好地做到了理论和实践的结合。当然,不要希望从书中学到各种技术细节,那是后面介绍的几本 书地任务。  

时间触发嵌入式系统设计模式
中国电力出版社
这也是一本综合性图书,不过它的价值不在引导读者入门,而是实 践经验的总结。是的,这是嵌入式系统领域中模仿《设计模式》风格的一本书。所以,Kent Beck 为其作序也就不足为奇了。书中以模式形式总结了来自各种文献资料中振荡器、硬件复位、存储器、驱动、各种软件应用(端口、延迟和看门狗等)、各种接口、外 围模块乃至监控组件(PFM、PWM、ADC、DAC等等)等等诸多问题的解决方案(许多还给出了电路和C语言源代码),可以很快地应用到实际工作中去。 书中对时间调度的讲解非常细致。看得出来,本书的作者肯定花了不少功夫才得以完成此作。对实际开发人员来说,本书是一本非常方便、能够事半功倍的优秀参考 书。
值得一提的是,作者是英国一所大学的讲师,本书是其嵌入式系统三部曲之二,第一本是《C语言嵌入式系统开发》一书,讲述8051 C语言编程,也值得推荐,比同一类型的《C/C++嵌入式系统编程》(中国电力出版社)更贴近实际。另外还有一本讲操作系统的,目前尚未出版。
Bruce Douglass 所著由机械工业出版社出版的《嵌入式与实时系统开发:使用UML·对象技术·框架与模式》与本书类似,也采用了模式方法,但是该书更注重软件工程,而且侧重于讲面向对象方法在嵌入系统中的应用,总体感觉有与现实脱节之嫌。  

嵌入式硬件设计
中国电力出版社
专 讲硬件的图书少之又少,似乎也只有本书可以推荐。书中基本上覆盖了前面讲到的硬件知识领域,处理器讲述了PIC、Atmel AVR 和Motorola 68000 系列,涉及了CAN总线,最后有一个电动机控制的实例。需要指出,本书主要面对的是初学者以及硬件和电气知识比较缺乏的软件工程师。如果你是有一定经验的 硬件工程师,或者本身出自电气类学科,可能会觉得太浅。许多读者还抱怨书中用一整章讲述Forth这样罕用的语言。本书原版已有第二版,不过国内尚未引 进。

ARM SoC 体系结构
北京航空航天大学出版社
虽然绝对的使用量可能还比不上8051和PIC这样8位的低档竞争 者,但ARM无疑已经成为目前最炙手可热的嵌入式系统处理器。本书作者Steve Furber是ARM的最初设计者之一,权威性显然毋庸置疑。书中讲述了ARM的体系结构、指令集、汇编语言、存储器和处理器核、CPU核以及对编程语言 和操作系统的支持等等,应该是从事ARM开发者的必读之作。Furber 本人是英国皇家学院和工程院的双料院士,也是英国计算机学会和IEEE的会士。他年青时曾经是国际数学奥林匹克比赛英国代表队成员。
另外一本值得推荐的ARM图书应该是北京航空航天大学出版社翻译出版Andrew Sloss 等所著的《ARM 嵌入式系统开发:软件设计与优化》。此书属于中高级著作,侧重于软件层面,重点是如何编写高效程序,与上面的一本书配合阅读绝佳。
  
嵌入式系统软件教程
机械工业出版社
专门讲述嵌入式软件的图书,大多以“XX处理器XX操作系统嵌入式编程/系统开发”之类的名字出现,内容以翻抄处理器或者操作系统的文档为主,另外再加一些实例。
本 书超越了这种模式,作为一本导论性的教材,它以作者在加州大学伯克利分校教课的讲义基础上,全面讲述了初学者必须掌握的嵌入式软件相关知识:中断、软件架 构、实时操作系统、开发环境、调试等等,深浅适度,理论编排非常清晰,而且字里行间不时透露出作者的实践经验和技巧。书中对各种工程问题也有很到位的分析 和解决。书中对几种软件架构的比较分析,对于理解实时操作系统的设计原则很有帮助。
  
嵌入式Linux 系统设计与开发
人民邮电出版社(尚未出版)
由 于VxWorks方面没有发现值得推荐的图书,我们直接跳到Linux。嵌入式Linux方面的书中,Karim Yaghmour的《构建嵌入式Linux系统》(中国电力出版社)一直处于主导地位,而且也广受好评。但是该书主要讲述的是“构建”开发环境,对程序设 计本身涉及较少,而且更重要的是,该书缺乏实际项目所必需的驱动程序、实时Linux、uCLinux和图形界面等关键内容。本书去年刚刚出版,正好填补 了上述空白,因此尽管售价是竞争对手的两倍都不止,仍然很快得到市场的欢迎,大有后来居上的势头。作者均为一线应用工程师(印度飞利浦),所以对读者的需 求心知肚明。BSP架构,串口、I2C和USB设备驱动程序,减少系统启动时间、优化内存、找到内存泄漏等等内容非常贴近实际。而对uCLinux架构和 编程模型的透彻叙述, 则得到了uCLinux内核维护者David McCullough的称赞。

嵌入式实时操作系统
μ C/OS-II(第2 版)
北京航空航天大学出版社
我2000 年决定将这本书的第一版引入国内时,国内知道μC/OS-II这个操作系统的人似乎还非常少。实际上,这个操作系统是Labrosse 自己一个人用C 编写的,他没有将内核发布为产品,因为这样的产品已经够多了。他选择了撰写文章,但是没有被杂志接受。最后,他得到了一个机会,出版了一本专门的书。令 Minix名扬天下的在书中附带全部源代码的做法,同样也使这个名字怪怪的操作系统终于呈燎原之势。并在译者不遗余力的宣传推广下,成为国内嵌入式系统界 追捧的对象。时至今日,该书仍是本领域最畅销的图书之一,而且被许多学校指定为教材。而Labrosse也开设了一家专门从事该系统和其他附加产品的销售 和支持。应该说,μC/OS-II 的代码编写得非常干净,符合规范,核心算法也设计得很妙,移植性、可剪裁性都非常优秀,的确值得学习。而且Labrosse的书将内核知识讲得很透,胜过 其他各种形式的文档。这些都是它成功的要素。不过,必须了解的是,这个操作系统虽然开发源代码,但并非开源软件。事实上,商业应用是必须付费的。




C++程序设计之四书五经


C++是一门广泛用于工业软件研发的大型语言。它自身的复杂性和解决现实问题的能力,使其极具学术研究价值和工业价值。和C语言一样,C++已经在许多重要的领域大获成功。 

然 而,一个不可否认的现实是,在低阶程序设计领域,C++挤压着C同时也在承受着C的强烈反弹,而在高阶程序设计领域,Java和C#正在不断蚕食着C++ 的地盘。也许C++与C合为一体永远都是一个梦想,也许Java和C#的狂潮终将迫使C++回归本位 — 回到它有着根本性优势的开发领域:低级系统程序设计、高级大规模高性能应用设计、嵌入式程序设计以及数值科学计算等。果真如此,我认为这未尝不是一件好 事。 

C++吸引如此之多的智力投入,以至于这个领域的优秀作品,包括重量级的软件产品、程序库以及书籍等,数不胜数。文题“C++程序 设计之四书五经”一个不太严格的含义是:C++程序设计之四书 ⅹ 五经。是的,在本文(及其下篇)中,我将分门别类推荐20多本C++好书,你可以根据自己的需要选读。 

TCPL和D&E 

TCPL 和D&E分别是《The C++ Programming Language》和《The Design and Evolution of C++》的简称,均出自Bjarne Stroustrup之手。我将它们单列出来,首先是因为Bjarne是C++语言的创建者,然后是因为比“首先”那个原因更重要的原因:这两本书是 C++领域毋庸置疑的杰作。说它们是C++语言圣经,并不为过。 

Bjarne Stroustrup, The C++ Programming Language (Special 3rd Edition) 
《C++程序设计语言(特别版)》,机械工业出版社 
《C++程序设计语言(特别版)(英文影印版)》,高等教育出版社 

迄 今为止,TCPL是除了C++标准文献之外最权威的C++参考手册。和大多数人的看法不大一样,我认为Bjarne的文字语言并不逊色于他所创建的程序语 言,至少我喜欢这种学院气息浓厚的作品。本书对C++语言的描述轮廓鲜明、直截了当。它从C++语言创建者的角度来观察C++,这是任何别的作者和书籍做 不到的 — 没有任何人比Bjarne自己更清楚该怎么来使用C++。 

这是一本严肃的著作,以中、高级C++开发人员为目标读者。如果 你是一名有经验的C++程序员,需要了解更加本质的C++知识,本书正是为你而写。它不是那种让你看了会不断窃喜的小书,需要用心体会,反复咀嚼。在阅读 过程中,请特别留心Bjarne先生强调了什么,又对什么一语带过。我个人比较喜欢这本书的第四部分“使用C++做设计”,这样的内容在类似的程序设计语 言书籍中很难看到 — 我甚至认为Bjarne应该将这部分独立出来单独写一本书。

Bjarne Stroustrup, The Design and Evolution of C++ 
《C++语言的设计和演化》,机械工业出版社 
《C++语言的设计和演化(英文版)》,机械工业出版社 

D&E 是一本关于C++语言设计原理、设计决策和设计哲学的专著。它清晰地回答了C++为什么会成为今天这个样子而没有变成另外一种语言。作为C++语言的创建 者,Bjarne淋漓尽致地展示了他独到而深刻的见解。除了广受赞誉的语言特性外,Bjarne没有回避那些引起争议的甚至被拒绝的C++特性,他一一给 出了逻辑严密、令人信服的解释。内容涵盖C++的史前时代、带类的C、C++的设计规则、标准化、库、内存管理、多重继承、模板等,对包括异常机制、运行 时类型信息和名字空间在内的重要的新特性都分别进行了深入探讨。每一名C++程序员都应该可以从Bjarne的阐释中加深对手中这门语言的认识。 

需要再次提醒的是,这两本书知识浓缩,信息量极大,请不要错过Bjarne每一句看似漫不经意的话。 

入门教程 

学 习任何一门语言都需要一个从入门到精通、从新手到高手循序渐进的过程。不过,对于一个所谓的新手而言,究竟是一个完完全全的新手,还是一个熟悉某种别的语 言的“新手”,甚至是在某种语言程序设计领域已经颇有建树的高手,很难一概而论?不同的C++新手需要不同的入门书籍。 

Andrew Koenig, Barbara E. Moo, Accelerated C++: Practical Programming by Example 
《Accelerated C++中文版》,中国电力出版社 

和 市面上大多数C++教程不同,本书不是从“C++中的C”开始讲解,而是始于地道的C++特性。从一开始就使用标准库来写程序,随着讲述的逐渐深入,又一 一解释这些标准库组件所依赖的基础概念。另外,和其他C++教材不同的是,这本书以实例拉动语言和标准库的讲解,对后两者的讲解是为了给实例程序提供支 持,而不是像绝大多数C++教材那样,例子只是用作演示语言特性和标准库用法的辅助工具。 

作者在C++领域的编程实践、教育培训以及技 术写作方面都是世界一流水准。我喜欢这种大量使用标准库和C++语言原生特性的清新的写作风格。在这本教材面前,几乎迄今为止的所有C++教材都黯然失色 或显得过时。尽管这本教材也许对于国内的高校教育来说有些前卫,不过我仍然极力向我的同行们推荐。顺带一提,在Bjarne和我最近的一封通信里,他这样 评价本书:对于有经验的程序员学习C++而言,这本书可能是世界上最好的一本。 

Stanley B.Lippman, Josee Lajoie, C++ Primer (3rd Edition) 
《C++ Primer (3RD)中文版》,中国电力出版社 

这 本书的名字多少有点让人误解。尽管作者声称这本书是为C++新手而写,但无论是它的厚度还是讲解的深度都暴露了似乎并非如此。也许说它是一本“从入门到精 通”的C++教程会更合适一些。我个人认为它并不适合完全不懂C++的初学者 — 在阅读这本书之前,你至少应该先有那么一点C或C++的背景知识,或者至少要具有一些其他语言的编程经验。 

尽管这本书省略了一些高级 C++特性的讨论,但仍然可以称得上是迄今为止最全面的C++学习教程。事实上,如果一名C++初学者能够扎扎实实地读完本书并对照《C++ Primer Answer Book》完成全部习题的话,他的水平肯定可以进入职业C++程序员的行列。我个人认为,即使你已经拥有了TCPL,这本书依然有拥有的价值,因为在许多 方面它比TCPL来得更详细、更易懂。 

Stanley B. Lippman, Essential C++ 
《Essential C++中文版》,华中科技大学出版社 
《Essential C++(影印版)》,中国电力出版社 

可 以不太严格地认为这本书是《C++ Primer》的精简版。本书一一讲述了C++中最具代表性的主题,包括过程式编程、泛型编程、基于对象编程、面向对象编程、模板编程以及异常处理等。 Stanley将门槛调低到“具有其他语言程序设计经验”的C++新手所能接受的最基本的层次,使他们能够迅速开始使用C++编程而又免于阅读《C++ Primer》那样的大部头。它以实例引导学习,力图使读者在最短的时间内把握C++的精粹。 

也许换一个人来概述C++编程范型 (paradigm)的方方面面需要好几百页才能说清楚,但这本小书不可思议地做到了这一点。我个人非常喜欢这种满是技术、简明扼要并且“有话好好说”的 书。这本书同样具有一个明显的风格:所有程序例子全部采用标准库组件,让人耳目一新。 

以上三本书都不是为了完完全全的编程新手而写。完 全的C++编程新手可以阅读Francis Glassborow的新书(尚未出版):《A Beginners Introduction to Computer Programming : You Can Do It!》。这也是Bjarne的推荐。Francis Glassborow是ACCU主席,多年来他对几乎每一本C++经典名著评头论足,他自己的这一本自然会引起C++社群的极大兴趣。 

高效、健壮编程 

两 年前我在负责一个省级电力调度系统项目时编写了一个网关程序,它从SCADA系统获取电力实时信息。通讯接口采用了不常用的数据库直连方式(这个网关程序 一端连接SQL Server 6.5,另一端连接Oralce 8.1.6)。由于实时测点近万,每次将全部取样更新或插入一遍显然是低效的。我在网关程序里建了一个内存库,获取到的数据首先在其中进行比较,然后决定 是否更新物理数据库(同时还做了别的更复杂的事情……),从而在效率和资源占用两方面达到了预期效果。 

这个程序一直运行得很好,但在离 开现场之后的某一天,系统管理员打来电话,说大概因为网络故障等原因,有时这个网关程序会崩溃掉 — 它自己崩掉也就罢了,问题是它还会把Windows 2000 Advanced Server搞成“蓝屏”!坦白地说,我还从来没看过哪个非蓄意的程序有这个“能耐”。由于当时正忙于另外一个大项目,无法去现场调试,最后只有凭经验对 内存库代码小心翼翼地封装以异常处理代码(同时也做了一些别的修改……)。这样,虽然没有彻底解决问题,但程序终究不再死得那么难看了。 

在 这儿讲这么一段花絮有什么意思呢(当初为那个可怕的bug朝思暮想时我可不认为这是一个“花絮”)?我想说的是,对于任何软件而言,离开强健,效率也就无 从谈起。而对于C++程序员来说,也许编写一个高效的程序并不难,但要编写一个需要7 ⅹ 24小时持续运行的服务端软件就不是那么容易了,需要考虑许多因素,有时这些因素甚至远远超出C++语言和开发工具的本身。作为一名开发实际项目软件的程 序员,并非非得自己碰钉子才能积累经验,只要我们足够虚心,别人的经验往往都是我们很好的借鉴。鉴于此,我推荐以下几本书供你选读,它们可以让你从强健和 效率两方面受益(当然了,它们涵盖的内容远不限于异常处理J)。 

Scott Meyers, Effective C++: 50 Specific Ways to Improve Your Programs and Design (2nd Edition) 
Scott Meyers, More Effective C++: 35 New Ways to Improve Your Programs and Designs 
《Effective C++中文版》,华中科技大学出版社 
《More Effective C++中文版》,中国电力出版社 
《Effective C++(影印版)》,中国电力出版社 

如 果说《Effective C++》主要讨论C++中一些相对基础的概念和技巧的话,那么《More Effective C++》则着重探讨了包括异常处理在内的一系列高级技术。与前者相比,后者具有两大主要区别:其一,它包含很多时新的标准C++的内容;第二,它讨论的主 题倾向于“战略化”而非“战术化”,并且讨论得更深入、更彻底。尤其是对虚析构函数、智能指针、引用计数以及代理类(proxy classe)等技术和模式论述的深入程度,让人很难想象是出现于这样的一本小书之中。 

游刃有余的技术,高超的写作技巧,Scott无 疑是世界上最优秀的C++技术作家之一。在简洁、清晰、易读等方面,这两本书都卓尔不群。总之,Scott提供的这85个可以改善编程技术和设计思维的方 法,都是中、高级C++程序员必备的技能。我强烈推荐这两本书(实际上还有一本,稍后就会看到)。 

Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions 
Herb Sutter, More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions 
《Exceptional C++中文版》,中国电力出版社 
《More Exceptional C++中文版》,华中科技大学出版社 

你 自认为是一名C++语言专家吗?读一读ISO C++标准委员会秘书长的这两本书再回答。在这两本书中,Herb采用了“问答”的方式指导你学习C++语言特性。对于每一个专题,Herb首先合理地设 想出你的疑问和困惑,接着又猜测出你十有八九是错误的解答,然后给你以指点并提出最佳解决方案,最后还归纳出解决类似问题的普适性原则。 

这 两本书是典型的深究C++语言细节的著作,很薄,但内容密集,远远超过Scott的那两本书,读起来很费脑筋 — 我个人认为它们要比Scott的书难懂得多。若要研习这薄薄的两本书所包含的知识,至少需要花费数月的时间!(在Scott的荐序中,他坦陈不止一次陷入 GotW问题的陷阱,你应该知道这意味着什么)对于语言细节的深究有什么好处呢?尽管在大多数情况下,我们不必关心C++代码幕后的动作,然而当我们不得 不关心时,这两本书可以为我们提供很好的线索,因为它们揭示了C++语言中微妙而又至关重要的东西。 

Stephen C. Dewhurst, C++ Gotchas: Avoiding Common Problems in Coding and Design 
《C++程序设计陷阱》,中国青年出版社 

Stephen 的理论素养和实践经验注定这是一本值得一读的好书。Stephen曾经是贝尔实验室中第一批C++使用者。他已经使用C++成功解决了包括编译器、证券交 易、电子商务以及嵌入式系统等领域中的问题。本书汇集了作者来自开发一线的99条编程真知灼见,洞悉它们,你可以避免几乎所有常见的C++设计和编程问 题。 

我甚至认为,对于C++编程菜鸟而言,阅读这本书会比阅读Scott和Herb的书更能轻松而立竿见影地获得更大的提高。我个人很 喜欢这本书的写作风格 — Stephen的许多观点看似极端却无可辩驳。当然了,这种自信(以及冷幽默)来自于作者深厚的技术素养,而非自大的偏执。 

除 了上面推荐的书籍外,Dov Bulka和 David Mayhew合著的《Efficient C++: Performance Programming Techniques》(《提高C++性能的编程技术》,清华大学出版社)也值得一看。这本超薄小书聚焦于高性能C++应用程序开发。两位作者都是IBM 软件专家,都工作于对性能要求极高的系统构建领域,本书是他们的经验之谈。也有人不喜欢这本书,因为它花了不少的篇幅讲述和C++无关的东西,我却恰恰因 为这一点而对这本书产生好感,正是这些东西让我开阔了眼界。 

模板和泛型编程 

模板和基于模板的泛型编程无疑是当今发展 最活跃的C++程序设计技术。模板的第一个革命性的应用是STL,它将模板技术在泛型容器和算法领域的运用展现得淋漓尽致,而Boost、Loki等现代 程序库则将模板技术的潜能不断发挥到极致。在模板和泛型编程领域,我推荐以下两本重量级著作: 

David Vandevoorde, Nicolai M. Josuttis, C++ Templates: The Complete Guide 
《C++ Templates全览(繁体版)》,台湾碁峰资讯股份有限公司 
《C++ Templates全览(简体版)》,人民邮电出版社 

有 一种老套的赞美一本书的手法,大致是“没有看过这本书,你就怎么怎么地”,这里面往往夸张的成分居多。不过,倘若说“没有看过《C++ Templates: The Complete Guide》,你就不可能精通C++模板编程”,那么这个论断对于世界上绝大多数C++程序员来说是成立的。 

这本书填补了C++模板书 籍领域由来已久的空白。此前,上有《Modern C++ Design》这样的专注于模板高级编程技术和泛型模式的著作,下有《The C++ Standard Library》这样的针对特定模板框架和组件的使用指南。然而,假如对模板机制缺乏深入的理解,你就很难“上下”自如。鉴于此,我向每一位渴望透彻理解 C++模板技术的朋友推荐这本书。 

这本书在内地、台湾各有一个译本,但出自不同的译者之手。当你看到这篇文章时,两个译本应该都已经上市,对于读者来说当然也就多了一种选择。侯捷先生个人网站上开放了繁体译本大部分章节,不妨先睹为快。 

Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied 
《C++设计新思维:泛型编程与设计模式之应用》,华中科技大学出版社 
《C++设计新思维(影印版)》,中国电力出版社 

你自认为是C++模板编程高手吗?请看过这本书再回答J 这是一本出自天才之手令人敬畏的杰作。泛型模式,无限延伸你的视野,足以挑战任何一名C++程序员的思维极限。 

这 本书共分为两大部分,第一部分讨论了 Loki程序库采用的基础技术以及一些高级语言特性,包括基于策略的类设计、模板局部特化、编译期断言、Typelist以及小型对象分配技术等。第二部 分则着重介绍了Loki中的重要组件和泛型模式技术,包括泛化仿函数(Generalization Functor)、单件(Singleton)、智能指针、对象工厂(Object Factory)、抽象工厂(Abstract Factory)、访问者(Visitor)以及多方法(Multimethods)等。每一种技术都让人大开眼界,叹为观止。 

在C++的学习方面,过犹不及往往成了不求甚解的借口。然而,面向对象并非C++的全部,模板和泛型编程亦占半壁江山。对于“严肃”的C++程序员而言,及时跟进这项早经例证的成功技术,不失为明智之举。 

结语 

这 些著作是如此大名鼎鼎,也许根本不缺我一个推荐。然而,纵然C++程序员队伍的发展壮大速度不像其他更时髦的语言那样迅速,新人进总是多于旧人出。除了热 忱地欢迎新人,我个人认为到了对C++书籍进行“盘点”的时候了,并且希望这样的“盘点”有益于感兴趣的读者。请保持耐心和宽厚。在下篇中,我将继续介绍 标准库、网络编程以及其他方面的C++好书。有好书相伴,这个冬天不会冷。

参考:http://blog.chinaunix.net/uid-20743248-id-730671.html

你可能感兴趣的:(IT书评,书单)