《UNIX编程艺术》PDF下载

  • 购买积分:16 如何计算积分?
  • 作  者:(美)埃瑞克·S.理曼德著
  • 出 版 社:北京:电子工业出版社
  • 出版年份:2012
  • ISBN:9787121176654
  • 页数:530 页
图书介绍:本书主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验,由公认的Unix编程大师、开源运动领袖人物之一Eric S. Raymond倾力多年写作而成。包括Unix设计者在内的多位领域专家也为本书贡献了宝贵的内容。本书内容涉及社群文化、软件开发设计与实现,覆盖面广、内容深邃,完全展现了作者极其深厚的经验积累和领域智慧。

Part I 1

第1章 哲学 3

1.1文化?什么文化 3

1.2 Unix的生命力 4

1.3反对学习Unix文化的理由 5

1.4 Unix之失 6

1.5 Unix之得 7

1.5.1开源软件 7

1.5.2跨平台可移植性和开放标准 8

1.5.3 Internet和万维网 8

1.5.4开源社区 9

1.5.5从头到脚的灵活性 9

1.5.6 Unix Hack之趣 10

1.5.7 Unix的经验别处也可适用 11

1.6 Unix哲学基础 11

1.6.1模块原则:使用简洁的接口拼合简单的部件 14

1.6.2清晰原则:清晰胜于机巧 14

1.6.3组合原则:设计时考虑拼接组合 15

1.6.4分离原则:策略同机制分离,接口同引擎分离 16

1.6.5简洁原则:设计要简洁,复杂度能低则低 17

1.6.6吝啬原则:除非确无它法,不要编写庞大的程序 18

1.6.7透明性原则:设计要可见,以便审查和调试 18

1.6.8健壮原则:健壮源于透明与简洁 18

1.6.9表示原则:把知识叠入数据以求逻辑质朴而健壮 19

1.6.10通俗原则:接口设计避免标新立异 20

1.6.11缄默原则:如果一个程序没什么好说的,就保持沉默 20

1.6.12补救原则:出现异常时,马上退出并给出足量错误信息 21

1.6.13经济原则:宁花机器一分,不花程序员一秒 22

1.6.14生成原则:避免手工hack,尽量编写程序去生成程序 22

1.6.15优化原则:雕琢前先得有原型,跑之前先学会走 23

1.6.16多样原则:决不相信所谓“不二法门”的断言 24

1.6.17扩展原则:设计着眼未来,未来总比预想快 24

1.7 Unix哲学之一言以蔽之 25

1.8应用Unix哲学 26

1.9态度也要紧 26

第2章历史——双流记 29

2.1Unix的起源及历史,1969—1995 29

2.1.1创世纪:1969—1971 30

2.1.2出埃及记:1971—1980 32

2.1.3 TCP/IP和Unix内战:1980—1990 35

2.1.4反击帝国:1991—1995 41

2.2黑客的起源和历史:1961—1995 43

2.2.1游戏在校园的林间:1961—1980 44

2.2.2互联网大融合与自由软件运动:1981—1991 45

2.2.3 Linux和实用主义者的应对:1991—1998 48

2.3开源运动:1998年及之后 49

2.4 Unix的历史教训 51

第3章 对比:Unix哲学同其他哲学的比较 53

3.1操作系统的风格元素 53

3.1.1什么是操作系统的统一性理念 54

3.1.2多任务能力 54

3.1.3协作进程 55

3.1.4内部边界 57

3.1.5文件属性和记录结构 57

3.1.6二进制文件格式 58

3.1.7首选用户界面风格 58

3.1.8目标受众 59

3.1.9开发的门坎 60

3.2操作系统的比较 61

3.2.1 VMS 61

3.2.2 MacOS 64

3.2.3 OS/2 65

3.2.4 Windows NT 68

3.2.5 BeOS 71

3.2.6 MVS 72

3.2.7 VM/CMS 74

3.2.8 Linux 76

3.3种什么籽,得什么果 78

Part Ⅱ 81

第4章 模块性:保持清晰,保持简洁 83

4.1封装和最佳模块大小 85

4.2紧凑性和正交性 87

4.2.1紧凑性 87

4.2.2正交性 89

4.2.3 SPOT原则 91

4.2.4紧凑性和强单一中心 92

4.2.5分离的价值 94

4.3软件是多层的 95

4.3.1自顶向下和自底向上 95

4.3.2胶合层 97

4.3.3实例分析:被视为薄胶合层的C语言 98

4.4程序库 99

4.4.1实例分析:GIMP插件 100

4.5 Unix和面向对象语言 101

4.6模块式编码 103

第5章 文本化:好协议产生好实践 105

5.1文本化的重要性 107

5.1.1实例分析:Unix口令文件格式 109

5.1.2实例分析:.newsrc格式 110

5.1.3实例分析:PNG图形文件格式 111

5.2数据文件元格式 112

5.2.1 DSV风格 113

5.2.2 RFC 822格式 114

5.2.3 Cookie-Jar格式 115

5.2.4 Record-Jar格式 116

5.2.5 XML 117

5.2.6 Windows INI格式 119

5.2.7 Unix文本文件格式的约定 120

5.2.8文件压缩的利弊 122

5.3应用协议设计 123

5.3.1实例分析:SMTP,一个简单的套接字协议 124

5.3.2实例分析:POP3,邮局协议 124

5.3.3实例分析:IMAP,互联网消息访问协议 126

5.4应用协议元格式 127

5.4.1经典的互联网应用元协议 127

5.4.2作为通用应用协议的HTTP 128

5.4.3 BEEP:块可扩展交换协议 130

5.4.4 XML-RPC, SOAP和Jabber 131

第6章 透明性:来点儿光 133

6.1研究实例 135

6.1.1实例分析:audacity 135

6.1.2实例分析:fetchmail的-v选项 136

6.1.3实例分析:GCC 139

6.1.4实例分析:kmail 140

6.1.5实例分析:SNG 142

6.1.6实例分析:Terminfo数据库 144

6.1.7实例分析:Freeciv数据文件 146

6.2为透明性和可显性而设计 148

6.2.1透明性之禅 149

6.2.2为透明性和可显性而编码 150

6.2.3透明性和避免过度保护 151

6.2.4透明性和可编辑的表现形式 152

6.2.5透明性、故障诊断和故障恢复 153

6.3为可维护性而设计 154

第7章 多道程序设计:分离进程为独立的功能 157

7.1从性能调整中分离复杂度控制 159

7.2 Unix IPC方法的分类 160

7.2.1把任务转给专门程序 160

7.2.2管道、重定向和过滤器 161

7.2.3包装器 166

7.2.4安全性包装器和Bernstein链 167

7.2.5从进程 168

7.2.6对等进程间通信 169

7.3要避免的问题和方法 176

7.3.1废弃的Unix IPC方法 176

7.3.2远程过程调用 178

7.3.3线程——恐吓或威胁 180

7.4在设计层次上的进程划分 181

第8章 微型语言:寻找歌唱的乐符 183

8.1理解语言分类法 185

8.2应用微型语言 187

8.2.1案例分析:sng 187

8.2.2案例分析:正则表达式 188

8.2.3案例分析:Glade 191

8.2.4案例分析:m4 193

8.2.5案例分析:XSLT 194

8.2.6案例分析:The Documenter’s Workbench Tools 195

8.2.7案例分析:fetchmail的运行控制语法 199

8.2.8案例分析:awk 200

8.2.9案例分析:PostScript 202

8.2.10案例分析:bc和dc 203

8.2.11案例分析:Emacs Lisp 205

8.2.12案例分析:JavaScript 205

8.3设计微型语言 206

8.3.1选择正确的复杂度 207

8.3.2扩展和嵌入语言 209

8.3.3编写自定义语法 210

8.3.4宏—慎用 210

8.3.5语言还是应用协议 212

第9章 生成:提升规格说明的层次 215

9.1数据驱动编程 216

9.1.1实例分析:ascii 217

9.1.2实例分析:统计学的垃圾邮件统计 218

9.1.3实例分析:fetchmailconf中的元类改动 219

9.2专用代码的生成 225

9.2.1实例分析:生成ascii显示的代码 225

9.2.2实例分析:为列表生成HTML代码 227

第10章 配置:迈出正确的第一步 231

10.1什么应是可配置的 231

10.2配置在哪里 233

10.3运行控制文件 234

10.3.1实例分析:.netrc文件 236

10.3.2到其它操作系统的可移植性 238

10.4环境变量 238

10.4.1系统环境变量 238

10.4.2用户环境变量 240

10.4.3何时使用环境变量 240

10.4.4到其它操作系统的可移植性 242

10.5命令行选项 242

10.5.1从-a到-z的命令行选项 243

10.5.2到其它操作系统的可移植性 248

10.6如何挑选方法 248

10.6.1实例分析:fetchmail 249

10.6.2实例分析:XFree86服务器 251

10.7论打破规则 252

第11章 接口:Unix环境下的用户接口设计模式 253

11.1最小立异原则的应用 254

11.2 Unix接口设计的历史 256

11.3接口设计评估 257

11.4 CLI和可视接口之间的权衡 259

11.4.1实例分析:编写计算器程序的两种方式 262

11.5透明、表现力和可配置 264

11.6 Unix接口设计模式 266

11.6.1过滤器模式 266

11.6.2 Cantrip模式 268

11.6.3源模式 268

11.6.4接收器模式 269

11.6.5编译器模式 269

11.6.6 ed模式 270

11.6.7 Roguelike模式 270

11.6.8“引擎和接口分离”模式 273

11.6.9 CLI服务器模式 278

11.6.10基于语言的接口模式 279

11.7应用Unix接口设计模式 280

11.7.1多价程序模式 281

11.8网页浏览器作为通用前端 281

11.9沉默是金 284

第12章 优化 287

12.1什么也别做,就站在那儿 287

12.2先估量,后优化 288

12.3非定域性之害 290

12.4吞吐量和延迟 291

12.4.1批操作 292

12.4.2重叠操作 293

12.4.3缓存操作结果 293

第13章 复杂度:尽可能简单,但别简单过了头 295

13.1谈谈复杂度 296

13.1.1复杂度的三个来源 296

13.1.2接口复杂度和实现复杂度的折中 298

13.1.3平质的、选择的和偶然的复杂度 299

13.1.4映射复杂度 300

13.1.5当简洁性不能胜任 302

13.2五个编辑器的故事 302

13.2.1 ed 304

13.2.2 vi 305

13.2.3 Sam 306

13.2.4 Emacs 307

13.2.5 Wily 308

13.3编辑器的适当规模 309

13.3.1甄别复杂度问题 309

13.3.2折中无用 312

13.3.3 Emacs是个反Unix传统的论据吗 314

13.4软件的适度规模 316

Part Ⅲ 319

第14章 语言:C还是非C 321

14.1 Unix下语言的丰饶 321

14.2为什么不是C 323

14.3解释型语言和混合策略 325

14.4语言评估 325

14.4.1 C 326

14.4.2 C++++ 327

14.4.3 Shell 330

14.4.4 Perl 332

14.4.5 Tcl 334

14.4.6 Python 336

14.4.7 Java 339

14.4.8 Emacs Lisp 342

14.5未来趋势 344

14.6选择X工具包 346

第15章 工具:开发的战术 349

15.1开发者友好的操作系统 349

15.2编辑器选择 350

15.2.1了解vi 351

15.2.2了解Emacs 351

15.2.3非虔诚的选择:两者兼用 352

15.3专用代码生成器 352

15.3.1 yacc和lex 353

15.3.2实例分析:fetchmailrc的语法 356

15.3.3实例分析:Glade 356

15.4 make:自动化编译 357

15.4.1 make的基本理论 357

15.4.2非C/C++++开发中的make 359

15.4.3通用生成目标 359

15.4.4生成Makefiile 362

15.5版本控制系统 364

15.5.1为什么需要版本控制 364

15.5.2手工版本控制 365

15.5.3自动化的版本控制 366

15.5.4 Unix的版本控制工具 367

15.6运行期调试 369

15.7性能分析 370

15.8使用Emacs整合工具 370

15.8.1 Emacs和make 371

15.8.2 Emacs和运行期调试 371

15.8.3 Emacs和版本控制 371

15.8.4 Emacs和Profiling 372

15.8.5像IDE一样,但更强 373

第16章 重用:论不要重新发明轮子 375

16.1猪小兵的故事 376

16.2透明性是重用的关键 379

16.3从重用到开源 380

16.4生命中最美好的就是“开放” 381

16.5何处找 384

16.6使用开源软件的问题 385

16.7许可证问题 386

16.7.1开放源码的资格 386

16.7.2标准开放源码许可证 388

16.7.3何时需要律师 390

Part IV 391

第17章 可移植性:软件可移植性与遵循标准 393

17.1 C语言的演化 394

17.1.1早期的C语言 395

17.1.2 C语言标准 396

17.2 Umx标准 398

17.2.1标准和Unix之战 398

17.2.2庆功宴上的幽灵 401

17.2.3开源世界的Unix标准 402

17.3 IETF和RFC标准化过程 403

17.4规格DNA,代码RNA 405

17.5可移植性编程 408

17.5.1可移植性和编程语言选择 409

17.5.2避免系统依赖性 412

17.5.3移植工具 413

17.6国际化 413

17.7可移植性、开放标准以及开放源码 414

第18章 文档:向网络世界阐释代码 417

18.1文档概念 418

18.2 Unix风格 420

18.2.1大文档偏爱 420

18.2.2文化风格 421

18.3各种Unix文档格式 422

18.3.1troff和Documenter’s Workbench Tools 422

18.3.2 TEX 424

18.3.3 Texinfo 425

18.3.4 POD 425

18.3.5 HTML 426

18.3.6 DocBook 426

18.4当前的混乱和可能的出路 426

18.5 DocBook 427

18.5.1文档类型定义 427

18.5.2其它DTD 428

18.5.3 DocBook工具链 429

18.5.4移植工具 431

18.5.5编辑工具 432

18.5.6相关标准和实践 433

18.5.7 SGML 433

18.5.8 XML-DocBook参考书籍 433

18.6编写Unix文档的最佳实践 434

第19章 开放源码:在Unix新社区中编程 437

19.1Unix和开放源码 438

19.2与开源开发者协同工作的最佳实践 440

19.2.1良好的修补实践 440

19.2.2良好的项目、档案文件命名实践 444

19.2.3良好的开发实践 447

19.2.4良好的发行制作实践 450

19.2.5良好的交流实践 454

19.3许可证的逻辑:如何挑选 456

19.4为什么应使用某个标准许可证 457

19.5各种开源许可证 457

19.5.1 MIT或者X Consortium许可证 457

19.5.2经典BSD许可证 457

19.5.3 Artistic许可证 458

19.5.4通用公共许可证 458

19.5.5 Mozilla公共许可证 459

第20章 未来:危机与机遇 461

20.1 Unix传统中的平质和偶然 461

20.2 Plan 9:未来之路 464

20.3 Unix设计中的问题 466

20.3.1 Unix文件就是一大袋字节 466

20.3.2 Unix对GUI的支持孱弱 467

20.3.3文件删除不可撤销 468

20.3.4 Unix假定文件系统是静态的 469

20.3.5作业控制设计拙劣 469

20.3.6 Unix API没有使用异常 470

20.3.7 ioctl(2)和fcntl(2)是个尴尬 471

20.3.8 Unix安全模型可能太过原始 471

20.3.9 Unix名字种类太多 472

20.3.10文件系统可能有害论 472

20.3.11朝向全局互联网地址空间 472

20.4 Unix的环境问题 473

20.5 Unix文化中的问题 475

20.6信任的理由 477

附录A缩写词表 479

附录B 参考文献 483

附录C贡献者 495

附录D无根的根:无名师的Unix心传 499

Colophon 510

索引 511

读者评论 527