深入理解軟體構造系統

t1157.1An s1478.1SCon f31515.4.1高層次工作流31515.4.2Autocon

內容介紹

構造系統在軟體開發過程中處於核心地位,它的正確性和性能,在一定程度上決定了軟體開發成果的質量和軟體開發過程的效率。本書作者作為一名軟體構造系統專家,總結了自己在構造系統開發和維護方面的多年經驗,對軟體構造系統的原理進行了深入淺出的剖析,並通過各種實際使用場景,對幾種最流行的構造工具進行了對比分析,另外還討論了構造系統的性能最佳化、規模提升等高級主題。
本書分為四部分。第一部分:基礎知識,第1~5章分別從構造系統的高層概念、基於Make的構造系統、程式的運行時視圖、檔案類型與編譯工具、子標的與構造變數等方面介紹構造系統的概念和相關主題。第二部分:構造工具,第6~10章結合實際場景案例,對GNU Make、Ant、SCons、CMake和Eclipse IDE這五種構造工具進行分析比較,品評優劣,幫助讀者了解構造工具的當前狀況,並理解每種工具的優缺點。第三部分:高級主題,第11~16章對依賴關係、元數據、軟體打包與安裝、構造機器、工具管理等高級主題進行討論,幫助讀者理解關於建設構造系統的許多高級主題,並了解最佳實踐。第四部分:提升規模,第17~19章討論了在大規模構造系統的環境下,如何降低複雜性,提高構造運行速度,幫助讀者理解如何設計出能夠適應規模增長的小型構造系統,從而對軟體構造系統有更好的認識。
本書適合軟體開發相關人員,包含軟體開發人員、項目經理、軟體構造專業人士等閱讀。

作品目錄

對本書的讚譽
譯者序
前 言
致 謝
作者介紹
第一部分 基礎知識
第1章 構造系統概述2
1.1 什麼是構造系統2
1.1.1 編譯型語言3
1.1.2 解釋型語言3
1.1.3 Web套用4
1.1.4 單元測試5
1.1.5 靜態分析5
1.1.6 文檔生成6
1.2 構造系統的各個組成部分6
1.2.1 版本控制工具7
1.2.2 源樹與目標樹7
1.2.3 編譯工具和構造工具8
1.2.4 構造機器9
1.2.5 發布打包與目標機器9
1.3 構造過程和構造描述11
1.4 如何使用構造系統12
構造管理工具12
1.5 構造系統的質量13
本章小結14
第2章 基於Make的構造系統15
2.1 Calculator示例15
2.2 創建一個簡單的makefile17
2.3 對這個makefile進行簡化19
2.4 額外的構造任務20
2.5 框架的運用21
本章小結23
第3章 程式的運行時視圖24
3.1 可執行程式24
3.1.1 原生機器碼25
3.1.2 單體系統鏡像25
3.1.3 程式完全解釋執行26
3.1.4 解釋型位元組碼26
3.2 程式庫28
3.2.1 靜態連結28
3.2.2 動態連結29
3.3 配置檔案和數據檔案30
3.4 分散式程式30
本章小結31
第4章 檔案類型與編譯工具33
4.1 C/C++34
4.1.1 編譯工具34
4.1.2 源檔案35
4.1.3 彙編語言檔案37
4.1.4 目標檔案38
4.1.5 可執行程式40
4.1.6 靜態程式庫40
4.1.7 動態程式庫41
4.1.8 C++編譯42
4.2 Java43
4.2.1 編譯工具43
4.2.2 源檔案44
4.2.3 目標檔案45
4.2.4 可執行程式47
4.2.5 程式庫48
4.3 C#48
4.3.1 編譯工具49
4.3.2 源檔案49
4.3.3 可執行程式51
4.3.4 程式庫53
4.4 其他檔案類型55
4.4.1 基於UML的代碼生成56
4.4.2 圖形圖像57
4.4.3 XML配置檔案58
4.4.4 國際化與資源綁定58
本章小結59
第5章 子標的與構造變數60
5.1 針對子標的進行構造61
5.2 針對軟體的不同版本進行構造62
5.2.1 指定構造變數63
5.2.2 對代碼的定製調整65
5.3 針對不同的目標系統架構進行構造68
5.3.1 多重編譯器68
5.3.2 面向指定平台的檔案/功能69
5.3.3 多個目標樹69
本章小結71
第二部分 構造工具
現實場景75
場景1:原始碼放在單個目錄中75
場景2:原始碼放在多個目錄中76
場景3:定義新的編譯工具76
場景4:針對多個變數進行構造77
場景5:清除構造樹77
場景6:對不正確的構造結果進行調試78
第6章 Make79
6.1 GNU Make程式語言80
6.1.1 makefile規則:用來建立依賴關係圖80
6.1.2 makefile規則的類型81
6.1.3 makefile變數82
6.1.4 內置變數和規則84
6.1.5 數據結構與函式85
6.1.6 理解程式流程87
6.1.7 進一步閱讀資料90
6.2 現實世界的構造系統場景90
6.2.1 場景1:原始碼放在單個目錄中90
6.2.2 場景2(a):原始碼放在多個目錄中92
6.2.3 場景2(b):對多個目錄進行疊代式Make操作93
6.2.4 場景2(c):對多個目錄進行包含式Make操作96
6.2.5 場景3:定義新的編譯工具101
6.2.6 場景4:針對多個變數進行構造102
6.2.7 場景5:清除構造樹104
6.2.8 場景6:對不正確的構造結果進行調試105
6.3 讚揚與批評107
6.3.1 讚揚107
6.3.2 批評108
6.3.3 評價109
6.4 其他類似工具110
6.4.1 Berkeley Make110
6.4.2 NMake111
6.4.3 ElectricAccelerator和Spark Build111
本章小結113
第7章 Ant115
7.1 Ant程式語言116
7.1.1 比“Hello World”稍多一些116
7.1.2 標的的定義和使用118
7.1.3 Ant的控制流119
7.1.4 屬性的定義120
7.1.5 內置的和可選的任務122
7.1.6 選擇多個檔案和目錄125
7.1.7 條件126
7.1.8 擴展Ant語言127
7.1.9 進一步閱讀資料128
7.2 現實世界的構造系統場景129
7.2.1 場景1:原始碼放在單個目錄中129
7.2.2 場景2(a):原始碼放在多個目錄中130
7.2.3 場景2(b):多個目錄,多個build.xml檔案130
7.2.4 場景3:定義新的編譯工具133
7.2.5 場景4:針對多個變數進行構造136
7.2.6 場景5:清除構造樹140
7.2.7 場景6:對不正確的構造結果進行調試141
7.3 讚揚與批評142
7.3.1 讚揚143
7.3.2 批評143
7.3.3 評價144
7.4 其他類似工具144
7.4.1 NAnt144
7.4.2 MS Build145
本章小結146
第8章 SCons147
8.1 SCons程式語言148
8.1.1 Python程式語言148
8.1.2 簡單編譯151
8.1.3 管理構造環境154
8.1.4 程式流程和依賴關係分析157
8.1.5 決定何時重新編譯158
8.1.6 擴展該語言160
8.1.7 其他有趣的特性162
8.1.8 進一步閱讀資料163
8.2 現實世界的構造系統場景163
8.2.1 場景1:原始碼放在單個目錄中163
8.2.2 場景2(a):原始碼放在多個目錄中163
8.2.3 場景2(b):多個SConstruct檔案164
8.2.4 場景3:定義新的編譯工具165
8.2.5 場景4:針對多個變數進行構造167
8.2.6 場景5:清除構造樹168
8.2.7 場景6:對不正確的構造結果進行調試169
8.3 讚揚與批評171
8.3.1 讚揚171
8.3.2 批評172
8.3.3 評價173
8.4 其他類似工具173
8.4.1 Cons173
8.4.2 Rake174
本章小結176
第9章 CMake177
9.1 CMake程式語言178
9.1.1 CMake語言基礎178
9.1.2 構造可執行程式和程式庫179
9.1.3 控制流182
9.1.4 跨平台支持184
9.1.5 生成原生構造系統185
9.1.6 其他有趣的特性以及進一步閱讀資料190
9.2 現實世界的構造系統場景191
9.2.1 場景1:原始碼放在單個目錄中191
9.2.2 場景2:原始碼放在多個目錄中191
9.2.3 場景3:定義新的編譯工具192
9.2.4 場景4:針對多個變數進行構造193
9.2.5 場景5:清除構造樹194
9.2.6 場景6:對不正確的構造結果進行調試194
9.3 讚揚與批評195
9.3.1 讚揚195
9.3.2 批評195
9.3.3 評價196
9.4 其他類似工具196
9.4.1 Automake196
9.4.2 Qmake197
本章小結197
第10章 Eclipse199
10.1 Eclipse的概念和GUI199
10.1.1 創建項目200
10.1.2 構造項目206
10.1.3 運行項目210
10.1.4 使用內部項目模型212
10.1.5 其他構造特性213
10.1.6 進一步閱讀資料214
10.2 現實世界的構造系統場景215
10.2.1 場景1:原始碼放在單個目錄中215
10.2.2 場景2:原始碼放在多個目錄中216
10.2.3 場景3:定義新的編譯工具217
10.2.4 場景4:針對多個變數進行構造217
10.2.5 場景5:清除構造樹220
10.2.6 場景6:對不正確的構造結果進行調試220
10.3 讚揚與批評221
10.3.1 讚揚221
10.3.2 批評221
10.3.3 評價222
10.4 其他類似工具222
本章小結224
第三部分 高級主題
第11章 依賴關係226
11.1 依賴關係圖227
11.1.1 增量式編譯228
11.1.2 完全、增量式和子標的構造228
11.2 依賴關係錯誤導致的問題229
11.2.1 問題:依賴關係缺失導致運行時錯誤229
11.2.2 問題:依賴關係缺失導致編譯錯誤230
11.2.3 問題:多餘的依賴關係導致大量不必要的重新構造231
11.2.4 問題:多餘的依賴關係導致依賴關係分析失敗231
11.2.5 問題:循環依賴關係232
11.2.6 問題:以隱式佇列順序替代依賴關係232
11.2.7 問題:Clean標的什麼也清除不了233
11.3 步驟一:計算依賴關係圖233
11.3.1 獲取確切的依賴關係234
11.3.2 把依賴關係圖快取起來236
11.3.3 對快取的依賴關係圖進行更新237
11.4 步驟二:判斷哪些檔案已過期239
11.4.1 基於時間戳的方法240
11.4.2 基於校驗和的方法241
11.4.3 標誌參數比較242
11.4.4 其他高級方法243
11.5 步驟三:為編譯步驟排定佇列順序243
本章小結246
第12章 運用元數據進行構造247
12.1 調試支持247
12.2 性能分析支持249
12.3 代碼覆蓋分析支持250
12.4 原始碼文檔化251
12.5 單元測試253
12.6 靜態分析256
12.7 向構造系統加入元數據257
本章小結258
第13章 軟體打包與安裝259
13.1 歸檔檔案260
13.1.1 用於打包的腳本260
13.1.2 其他歸檔檔案格式262
13.1.3 對打包腳本的改進263
13.2 包管理工具265
13.2.1 RPM包管理工具格式265
13.2.2 rpm build過程266
13.2.3 RPM規格檔案示例267
13.2.4 根據規格檔案創建RPM檔案272
13.2.5 安裝RPM示例274
13.3 定製式GUI安裝工具275
13.3.1 Nullsoft Scriptable Install System(NSIS)276
13.3.2 安裝工具腳本277
13.3.3 定義安裝頁面280
13.3.4 許可授權頁面281
13.3.5 選擇安裝目錄282
13.3.6 主要組件282
13.3.7 可選組件283
13.3.8 定製頁面285
13.3.9 安裝頁面和卸載程式286
本章小結288
第14章 版本管理289
14.1 對哪些東西進行版本控制290
14.1.1 構造描述檔案290
14.1.2 對工具的引用292
14.1.3 大型二進制檔案296
14.1.4 對源樹的配置296
14.2 哪些東西不應當放到源樹中297
14.2.1 生成的檔案被保存到源樹中297
14.2.2 生成的檔案被納入到版本控制中299
14.2.3 構造管理腳本299
14.3 版本編號300
14.3.1 版本編號體系300
14.3.2 協調並更新版本號301
14.3.3 版本號的保存與檢索302
本章小結303
第15章 構造機器305
15.1 原生編譯與跨平台編譯306
15.1.1 原生編譯306
15.1.2 跨平台編譯306
15.1.3 異構環境307
15.2 集中式開發環境307
15.2.1 構造機器為何有差異308
15.2.2 管理多個構造機器310
15.3 開源開發環境312
15.4 GNU Autoconf315
15.4.1 高層次工作流315
15.4.2 Autoconf示例317
15.4.3 運行autoheader和autoconf319
15.4.4 在構造機器上運行configure腳本320
15.4.5 使用配置信息322
本章小結323
第16章 工具管理324
16.1 工具管理的規則324
16.1.1 規則1:做筆記324
16.1.2 規則2:對原始碼進行版本控制325
16.1.3 規則3:定期升級工具326
16.1.4 規則4:對工具的二進制檔案進行版本控制327
16.1.5 對規則的破壞329
16.2 編寫自己的編譯工具329
用Lex和Yacc編寫定製工具330
本章小結332
第四部分 提升規模
第17章 降低最終用戶面對的複雜性334
17.1 構造框架334
17.1.1 面向開發人員的構造描述335
17.1.2 面向框架的構造描述336
17.1.3 慣例優先於配置336
17.1.4 構造工具示例:Maven337
17.2 避免支持多個構造變數的原因338
17.2.1 需要測試更多的構造變數338
17.2.2 代碼會變得混亂339
17.2.3 構造時間會增多340
17.2.4 需要更多磁碟空間340
17.3 降低複雜性的各種技術方法340
17.3.1 使用現代構造工具340
17.3.2 自動檢測依賴關係341
17.3.3 把生成的檔案放在源樹之外341
17.3.4 確保正確清除構造樹341
17.3.5 碰到第一個錯誤即中止構造342
17.3.6 提供有意義的錯誤信息343
17.3.7 校驗輸入參數343
17.3.8 不要把構造腳本搞得過分複雜344
17.3.9 避免使用晦澀的語言特性344
17.3.10 不要用環境變數控制構造過程345
17.3.11 確保構造形成的發布版與調試版保持相似345
17.3.12 準確顯示正在執行的命令346
17.3.13 把對工具的引用納入版本控制347
17.3.14 把構造指令納入版本控制347
17.3.15 自動檢測編譯標誌參數的變化347
17.3.16 不要在構造系統中調用版本控制工具347
17.3.17 儘量頻繁地進行持續集成348
17.3.18 統一使用一種構造機器348
17.3.19 統一使用一種編譯器348
17.3.20 避免遺留#ifdefs的垃圾代碼348
17.3.21 使用有意義的符號名349
17.3.22 刪除垃圾代碼349
17.3.23 不要複製源檔案350
17.3.24 使用統一的構造系統350
17.4 對構造系統進行規劃充分、人力充足的改進351
本章小結352
第18章 管理構造規模353
18.1 單體模型構造存在的問題354
18.2 組件式軟體355
18.2.1 使用組件的好處357
18.2.2 組件到底是什麼358
18.2.3 把多個組件集成到單個產品中361
18.3 人員和過程管理364
18.3.1 開發團隊的結構365
18.3.2 組件版本佇列管理367
18.3.3 管理組件快取368
18.3.4 協調軟體新特性的開發370
18.4 Apache Ivy372
本章小結373
第19章 更快的構造375
19.1 度量構造系統性能375
19.1.1 啟動階段的性能度量375
19.1.2 編譯階段的性能度量382
19.1.3 性能度量工具386
19.1.4 修正問題:改進性能388
19.2 構造減免:消除不必要的重新構造389
19.2.1 目標檔案快取389
19.2.2 智慧型依賴關係391
19.2.3 構造減免的其他技術方法395
19.3 並行396
19.3.1 構造集群/雲396
19.3.2 並行構造工具397
19.3.3 對可伸縮性的限制398
19.4 減少磁碟使用398
本章小結400
參考文獻401

相關詞條

熱門詞條

聯絡我們