“編譯原理”課程是一門理論性與實踐性非常強的課程,應遵循從具體到抽象的認知規律。本書以一個開源的C編譯器(UCC)為案例,在源代碼分析的過程中,展開對編譯原理相關知識的學習和討論。全書共分6章: 第1章介紹文法和遞歸等知識點,并采用結合C語言的方式來討論匯編代碼;第2章討論UCC編譯器的詞法分析、內存管理、符號表管理和類型系統等基本模塊;第3章介紹UCC編譯器的語法分析,采用的是手工打造分析器的技術路線;第4章介紹語義檢查,通過本章的學習,有助于C程序員站在編譯器的角度來深入理解C語言的語義規則;第5章分析UCC編譯器的中間代碼生成及優化;第6章介紹如何生成32位的x86匯編代碼。 本書不僅是很好的編譯原理和編譯器設計教材,也可作為讀者深入學習C程序設計的參考用書。
1)用C語言實現C編譯器。
(2)代碼簡潔易懂,結構清晰。
(3)遵循ANSIC89標準。
(4)本書以一個開源的C編譯器(UCC)為案例,在源代碼分析的過程中,展開對編譯原理相關知識的學習和討論。
(5)很好的編譯原理和編譯器設計教材,也是深入學習C程序設計的參考用書。
第1章基礎知識/1
1.1語言、文法與遞歸1
1.2一個較復雜的文法4
1.3由文法到分析器7
1.3.1表達式7
1.3.2聲明15
1.3.3語句21
1.4UCC編譯器預覽28
1.4.1UCC的使用28
1.4.2UCC驅動器31
1.5結合C語言來學匯編35
1.5.1匯編語言簡介35
1.5.2整數運算42
1.5.3浮點數的算術運算48
1.5.4浮點數之間的比較操作51
1.5.5指針、數組和結構體53
1.6C語言的變量名、數組名和函數名55
1.7C語言的變參函數58
1.8本章習題65
第2章UCC編譯器的基本模塊/66
2.1從Makefile走起66
2.2詞法分析69
2.3UCC編譯器的內存管理74
2.4C語言的類型系統81
2.5UCC編譯器的符號表管理91
2.6本章習題100
第3章語法分析/101
3.1C語言的表達式101〖1〗C編譯器剖析目錄[3]〖3〗3.1.1條件表達式和二元表達式101
3.1.2一元表達式、后綴表達式和基本表達式111
3.2C語言的語句122
3.3C語言的外部聲明131
3.3.1聲明和函數定義131
3.3.2與聲明有關的幾個非終結符142
3.3.3聲明說明符和聲明符147
3.4本章習題166
第4章語義檢查/167
4.1語義檢查簡介167
4.2表達式的語義檢查168
4.2.1表達式的語義檢查簡介168
4.2.2數組索引的語義檢查173
4.2.3基本表達式的語義檢查179
4.2.4函數調用的語義檢查184
4.2.5成員選擇運算符的語義檢查198
4.2.6相容類型201
4.2.7一元表達式的語義檢查209
4.2.8二元表達式、賦值表達式和條件表達式的語義檢查216
4.3語句的語義檢查226
4.4聲明的語義檢查231
4.4.1類型結構的構建231
4.4.2結構體的類型結構245
4.4.3結構體和數組的初始化255
4.4.4內部連接和外部連接267
4.4.5外部聲明的語義檢查270
4.5本章習題274
第5章中間代碼生成及優化/276
5.1中間代碼生成簡介276
5.2表達式的翻譯283
5.2.1布爾表達式的翻譯283
5.2.2公共子表達式293
5.2.3通過“偏移”訪問數組元素和結構體成員301
5.2.4后綴表達式的翻譯305
5.2.5賦值表達式的翻譯310
5.2.6一元表達式及其他表達式的翻譯317
5.3語句的翻譯319
5.3.1if語句和復合語句的翻譯319
5.3.2switch語句的翻譯324
5.4UCC編譯器的優化334
5.4.1刪除無用的臨時變量和優化跳轉目標334
5.4.2基本塊的合并339
5.5本章習題342
第6章匯編代碼生成/344
6.1匯編代碼生成簡介344
6.2寄存器的管理351
6.3中間代碼的翻譯358
6.3.1由中間代碼產生匯編指令的主要流程358
6.3.2為算術運算產生匯編代碼367
6.3.3為跳轉指令產生匯編代碼371
6.3.4為函數調用與返回產生匯編代碼375
6.3.5為類型轉換產生匯編代碼382
6.3.6為取地址產生匯編指令387
6.4本章習題390
參考文獻/391后記/3921.1軟件工程的發展歷程1
1.1.1軟件危機1
1.1.2軟件危機出現的原因3
1.1.3軟件工程的發展4
1.2軟件工程的概念5
1.2.1軟件工程的定義5
1.2.2軟件工程的目標6
1.2.3軟件工程的實施原則8
1.2.4軟件工程的基本原理9
1.3軟件與軟件過程10
1.3.1軟件的概念11
1.3.2軟件的分類12
1.3.3軟件生命周期13
1.3.4軟件過程15
1.4軟件過程模型16
1.4.1瀑布模型16
1.4.2原型模型17
1.4.3增量模型18
1.4.4螺旋模型19
1.4.5噴泉模型20
1.4.6敏捷過程模型20
1.4.74GT過程模型22
1.4.8基于構件的開發模型23
1.4.9Rational統一建模過程24
1.4.10微軟解決框架過程模型25
1.5軟件開發方法26
1.5.1結構化開發方法27
1.5.2面向對象開發方法271.6案例描述28
1.6.1簡歷信息自動獲取和查詢系統28
1.6.2試卷自動生成系統29
1.7本章小結30
習題31
第2章軟件需求工程/33
2.1軟件需求的基本概念33
2.1.1需求分析的任務33
2.1.2需求分析的原則34
2.1.3需求分析的內容35
2.2需求工程的過程36
2.2.1需求工程中的參與人員36
2.2.2可行性研究37
2.2.3需求工程過程中的活動39
2.2.4需求工程的管理40
2.3需求獲取技術41
2.4結構化需求分析和建模43
2.4.1結構化需求分析概述44
2.4.2面向數據的數據建模44
2.4.3面向數據流的功能建模46
2.4.4面向狀態轉換的行為建模50
2.4.5數據字典51
2.4.6加工邏輯53
2.5案例——“簡歷自動獲取和查詢系統”的需求建模54
2.5.1數據建模——ER圖描述54
2.5.2功能建模——數據流圖55
2.5.3行為建模——狀態轉換圖56
2.5.4數據字典57
2.5.5加工邏輯——PDL語言的描述57
2.6需求評審58
2.6.1軟件需求規格說明文檔58
2.6.2需求評審標準及需求驗證61
2.6.3需求變更管理63
2.7本章小結64
習題64
第3章軟件設計基礎/66
3.1軟件設計概述66
3.1.1軟件設計與軟件需求66
3.1.2軟件設計的任務67
3.1.3軟件設計的原則69
3.2軟件體系結構設計70
3.2.1體系結構設計概述70
3.2.2以數據為中心的數據倉庫模型70
3.2.3客戶端/服務器模式的分布式結構71
3.2.4層次模型73
3.2.5管道與過濾器模型74
3.3模塊化設計75
3.3.1軟件模塊化與分解75
3.3.2抽象76
3.3.3信息隱藏76
3.3.4模塊獨立性77
3.3.5啟發式規則79
3.4界面設計82
3.4.1界面設計的任務82
3.4.2界面設計的原則83
3.4.3界面設計的特性84
3.4.4MVC模型84
3.5軟件設計評審85
3.5.1軟件設計規格說明文檔85
3.5.2軟件設計評審標準89
3.5.3軟件設計驗證90
3.6本章小結91
習題92
第4章結構化設計方法/93
4.1結構化設計方法概述93
4.2面向數據流的設計方法94
4.2.1層次圖和結構圖94
4.2.2變換分析法96
4.2.3事務分析法100
4.2.4混合分析法101
4.3面向數據的設計方法102
4.3.1Jackson圖102
4.3.2Jackson系統開發方法103
4.4案例——“簡歷自動獲取和查詢系統”的數據流設計方法106
4.4.1用變換分析法進行設計106
4.4.2用事務分析法進行設計107
4.4.3兩種方法的比較108
4.5結構化詳細設計的工具109
4.5.1程序流程圖109
4.5.2盒圖(NS圖)110
4.5.3問題分析圖(PAD圖)111
4.5.4判定樹113
4.5.5判定表113
4.5.6詳細設計工具的比較114
4.6本章小結115
習題116
第5章軟件實現/118
5.1程序設計語言118
5.1.1程序設計語言的分類118
5.1.2程序設計語言的特性119
5.1.3選擇程序設計語言120
5.2程序設計風格122
5.2.1程序編排和組織的準則122
5.2.2程序設計的效率126
5.3代碼復用127
5.4代碼評審129
5.5本章小結132
習題133
第6章軟件測試/136
6.1軟件測試基礎136
6.1.1軟件測試概念136
6.1.2軟件測試過程模型137
6.1.3軟件測試原則139
6.1.4軟件測試在軟件開發各階段的工作流程141
6.1.5軟件測試信息流143
6.1.6軟件測試技術分類143
6.2白盒測試145
6.2.1邏輯覆蓋145
6.2.2循環測試148
6.2.3路徑測試149
6.3黑盒測試152
6.3.1等價類劃分152
6.3.2邊界值分析154
6.3.3錯誤推測法154
6.3.4因果圖法155
6.4白盒測試和黑盒測試的比較157
6.5軟件測試策略158
6.5.1單元測試158
6.5.2集成測試161
6.5.3確認測試164
6.5.4系統測試165
6.6調試167
6.6.1軟件調試過程167
6.6.2軟件調試方法168
6.7軟件測試報告169
6.7.1軟件測試說明169
6.7.2軟件測試報告170
6.8本章小結171
習題172
第7章UML統一建模語言/174
7.1UML的發展174
7.1.1UML的產生174
7.1.2UML的構成175
7.1.3UML的特點176
7.2面向對象的基本概念176
7.3UML視圖182
7.4UML的圖和模型元素183
7.4.1用例圖183
7.4.2類圖185
7.4.3包圖186
7.4.4狀態圖187
7.4.5活動圖187
7.4.6順序圖189
7.4.7協作圖190
7.4.8構件圖191
7.4.9配置圖192
7.5UML的關系192
7.5.1關聯關系193
7.5.2泛化關系196
7.5.3依賴關系199
7.5.4實現關系200
7.6UML的通用機制200
7.6.1修飾201
7.6.2注釋201
7.6.3規格說明201
7.6.4擴展機制202
7.7基于UML的軟件過程203
7.8本章小結205
習題206
第8章面向對象分析/207
8.1面向對象分析概述207
8.1.1傳統軟件過程中的不足207
8.1.2面向對象的特點208
8.1.3面向對象分析的基本過程209
8.1.4面向對象分析的3類模型209
8.1.5靜態模型的5個層次210
8.2建立功能模型(用例模型)211
8.2.1識別參與者212
8.2.2識別用例212
8.2.3識別用例間關系214
8.2.4用例描述文檔215
8.3建立靜態模型(對象模型)216
8.3.1識別類與對象216
8.3.2劃分主題218
8.3.3確定結構219
8.3.4確定屬性220
8.3.5確定服務221
8.3.6類圖描述文檔221
8.3.7包圖描述文檔222
8.4建立動態模型223
8.4.1建立順序圖及其描述文檔223
8.4.2建立狀態圖及其描述文檔225
8.4.3建立協作圖及其描述文檔226
8.4.4建立活動圖及其描述文檔227
8.5本章小結229
習題229
第9章面向對象設計/231
9.1面向對象設計概述231
9.1.1面向對象分析與設計的關系231
9.1.2面向對象設計原則232
9.2精化類及類間關系233
9.2.1設計類的屬性233
9.2.2設計類的方法234
9.2.3設計類間泛化關系235
9.2.4設計關聯類236
9.3數據設計237
9.3.1基于關系數據庫的數據設計237
9.3.2基于其他方式的數據設計239
9.4人機交互設計240
9.5建立實現模型241
9.5.1構件圖及其描述文檔241
9.5.2配置圖及其描述文檔243
9.6設計模式簡介244
9.6.1概述244
9.6.2Singleton模式245
9.6.3Abstract Factory模式247
9.6.4Mediator模式249
9.6.5Adapter模式251
9.6.6Iterator模式253
9.6.7State模式256
9.7面向對象的測試258
9.7.1面向對象測試概述258
9.7.2面向對象的單元測試259
9.8本章小結261
習題262
第10章軟件維護/265
10.1軟件維護概述265
10.1.1軟件維護的任務265
10.1.2軟件維護的特點266
10.1.3軟件維護的分類266
10.2軟件維護過程267
10.2.1軟件維護方式268
10.2.2軟件維護管理的基本內容269
10.2.3維護中存在的問題273
10.2.4維護活動記錄274
10.3軟件的可維護性275
10.3.1可維護性因素275
10.3.2提高軟件的可維護性276
10.4逆向工程278
10.5本章小結280
習題281
第11章軟件項目管理/282
11.1軟件項目管理概述282
11.1.1軟件項目管理的特點和內容282
11.1.2軟件項目管理目標283
11.1.3軟件項目管理的4P觀點284
11.2軟件項目規模度量285
11.2.1代碼行技術286
11.2.2功能點計算287
11.2.3代碼行與功能點間的轉換290
11.3軟件項目估算291
11.3.1代碼行和功能點的其他估算模型291
11.3.2專家估算模型291
11.3.3Putnam模型292
11.3.4COCOMO模型292
11.3.5項目估算模型的小結295
11.4項目進度管理295
11.4.1項目進度控制295
11.4.2甘特圖296
11.4.3工程網絡圖297
11.5項目風險管理298
11.5.1軟件風險概念299
11.5.2風險管理過程299
11.6項目質量管理302
11.6.1軟件質量因素303
11.6.2軟件質量保證活動307
11.6.3軟件質量保證計劃308
11.7軟件配置管理309
11.7.1軟件配置項310
11.7.2配置管理過程310
11.7.3軟件配置管理計劃313
11.8項目人員組織管理315
11.8.1團隊組織315
11.8.2團隊組織方式315
11.9軟件能力成熟度模型317
11.9.1基本概念317
11.9.2軟件能力成熟度模型等級319
11.9.3關鍵過程域319
11.10本章小結320
習題321
參考文獻/3231.6案例描述28
1.6.1簡歷信息自動獲取和查詢系統28
1.6.2試卷自動生成系統29
1.7本章小結30
習題31
第2章軟件需求工程/33
2.1軟件需求的基本概念33
2.1.1需求分析的任務33
2.1.2需求分析的原則34
2.1.3需求分析的內容35
2.2需求工程的過程36
2.2.1需求工程中的參與人員36
2.2.2可行性研究37
2.2.3需求工程過程中的活動39
2.2.4需求工程的管理40
2.3需求獲取技術41
2.4結構化需求分析和建模43
2.4.1結構化需求分析概述44
2.4.2面向數據的數據建模44
2.4.3面向數據流的功能建模46
2.4.4面向狀態轉換的行為建模50
2.4.5數據字典51
2.4.6加工邏輯53
2.5案例——“簡歷自動獲取和查詢系統”的需求建模54
2.5.1數據建模——ER圖描述54
2.5.2功能建模——數據流圖55
2.5.3行為建模——狀態轉換圖56
2.5.4數據字典57
2.5.5加工邏輯——PDL語言的描述57
2.6需求評審58
2.6.1軟件需求規格說明文檔58
2.6.2需求評審標準及需求驗證61
2.6.3需求變更管理63
2.7本章小結64
習題64第3章軟件設計基礎/66
3.1軟件設計概述66
3.1.1軟件設計與軟件需求66
3.1.2軟件設計的任務67
3.1.3軟件設計的原則69
3.2軟件體系結構設計70
3.2.1體系結構設計概述70
3.2.2以數據為中心的數據倉庫模型70
3.2.3客戶端/服務器模式的分布式結構71
3.2.4層次模型73
3.2.5管道與過濾器模型74
3.3模塊化設計75
3.3.1軟件模塊化與分解75
3.3.2抽象76
3.3.3信息隱藏76
3.3.4模塊獨立性77
3.3.5啟發式規則79
3.4界面設計82
3.4.1界面設計的任務82
3.4.2界面設計的原則83
3.4.3界面設計的特性84
3.4.4MVC模型84
3.5軟件設計評審85
3.5.1軟件設計規格說明文檔85
3.5.2軟件設計評審標準90
3.5.3軟件設計驗證91
3.6本章小結92
習題93
第4章結構化設計方法/94
習題117
第5章軟件實現/119
習題134
第6章軟件測試/137
習題173
第7章UML統一建模語言/175
習題207
第8章面向對象分析/208
習題230
第9章面向對象設計/232
習題263
第10章軟件維護/266
習題282
第11章軟件項目管理/283
習題322
參考文獻/324