《傳世經(jīng)典書叢:UNIX編程藝術(shù)》主要介紹了Unix系統(tǒng)領(lǐng)域中的設(shè)計(jì)和開發(fā)哲學(xué)、思想文化體系、原則與經(jīng)驗(yàn),由公認(rèn)的Unix編程大師、開源運(yùn)動(dòng)領(lǐng)袖人物之一Eric S.Raymond傾力多年寫作而成。包括Unix設(shè)計(jì)者在內(nèi)的多位領(lǐng)域?qū)<乙矠楸緯暙I(xiàn)了寶貴的內(nèi)容。本書內(nèi)容涉及社群文化、軟件開發(fā)設(shè)計(jì)與實(shí)現(xiàn),覆蓋面廣、內(nèi)容深邃,完全展現(xiàn)了作者極其深厚的經(jīng)驗(yàn)積累和領(lǐng)域智慧。
序
Part I
第1章 哲學(xué)
1.1 文化?什么文化
1.2 Unix的生命力
1.3 反對(duì)學(xué)習(xí)Unix文化的理由
1.4 Unix之失
1.5 Unix之得
1.5.1 開源軟件
1.5.2 跨平臺(tái)可移植性和開放標(biāo)準(zhǔn)
1.5.3 Internet和萬(wàn)維網(wǎng)
1.5.4 開源社區(qū)
1.5.5 從頭到腳的靈活性
1.5.6 Unix Hack之趣
1.5.7 Unix的經(jīng)驗(yàn)別處也可適用
1.6 Unix哲學(xué)基礎(chǔ)
1.6.1 模塊原則:使用簡(jiǎn)潔的接口拼合簡(jiǎn)單的部件
1.6.2 清晰原則:清晰勝于機(jī)巧
1.6.3 組合原則:設(shè)計(jì)時(shí)考慮拼接組合
1.6.4 分離原則:策略同機(jī)制分離,接口同引擎分離
1.6.5 簡(jiǎn)潔原則:設(shè)計(jì)要簡(jiǎn)潔,復(fù)雜度能低則低
1.6.6 吝嗇原則:除非確無(wú)它法,不要編寫龐大的程序
1.6.7 透明性原則:設(shè)計(jì)要可見(jiàn),以便審查和調(diào)試
1.6.8 健壯原則:健壯源于透明與簡(jiǎn)潔
1.6.9 表示原則:把知識(shí)疊入數(shù)據(jù)以求邏輯質(zhì)樸而健壯
1.6.10 通俗原則:接口設(shè)計(jì)避免標(biāo)新立異
1.6.11 緘默原則:如果一個(gè)程序沒(méi)什么好說(shuō)的,就保持沉默
1.6.12 補(bǔ)救原則:出現(xiàn)異常時(shí),馬上退出并給出足量錯(cuò)誤信息
1.6.13 經(jīng)濟(jì)原則:寧花機(jī)器一分,不花程序員一秒
1.6.14 生成原則:避免手工hack,盡量編寫程序去生成程序
1.6.15 優(yōu)化原則:雕琢前先得有原型,跑之前先學(xué)會(huì)走
1.6.16 多樣原則:決不相信所謂“不二法門”的斷言
1.6.17 擴(kuò)展原則:設(shè)計(jì)著眼未來(lái),未來(lái)總比預(yù)想快
1.7 Unix哲學(xué)之一言以蔽之
1.8 應(yīng)用Unix哲學(xué)
1.9 態(tài)度也要緊
第2章 歷史——雙流記
2.1 Unix的起源及歷史,1969-1995
2.1.1 創(chuàng)世紀(jì):1969-1971
2.1.2 出埃及記:1971-1980
2.1.3 TCP/IP 和Unix內(nèi)戰(zhàn):1980-1990
2.1.4 反擊帝國(guó):1991-1995
2.2 黑客的起源和歷史:1961-1995
2.2.1 游戲在校園的林間:1961-1980
2.2.2 互聯(lián)網(wǎng)大融合與自由軟件運(yùn)動(dòng):1981-1991
2.2.3 Linux 和實(shí)用主義者的應(yīng)對(duì):1991-1998
2.3 開源運(yùn)動(dòng):1998年及之后
2.4 Unix的歷史教訓(xùn)
第3章 對(duì)比:Unix哲學(xué)同其他哲學(xué)的比較
3.1 操作系統(tǒng)的風(fēng)格元素
3.1.1 什么是操作系統(tǒng)的統(tǒng)一性理念
3.1.2 多任務(wù)能力
3.1.3 協(xié)作進(jìn)程
3.1.4 內(nèi)部邊界
3.1.5 文件屬性和記錄結(jié)構(gòu)
3.1.6 二進(jìn)制文件格式
3.1.7 首選用戶界面風(fēng)格
3.1.8 目標(biāo)受眾
3.1.9 開發(fā)的門坎
3.2 操作系統(tǒng)的比較
3.2.1 VMS
3.2.2 MacOS
3.2.3 OS/2
3.2.4 Windows NT
3.2.5 BeOS
3.2.6 MVS
3.2.7 VM/CMS
3.2.8 Linux
3.3 種什么籽,得什么果
Part II
第4章 模塊性:保持清晰,保持簡(jiǎn)潔
4.1 封裝和最佳模塊大小
4.2 緊湊性和正交性
4.2.1 緊湊性
4.2.2 正交性
4.2.3 SPOT原則
4.2.4 緊湊性和強(qiáng)單一中心
4.2.5 分離的價(jià)值
4.3 軟件是多層的
4.3.1 自頂向下和自底向上
4.3.2 膠合層
4.3.3 實(shí)例分析:被視為薄膠合層的C語(yǔ)言
4.4 程序庫(kù)
4.4.1 實(shí)例分析:GIMP插件
4.5 Unix和面向?qū)ο笳Z(yǔ)言
4.6 模塊式編碼
第5章 文本化:好協(xié)議產(chǎn)生好實(shí)踐
5.1 文本化的重要性
5.1.1 實(shí)例分析:Unix口令文件格式
5.1.2 實(shí)例分析:.newsrc格式
5.1.3 實(shí)例分析:PNG圖形文件格式
5.2 數(shù)據(jù)文件元格式
5.2.1 DSV 風(fēng)格
5.2.2 RFC 822 格式
5.2.3 Cookie-Jar格式
5.2.4 Record-Jar格式
5.2.5 XML
5.2.6 Windows INI 格式
5.2.7 Unix文本文件格式的約定
5.2.8 文件壓縮的利弊
5.3 應(yīng)用協(xié)議設(shè)計(jì)
5.3.1 實(shí)例分析:SMTP,一個(gè)簡(jiǎn)單的套接字協(xié)議
5.3.2 實(shí)例分析:POP3,郵局協(xié)議
5.3.3 實(shí)例分析:IMAP,互聯(lián)網(wǎng)消息訪問(wèn)協(xié)議
5.4 應(yīng)用協(xié)議元格式
5.4.1 經(jīng)典的互聯(lián)網(wǎng)應(yīng)用元協(xié)議
5.4.2 作為通用應(yīng)用協(xié)議的HTTP
5.4.3 BEEP:塊可擴(kuò)展交換協(xié)議
5.4.4 XML-RPC,SOAP和Jabber
第6章 透明性:來(lái)點(diǎn)兒光
6.1 研究實(shí)例
6.1.1 實(shí)例分析:audacity
6.1.2 實(shí)例分析:fetchmail的-v選項(xiàng)
6.1.3 實(shí)例分析:GCC
6.1.4 實(shí)例分析:kmail
6.1.5 實(shí)例分析:SNG
6.1.6 實(shí)例分析:Terminfo數(shù)據(jù)庫(kù)
6.1.7 實(shí)例分析:Freeciv數(shù)據(jù)文件
6.2 為透明性和可顯性而設(shè)計(jì)
6.2.1 透明性之禪
6.2.2 為透明性和可顯性而編碼
6.2.3 透明性和避免過(guò)度保護(hù)
6.2.4 透明性和可編輯的表現(xiàn)形式
6.2.5 透明性、故障診斷和故障恢復(fù)
6.3 為可維護(hù)性而設(shè)計(jì)
第7章 多道程序設(shè)計(jì):分離進(jìn)程為獨(dú)立的功能
7.1 從性能調(diào)整中分離復(fù)雜度控制
7.2 Unix IPC 方法的分類
7.2.1 把任務(wù)轉(zhuǎn)給專門程序
7.2.2 管道、重定向和過(guò)濾器
7.2.3 包裝器
7.2.4 安全性包裝器和Bernstein鏈
7.2.5 從進(jìn)程
7.2.6 對(duì)等進(jìn)程間通信
7.3 要避免的問(wèn)題和方法
7.3.1 廢棄的Unix IPC方法
7.3.2 遠(yuǎn)程過(guò)程調(diào)用
7.3.3 線程——恐嚇或威脅
7.4 在設(shè)計(jì)層次上的進(jìn)程劃分
第8章 微型語(yǔ)言:尋找歌唱的樂(lè)符
8.1 理解語(yǔ)言分類法
8.2 應(yīng)用微型語(yǔ)言
8.2.1 案例分析:sng
8.2.2 案例分析:正則表達(dá)式
8.2.3 案例分析:Glade
8.2.4 案例分析:m4
8.2.5 案例分析:XSLT
8.2.6 案例分析:The Documenter's Workbench Tools
8.2.7 案例分析:fetchmail的運(yùn)行控制語(yǔ)法
8.2.8 案例分析:awk
8.2.9 案例分析:PostScript
8.2.10 案例分析:bc和dc
8.2.11 案例分析:Emacs Lisp
8.2.12 案例分析:JavaScript
8.3 設(shè)計(jì)微型語(yǔ)言
8.3.1 選擇正確的復(fù)雜度
8.3.2 擴(kuò)展和嵌入語(yǔ)言
8.3.3 編寫自定義語(yǔ)法
8.3.4 宏-慎用
8.3.5 語(yǔ)言還是應(yīng)用協(xié)議
第9章 生成:提升規(guī)格說(shuō)明的層次
9.1 數(shù)據(jù)驅(qū)動(dòng)編程
9.1.1 實(shí)例分析:ascii
9.1.2 實(shí)例分析:統(tǒng)計(jì)學(xué)的垃圾郵件統(tǒng)計(jì)
9.1.3 實(shí)例分析:fetchmailconf中的元類改動(dòng)
9.2 專用代碼的生成
9.2.1 實(shí)例分析:生成ascii顯示的代碼
9.2.2 實(shí)例分析:為列表生成HTML代碼
第10章 配置:邁出正確的第一步
10.1 什么應(yīng)是可配置的
10.2 配置在哪里
10.3 運(yùn)行控制文件
10.3.1 實(shí)例分析:.netrc文件
10.3.2 到其它操作系統(tǒng)的可移植性
10.4 環(huán)境變量
10.4.1 系統(tǒng)環(huán)境變量
10.4.2 用戶環(huán)境變量
10.4.3 何時(shí)使用環(huán)境變量
10.4.4 到其它操作系統(tǒng)的可移植性
10.5 命令行選項(xiàng)
10.5.1 從-a到-z的命令行選項(xiàng)
10.5.2 到其它操作系統(tǒng)的可移植性
10.6 如何挑選方法
10.6.1 實(shí)例分析:fetchmail
10.6.2 實(shí)例分析:XFree86服務(wù)器
10.7 論打破規(guī)則
第11章 接口:Unix環(huán)境下的用戶接口設(shè)計(jì)模式
第12章 優(yōu)化
第13章 復(fù)雜度:盡可能簡(jiǎn)單,但別簡(jiǎn)單過(guò)了頭
Part Ⅲ
第14章 語(yǔ)言:C還是非C
第15章 工具:開發(fā)的戰(zhàn)術(shù)
第16章 重用:論不要重新發(fā)明輪子
Part Ⅳ
第17章 可移植性:軟件可移植性與遵循標(biāo)準(zhǔn)
第18章 文檔:向網(wǎng)絡(luò)世界闡釋代碼
第19章 開放源碼:在Unix新社區(qū)中編程
第20章 未來(lái):危機(jī)與機(jī)遇
附錄A 縮寫詞表
附錄B 參考文獻(xiàn)
附錄C 貢獻(xiàn)者
附錄D 無(wú)根的根:無(wú)名師的Unix心傳
Colophon
索引
讀者評(píng)論
terminfo本身使用文件系統(tǒng)作為一個(gè)簡(jiǎn)單的層級(jí)數(shù)據(jù)庫(kù)。這種偷懶相當(dāng)具有建設(shè)性,符合經(jīng)濟(jì)性原則和透明性原則。這意味著對(duì)文件系統(tǒng)進(jìn)行瀏覽、檢查和修改的所有普通工具都可以用于對(duì)terminfo數(shù)據(jù)庫(kù)進(jìn)行瀏覽、檢查和修改;無(wú)需編寫和調(diào)試專用工具(用于打包和解包單個(gè)記錄的tic(1)和infocmp(1)工具除外)。這也意味著要加速數(shù)據(jù)庫(kù)的訪問(wèn)就得要加速文件系統(tǒng)本身,知道這一點(diǎn)可以使更多應(yīng)用程序受益,而不僅僅是curses(3)的用戶。
這種結(jié)構(gòu)還有另外一種優(yōu)點(diǎn),但在terminfo例子中沒(méi)有展示出來(lái):你開始使用Unix的授權(quán)機(jī)制而不用自己編寫帶來(lái)額外bu9的訪問(wèn)控制層。這也是采納而不是對(duì)抗Unix“一切皆文件”基本原則的結(jié)果。
terminfo目錄的布局在大多數(shù)Unix文件系統(tǒng)上都很浪費(fèi)空間。每條目長(zhǎng)度通常在400~1400字節(jié)之間,但是文件系統(tǒng)通常為每一個(gè)非空磁盤文件至少分配4k的空間。出于選擇壓縮二進(jìn)制格式的同一個(gè)原因,即為了把terminfo使用的程序的啟動(dòng)延時(shí)降到最小,設(shè)計(jì)者接受了這個(gè)代價(jià)。同一價(jià)格所能買到的磁盤容量已經(jīng)猛增了一千倍,更能證明這個(gè)決定的正確。
比較這種格式和Microcsoft Windows的注冊(cè)表文件所用的格式很有啟發(fā)意義。注冊(cè)表是Windows本身及應(yīng)用程序都使用的屬性數(shù)據(jù)庫(kù)。所有注冊(cè)記錄都存放在一個(gè)大文件中。注冊(cè)記錄既包含文本也包含二進(jìn)制數(shù)據(jù),需要專用的編輯工具。別的不說(shuō),這種“一個(gè)大文件”的方法還導(dǎo)致了臭名昭著的“注冊(cè)表蠕變”現(xiàn)象;平均訪問(wèn)時(shí)間隨著新記錄的加入而無(wú)限上升。因?yàn)橄到y(tǒng)沒(méi)有提供標(biāo)準(zhǔn)APl來(lái)編輯注冊(cè)表,應(yīng)用程序本身使用專用代碼編輯注冊(cè)表,使得注冊(cè)表極易受損,甚至能夠鎖定整個(gè)系統(tǒng)。
使用Unix文件系統(tǒng)作為數(shù)據(jù)庫(kù)是一種策略,對(duì)數(shù)據(jù)庫(kù)要求簡(jiǎn)單的其它應(yīng)用程序可以效仿并從中受益。不這樣做的充分理由通常與性能問(wèn)題無(wú)關(guān),更可能的情形是數(shù)據(jù)庫(kù)關(guān)鍵字不太適合做文件名。無(wú)論如何,這是在原型設(shè)計(jì)時(shí)非常有用的一種很好的快速編程方法。
6.1.7 實(shí)例分析:Freeciv數(shù)據(jù)文件
Freeciv是一款受到Sid Meier經(jīng)典的Civilization H啟發(fā)而制作的開源策略游戲。在該游戲中,每個(gè)玩家從一群到處流浪的新石器游牧民開始締造一個(gè)文明。玩家的文明可以探索并拓殖世界,參與戰(zhàn)爭(zhēng),從事貿(mào)易和研究先進(jìn)技術(shù)。有些玩家實(shí)際上可能是人工智能;和這些電腦玩家玩單機(jī)游戲很有挑戰(zhàn)性。如果誰(shuí)統(tǒng)治了整個(gè)世界,或者第一個(gè)研制出先進(jìn)技術(shù)從而獲得宇宙飛船飛往半人馬座阿爾法星(Alpha Centauri),誰(shuí)就是游戲的勝利者。源碼和文檔可以在處獲得。
……