本书概念清晰、内容新颖、实例详尽,是一本有关设计、实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南。本书倡导基于接口的C语言设计理念及其实现技术,深入详细地描述了24个C语言接口及其实现。
本书通过叙述如何用一种与语言无关的方法将接口的设计与实现独立开来,从而形成一种基于接口的设计途径来创建可重用的API,本书是一本针对 C语言程序员的不可多得的好书,也是值得所有希望掌握可重用软件模块技术的读者阅读的参考书籍。
关于如何设计、实现和有效使用库函数的指南少之又少(如果说还有的话)。这本力作填补了这 个空白。它可以作为下一代软件的工具书.所有的C语言程序员都应该阅读。
——W.Richard Stevens
“我向每位专业C语言程序员推荐这本书。C语言程序员们忽视书中所描述的各种技术已经太长时 间了。”
——Norman Ramsey,贝尔实验室研究员
每一位程序员和软件项目经理必须掌握创建可重用软件模块的技术:可重用软件模块是 构建大规模、可靠应用的基石。与当前某些面向对象语言不同,C语言为创建可重用应用程 序接口(Application Programming Interface,API)提供的语言和功能支持非常少。尽管大多 数C语言程序员在自己所编写的每一个应用程序中都使用API和实现API的库.但只有相当少 的程序员可以创建和发布新的、可广泛使用的API。本书阐述了如何用一种与语言无关的方 法将接口的设计与实现独立开来,从而形成一种基于接口的设计途径来创建可重用的API。 书中提供大量实例具体说明这种方法。作者详细描述了24个接口和它们的实现细节,有助于 读者对这种设计方法的透彻理解。
本书具有如下特色:
● 简洁明了的接口描述。为对接口设计感兴趣的程序员提供了一个参考手册
● 每一章接口的代码实现分析将帮助读者修改、扩充一个接口,或者设计相关接口
● 深入探讨了“算法工程”:阐述如何将数据结构以及相关算法打包到可重用模块中
● 24个API和8个实例程序的源代码都经过测试检查,每个程序都是按照”literate程序”的形 式构成。为源代码提供了全面完整的解释
● 提供了非常少见的有关C语言编程技巧的文档记录
● 可以方便地在http://WWW.CS.princeton.edu/software/cii/访问本书的所有源码
出版者的话
专家指导委员会
译者序
前言
第1章 简介
1.1 literate程序
1.2 编程风格
1.3 效率
参考书目浅析
练习
第2章 接口与实现
2.1 接口
2.2 实现
2.3 抽象数据类型
2.4 客户调用程序的责任
2.5 效率
参考书目浅析
练习
第3章原子
3.1 接口
3.2 实现
参考书目浅析
练习
第4章 异常与断言
4.1 接口
4.2 实现
4.3 断言
参考书目浅析
练习
第5章 内存管理
5.1 接口
5.2 产品级实现
5.3 校验实现
参考书目浅析
练习
第6章 进一步内存管理
6.1 接口
6.2 实现
参考书目浅析
练习
第7章 链表
7.1 接口
7.2 实现
参考书目浅析
练习
第8章 表格
8.1 接口
8.2 例子:单词频率
8.3 实现
参考书目浅析
练习
第9章 集合
9.1 接口
9.2 实例:交叉引用列表
9.3 实现
参考书目浅析
练习
第10章 动态数组
10.1 接口
10.2 实现
参考书目浅析
练习
第11章 序列
11.1 接口
11.2 实现
参考书目浅析
练习
第12章 环
12.1 接口
12.2 实现
参考书目浅析
练习
第13章 位向量
13.1 接口
13.2 实现
参考书目浅析
练习
第14章 格式化
14.1 接口
14.2实现
参考书目浅析
练习
第15章 低级字符串
15.1 接口
15.2 例子:打印标识符
15.3 实现
参考书目浅析
练习
第16章 高级字符串
16.1 接口
16.2 实现
参考书目浅析
练习
第17章 扩展精度算法
17.1 接口
17.2 实现
参考书目浅析
练习
第18章 任意精度算法
18.1 接口
18.2 示例:一个计算器
18.3 实现
参考书目浅析
练习
第19章 多精度算法
19.1 接口
19.2 示例:另一计算器
19.3 实现
参考书目浅析
练习
第20章 线程
20.1 接口
20.2 示例
20.3 实现
参考书目浅析
练习
附录 接口概要
参考书目
索引
现在程序员都面临着大量的关于应用程序接口(Application Programming Interface,API)的信息,大多数人都会使用API和程序库,并在其所写的每一个应用程序中实现它们,但是很少有人会创建或发布新的能广泛应用的API。事实上,程序员似乎倾向于循环使用他们自己的东西,而不愿意查找能满足他们要求的程序库,这或许是因为写特定应用程序的代码要比查找设计好的API容易。
我和下一代程序员一样感到心虚:lcc(Chris Fraser和我给ANSI/ISOC编写的编译器)是建立在一定的背景之上的(在《ARetargetableCCompiler:Designandlmplementation》一书中有关Tlcc的描述,Addison-Wesley,1995)。编译器展示了这样一种应用程序,该应用程序可以使用标准接口,并且能够创建在其他地方也可以使用的接口。这类程序的其他例子还有内存管理、字符串和符号表以及链表操作等等。但是lcc仅使用了很少的标准C库函数的例程,并且几乎没有代码能够直接应用到其他应用程序中。
本书提倡的是一种基于接口及其实现的设计方法,并且通过对24个接口及其实现的描述详细地演示了这种方法。这些接口涉及到计算机领域的很多知识,其中包括数据结构、算法、字符串处理和并发程序。这些实现并不是简单的玩具——它们是为在产品代码中使用而设计的。
C编程语言对基于接口设计方法的支持是极少的。而面向对象的语言,像C+十和Modula-3,则鼓励将接口与实现分离。基于接口的设计独立于任何特定的语言,但是它要求程序员对像C一样的语言有更多的驾驭能力和更高的警惕性,因为这类语言很容易破坏带有隐含实现信息的接口,反之亦然。
然而,一旦掌握了基于接口的设计方法,就能够在服务于众多应用程序的通用接口基础上建立应用程序,从而加速开发。在一些C++环境中的基础类库就体现了这种效果。增加对现有软件的重用——接口实现库,能够减少初始开发成本,同时还能减少维护成本,因为应用程序的更多部分都建立在经过良好测试的通用接口的实现之上。
本书提供的24个接口来有多种来源,并且针对本书特别做了修正。一些数据结构中的接口——抽象数据类型,源于Icc代码和70年代末80年代初所做的Icon编程语言的实现代码(参见R.E.GriswoldandM.T.Griswold,Thelcon Programming Language,Prentice Hall,1990)。其他的接口来自另外一些程序员的著作,我们将会在每一章的“参考书目浅析”部分给出详细信息。
书中提供的一些接口是针对数据结构的,但本书不是一本数据结构的书籍,闲此,本书侧重点在算法引擎——包装数据结构以供应用程序使用——而不在数据结构算法本身。然而,好的接口设计总是依赖于恰当的数据结构和有效的算法,因此,本书与Robert Sedgewick的《Algorithms in C》(Addison-Wesley,1990)这样的传统数据结构和算法教材是相得益彰的。
大多数章节会描述一个接口及其实现;有少数章节还会描述与其相关的接口。每一章的“接口”部分将会单独给出一个明确且详细的接口描述。对于兴趣仅在于接口的程序员来说,这些节就相当于一本参考手册。少数章节还会包含“示例”部分,该节将会说明在一个简单的应用程序中一个或多个接口的使用。
每章的“实现”部分将会详细地介绍本章接口的实现代码。在一些例子中,对一个接口将会给出多种实现方法,以展示基于接口设计的优点。这些节对于修改或扩展一个接口或是设计一个相关的接口将大有裨益。许多练习题将会探究一些设计与实现的其他可行方法。如果仅是为了理解如何使用接口,可以不用阅读“实现”一节。
接口、示例和实现都以literate程序的方式给出,换句话说,源代码及其解释是按照最适合理解代码的顺序交织出现的。代码可以自动地从本书的文本文件中抽取,并按C编程语言所规定的顺序组合起来。其他包含C语言literate程序设计例子的书籍有《A Retargetable C Compiler》和D.E.Knuth写的《The Stanford GraphBase:A Platform for Combinatorial Computing》(Addison-Wesley,1993)。