內容簡介
這是一本很有特色的電腦程式設計方面的教材,它的核心是討論程式設計語言如何工作的問題,它是程式設計語言和編譯的傳統教科書的混合,再加上一些有關彙編層體系結構的材料,或以滿足那些沒有學過計算機組織的學生和需要。它不是綜述性語言的教科書,沒有列舉不同語言的細節,而集中通過各種語言的例子闡釋其基礎概念。本書也沒有解釋如何構造一個編譯器,只是解釋編譯器如何工作,它對源程式做了什麼,以及為什麼要那樣做。書的每章最後附有複習題和一些更具挑戰性的練習。這些練習的特別價值在於引導學生理解各種不常遇到的語言或者技術。 本書在美國使用已有十餘年,用於講授一門名為“軟體系統”的課程,適合高年級的本科生和一年級的研究生使用,書的內容對專業程式設計師也很有價值。本書作者是計算機領域的著名學者,譯者是北京大學的裘宗燕教授,他熟悉專業,譯筆流暢,是一本難得的著、譯雙馨的佳作。
作者簡介
Michael L. Scott是羅切斯特大學計算機科學系的教授,1996到1999年任系主任。1985年他由麥迪遜的威斯康星大學獲得博士學位,在那裡他是 Crystal和Charlotte研究組的成員。他的研究興趣在並行和分散式計算,包括作業系統、語言、體系結構和工具。他是Lynx分散式程式設計語言的設計者,與他人合作設計了Charlotte和Psyche並行作業系統、Bridge並行檔案系統、Cashmere分散式共享存儲系統。他與 Rice大學的John Mellor-Crummey合作設計的MCS互斥鎖被用在許多研究性的和商業性的系統里。
目錄
前言 xvii
第1章 引言 1
1.1 語言設計的藝術 3
1.2 程式設計語言的譜系 5
1.3 為什麼研究程式設計語言 7
1.4 編譯和解釋 9
1.5 程式設計環境 14
1.6 編譯概覽 15
1.6.1 詞法和語法分析 16
1.6.2 語義分析和中間代碼生成18
1.6.3 目標代碼生成 22
1.6.4 代碼改進 24
1.7 總結和註記 24
1.8 複習 25
1.9 練習 26
1.10 有關參考文獻 28
第2章 程式設計語言的語法 31
2.1 描述語法:正則表達式和上下文無關文法 32
2.1.1 單詞和正則表達式 33
2.1.2 上下文無關文法 34
.2.1.3 推導和語法分析樹 36
2.2 識別語法:掃描器和語法分析器39
2.2.1 掃描 40
2.2.2 自上而下和自下而上的語法分析 48
2.2.3 遞歸下降 51
2.2.4 語法錯誤 57
2.2.5 表格驅動的自上而下語法分析 62
2.2.6 自下而上的語法分析 75
2.3* 理論基礎 87
2.3.1有窮自動機88
2.3.2下推自動機92
2.3.3 文法和語言類 93
2.4 總結和註記 94
2.5 複習 97
2.6 練習 98
2.7 有關參考文獻 102
第3章 名字、作用域和約束 105
3.1 約束時間的概念 106
3.2 對象生存期和存儲管理 108
3.2.1 基於堆疊的分配 111
3.2.2 堆分配 113
3.2.3 廢料收集 114
3.3 作用域規則 115
3.3.1靜態作用域116
3.3.2 動態作用域 129
3.3.3 符號表 132
3.3.4 關聯表和中心引用表列 137
3.4 引用環境的約束 139
3.4.1 子程式閉包 141
3.4.2 一級和二級子程式 143
3.5 重載和相關概念 144
3.6 語言設計中與名字有關的缺陷 149
3.6.1 作用域規則 149
3.6.2 分別編譯 151
3.7 總結和註記 155
3.8 複習 157
3.9 練習 158
3.10 有關參考文獻 162
第4章 語義分析 165
4.1 語義分析器所扮演的角色 166
4.2屬性文法168
4.3 屬性流 170
4.4 動作例程 179
4.5 屬性的空間管理 180
4.5.1 自下而上求值 181
4.5.2 自上而下求值 186
4.6 語法樹的標註 191
4.7 總結和註記 197
4.8 複習 198
4.9 練習 199
4.10 有關參考文獻 202
第5章 彙編層計算機體系結構 203
5.1 工作站的微體系結構 204
5.2 存儲器層次結構 207
5.3 數據表示 209
5.3.1 整數算術211
5.3.2 浮點算術 212
5.4 指令集的體系結構 214
5.4.1 定址模式 215
5.4.2 條件分支 217
5.5 處理器體系結構的演化 218
5.5.1 兩個實例體系結構:680x0和mips 220
5.5.2 偽彙編記法形式 225
5.6 為新型處理器做編譯 227
5.6.1 維持流水線滿 227
5.6.2 暫存器分配 234
5.7 總結和註記 242
5.8 複習 243
5.9 練習 244
5.10 有關參考文獻 247
第6章 控制流 249
6.1 表達式求值 250
6.1.1 優先權和結合性 251
6.1.2 賦值 254
6.1.3 表達式里的順序 262
6.1.4短路求值265
6.2 結構化和非結構化的流程 267
6.3 順序複合 270
6.4 選擇 271
6.4.1 短路條件 272
6.4.2 分情況/開關語句 275
6.5 疊代 280
6.5.1 枚舉控制的循環 280
6.5.2 組合循環 286
6.5.3 疊代器 287
6.5.4 邏輯控制的循環 294
6.6 遞歸 297
6.6.1 疊代和遞歸 297
6.6.2 套用序和正則序求值 301
6.7 非確定性 303
6.8 總結和註記 308
6.9 複習 310
6.10 練習 311
6.11 有關參考文獻 316
第7章 數據類型 319
7.1 類型系統 320
7.1.1 類型的定義 322
7.1.2 類型的分類 323
7.2 類型檢查 330
7.2.1 類型等價 330
7.2.2 類型變換和轉換 334
7.2.3 類型相容和強制 337
7.2.4 類型推理 341
7.2.5 ml的類型系統 344
7.3 記錄(結構)與變體(聯合) 351
7.3.1 語法和操作 351
7.3.2 存儲布局和緊縮 353
7.3.3 with語句 355
7.3.4 變體記錄 358
7.4 數組 365
7.4.1 語法和操作 365
7.4.2 維數、上下界和分配 369
7.4.3 數組的布局 373
7.5 字元串 379
7.6 集合 381
7.7 指針和遞歸類型382
7.7.1 語法和操作 383
7.7.2 懸空引用 391
7.7.3 廢料收集 395
7.8 表 401
7.9 檔案和輸入/輸出 403
7.9.1 互動式i/o 404
7.9.2 基於檔案的i/o 405
7.9.3 正文i/o 407
7.10 相等檢測和賦值 414
7.11 總結和註記 416
7.12 複習 418
7.13 練習 420
7.14 有關參考文獻 425
第8章 子程式和控制抽象 427
8.1 重溫堆疊布局 428
8.2 調用序列 431
8.2.1 實例研究:在mips上實現c 434
8.2.2 實例研究:在680x0上實現pascal 437
8.2.3 線上展開 441
8.3 參數傳遞 442
8.3.1 參數模式 443
8.3.2 專用的參數 453
8.3.3 函式返回 457
8.4 通用型過程和模組 459
8.5 異常處理 464
8.5.1 異常的定義 466
8.5.2 異常的傳播 468
8.5.3 實例:遞歸下降語法分析中的短語層恢復 470
8.5.4 異常的實現 471
8.6 協作程式 474
8.6.1 堆疊分配 476
8.6.2 轉移 478
8.6.3 疊代器 479
8.6.4 實例:離散事件模擬 480
8.7 總結和註記 484
8.8 複習 485
8.9 練習 486
8.10 有關參考文獻 489
第9章 構造可運行程式 491
9.1 後端編譯器結構 491
9.1.1 一個實例 492
9.1.2 階段和遍 496
9.2 中間形式 496
9.2.1 diana 498
9.2.2 gnu的rtl 499
9.3 代碼生成 503
9.3.1 一個屬性文法實例 504
9.3.2 暫存器分配 504
9.4 地址空間組織 507
9.5 彙編 510
9.5.1 指令發射 511
9.5.2 為名字指定地址 514
9.6 連線 515
9.6.1 重定位和名字解析 515
9.6.2 類型檢查 516
9.7 動態連線 518
9.7.1 與定位無關的代碼 519
9.7.2 完全動態連線(惰性連線) 521
9.8 總結和註記 522
9.9 複習 523
9.10 練習 524
9.11 有關參考文獻 527
第10章 數據抽象和面向對象 529
10.1 面向對象的程式設計 530
10.2 封裝和繼承 539
10.2.1 模組 539
10.2.2 類 542
10.2.3 類型擴展 544
10.3 初始化和終結處理 546
10.3.1 構造函式的選擇 547
10.3.2 引用和值 550
10.3.3 執行順序 551
10.3.4 廢料收集 553
10.4 動態方法約束 554
10.4.1 虛函式和非虛函式 555
10.4.2 抽象類 557
10.4.3 成員查找 557
10.4.4 相關概念 561
10.5 多重繼承 564
10.5.1 語義歧義性 568
10.5.2 複本式繼承 570
10.5.3 共享繼承 572
10.5.4 混入式繼承 573
10.6 重溫面向對象的程式設計 574
10.6.1 smalltalk的對象模型 577
10.7 總結和註記 580
10.8 複習 582
10.9 練習 583
10.10 有關參考文獻 586
第11章 非命令式程式設計模型:函式式和邏輯式語言 589
11.1 歷史淵源 590
11.2函式式程式設計592
11.2.1 scheme簡介 594
11.2.2 重溫求值順序604
11.2.3 高階函式 609
11.2.4 理論基礎 612
11.2.5 函式式程式設計展望 622
11.3 邏輯式程式設計 624
11.3.1 prolog 625
11.3.2 理論基礎 641
11.3.3 邏輯式程式設計的展望 646
11.4 總結和註記 648
11.5 複習 650
11.6 練習 651
11.7 有關參考文獻 657
第12章 並發 659
12.1 基礎和動力 660
12.1.1 簡單歷史 660
12.1.2 多執行緒程式的不同情況 663
12.1.3 多處理器體系結構 667
12.2並發程式設計基礎 670
12.2.1 通信和同步 671
12.2.2 語言和庫 672
12.2.3 創建執行緒的語法 673
12.2.4 執行緒的實現 682
12.3 共享存儲器 687
12.3.1 忙等待同步 688
12.3.2 調度器的實現 692
12.3.3 基於調度的同步 694
12.3.4 隱式同步 703
12.4 訊息傳遞 706
12.4.1 通信對方的命名 706
12.4.2 傳送 710
12.4.3 接收 714
12.4.4遠程過程調用719
12.5 總結和註記 722
12.6 複習 724
12.7 練習 725
12.8 有關參考文獻 730
第13章 代碼改進 733
13.1 代碼最佳化的階段 735
13.2窺孔最佳化737
13.3 基本塊內的冗餘刪除 740
13.4 全局冗餘刪除和數據流分析 745
13.4.1 靜態單賦值形式和全局值編號 746
13.4.2 全局公共子表達式刪除 750
13.5 循環改進 i 755
13.5.1 循環不變數 755
13.5.2 歸納變數 756
13.6 指令調度 759
13.7 循環改進 ii 763
13.7.1 循環展開和軟體流水線 763
13.7.2 循環重排 767
13.8 暫存器分配 775
13.9 總結和註記 778
13.10 複習 780
13.11 練習 781
13.12 有關參考文獻 785
附錄a 本書中提到的程式設計語言 787
附錄b 語言設計和語言實現 795
參考書目 801
索引 827