程序設計語言原理, 12/e (Concepts of Programming Languages, 12/e)

Robert W. Sebesta 譯 徐寶文,王子元,周曉宇 等

買這商品的人也買了...

商品描述

本書從為什麼學習程序設計語言、常用程序設計語言的演化史、
評估程序設計語言結構的標準,以及這些語言基本的實現方法開始講起,
通過不局限於特定語言種類地分析語言結構的設計問題,檢測設計選擇,
以及比較設計可選方案來講述程序設計語言基本原理。

作者簡介

Robert W. Sebesta
科羅拉多大學斯普林斯分校計算機科學系榮休副教授,
擁有40多年計算機科學課程教學經驗,研究興趣包括程序設計語言的設計和評估以及Web程序設計。

目錄大綱

譯者序
第12版的變化
前言
致謝
第1章 預備知識1
1.1 掌握程序設計語言概念的必要性1
1.2 程序設計領域3
1.2.1 科學計算應用3
1.2.2 商業應用3
1.2.3 人工智能4
1.2.4 Web軟件4
1.3 語言評價標準4
1.3.1 可讀性5
1.3.2 可寫性9
1.3.3 可靠性9
1.3.4 成本10
1.4 影響語言設計的因素11
1.4.1 計算機體系結構11
1.4.2 程序設計方法學13
1.5 程序設計語言分類14
1.6 語言設計中的權衡14
1.7 實現方法15
1.7.1 編譯16
1.7.2 純解釋18
1.7.3 混合實現系統19
1.7.4 預處理程序19
1.8 程序設計環境20
小結20
複習題21
習題21
第2章 主要程序設計語言發展簡史23
2.1 Zuse研製的Plankalkül語言23
2.1.1 歷史背景23
2.1.2 語言概述25
2.2 偽代碼25
2.2.1 短碼26
2.2.2 快碼26
2.2.3 UNIVAC編譯系統27
2.2.4 相關工作27
2.3 IBM 704和Fortran27
2.3.1 歷史背景27
2.3.2 設計過程28
2.3.3 Fortran I概述28
2.3.4 Fortran II29
2.3.5 Fortran IV、77、90、95、2003和200829
2.3.6 評價30
2.4 函數式程序設計語言:LISP31
2.4.1 人工智能的開端和列表處理31
2.4.2 LISP的設計過程32
2.4.3 語言概述32
2.4.4 評價33
2.4.5 LISP的兩種後繼語言34
2.4.6 相關語言34
2.5 邁向成熟的第一步:ALGOL 6035
2.5.1 歷史背景35
2.5.2 早期設計過程35
2.5.3 ALGOL 58概述36
2.5.4 ALGOL 58報告的接受度37
2.5.5 ALGOL 60的設計過程37
2.5.6 ALGOL 60概述37
2.5.7 評價38
2.6 商業處理語言:COBOL39
2.6.1 歷史背景39
2.6.2 FLOW-MATIC40
2.6.3 COBOL的設計過程40
2.6.4 評價40
2.7 分時處理的開始:Basic42
2.7.1 設計過程43
2.7.2 語言概述43
2.7.3 評價43
2.8 滿足所有人的需求:PL/I46
2.8.1 歷史背景47
2.8.2 設計過程47
2.8.3 語言概述48
2.8.4 評價48
2.9 兩種早期的動態語言:APL和SNOBOL49
2.9.1 APL的起源及特徵49
2.9.2 SNOBOL的起源和特徵50
2.10 數據抽象的開端:SIMULA 6750
2.10.1 設計過程50
2.10.2 語言概述50
2.11 正交設計:ALGOL 6850
2.11.1 設計過程51
2.11.2 語言概述51
2.11.3 評價51
2.12 ALGOL系列語言的早期繼承者52
2.12.1 簡潔的設計:Pascal52
2.12.2 一個輕便的系統語言:C53
2.13 基於邏輯的程序設計:Prolog55
2.13.1 設計過程55
2.13.2 語言概述55
2.13.3 評價56
2.14 歷史上規模最大的語言設計:Ada56
2.14.1 歷史背景56
2.14.2 設計過程56
2.14.3 語言概述57
2.14.4 評價58
2.14.5 Ada 95和Ada 200558
2.15 面向對象程序設計:Smalltalk59
2.15.1 設計過程59
2.15.2 語言概述60
2.15.3 評價60
2.16 結合命令式和麵向對象的特性:C++61
2.16.1 設計過程61
2.16.2 語言概述62
2.16.3 評價62
2.16.4 Swift:Objective-C的替代品62
2.16.5 另一個相關語言:Delphi63
2.17 基於命令式的面向對象語言:Java63
2.17.1 設計過程63
2.17.2 語言概述64
2.17.3 評價65
2.18 腳本語言66
2.18.1 Perl的起源與特點66
2.18.2 JavaScript的起源與特點67
2.18.3 PHP的起源與特點69
2.18.4 Python的起源與特點69
2.18.5 Ruby的起源與特點70
2.19 .NET旗幟語言:C#70
2.19.1 設計過程70
2.19.2 語言概述71
2.19.3 評價71
2.20 混合標記程序設計語言72
2.20.1 XSLT72
2.20.2 JSP73
小結74
文獻註記74
複習題74
習題76
程序設計練習76
第3章 語法和語義描述77
3.1 概述77
3.2 語法描述的一般問題78
3.2.1 語言識別器78
3.2.2 語言生成器79
3.3 語法描述的形式化方法79
3.3.1 Backus-Naur範式與上下文無關文法79
3.3.2 擴展的BNF範式88
3.3.3 文法和識別器90
3.4 屬性文法90
3.4.1 靜態語義90
3.4.2 基本概念91
3.4.3 屬性文法的定義91
3.4.4 內在屬性91
3.4.5 屬性文法示例91
3.4.6 計算屬性值93
3.4.7 評價94
3.5 描述程序的含義:動態語義94
3.5.1 操作語義95
3.5.2 指稱語義97
3.5.3 公理語義100
小結110
文獻註記110
複習題110
習題111
第4章 詞法和語法分析115
4.1 概述115
4.2 詞法分析116
4.3 語法分析問題122
4.3.1 語法分析基礎122
4.3.2 自頂向下的語法分析器123
4.3.3 自底向上的語法分析器124
4.3.4 語法分析的複雜度124
4.4 遞歸下降的語法分析124
4.4.1 遞歸下降的語法分析過程124
4.4.2 LL文法類129
4.5 自底向上的語法分析131
4.5.1 自底向上的語法分析器的語法分析問題131
4.5.2 移進-歸約算法133
4.5.3 LR語法分析器133
小結137
複習題138
習題138
程序設計練習139
第5章 名字、綁定與作用域140
5.1 概述140
5.2 名字140
5.2.1 設計問題140
5.2.2 名字形式141
5.2.3 特殊單詞141
5.3 變量142
5.3.1 名字142
5.3.2 地址142
5.3.3 類型143
5.3.4 值143
5.4 綁定的概念143
5.4.1 屬性到變量的綁定144
5.4.2 綁定類型144
5.4.3 存儲綁定和生存期147
5.5 作用域149
5.5.1 靜態作用域149
5.5.2 分程序150
5.5.3 聲明順序153
5.5.4 全局作用域153
5.5.5 對靜態作用域的評價156
5.5.6 動態作用域156
5.5.7 對動態作用域的評價157
5.6 作用域和生存期157
5.7 引用環境158
5.8 有名常量159
小結161
複習題161
習題162
程序設計練習165
第6章 數據類型167
6.1 概述167
6.2 基本數據類型168
6.2.1 數值類型168
6.2.2 布爾類型170
6.2.3 字符類型171
6.3 字符串類型171
6.3.1 設計問題171
6.3.2 字符串及其運算171
6.3.3 字符串長度選項173
6.3.4 評價173
6.3.5 字符串類型的實現174
6.4 枚舉類型175
6.4.1 設計問題175
6.4.2 設計175
6.4.3 評價176
6.5 數組類型177
6.5.1 設計問題177
6.5.2 數組和索引178
6.5.3 下標綁定和數組的種類179
6.5.4 數組初始化180
6.5.5 數組運算181
6.5.6 矩陣數組和鋸齒形數組182
6.5.7 切片182
6.5.8 評價183
6.5.9 數組類型的實現183
6.6 關聯數組185
6.6.1 結構與運算185
6.6.2 關聯數組的實現186
6.7 記錄類型186
6.7.1 記錄的定義187
6.7.2 記錄中字段的引用187
6.7.3 評價188
6.7.4 記錄類型的實現188
6.8 元組類型189
6.9 列表類型190
6.10 聯合類型192
6.10.1 設計問題192
6.10.2 判別式與自由聯合類型192
6.10.3 F#的聯合類型193
6.10.4 評價193
6.10.5 聯合類型的實現194
6.11 指針和引用類型194
6.11.1 設計問題194
6.11.2 指針運算194
6.11.3 指針的相關問題195
6.11.4 C和C++中的指針196
6.11.5 引用類型198
6.11.6 評價199
6.11.7 指針和引用類型的實現199
6.12 可選類型203
6.13 類型檢查203
6.14 強類型204
6.15 類型等價205
6.16 理論和數據類型208
小結209
文獻註記210
複習題210
習題211
程序設計練習212
第7章 表達式與賦值語句214
7.1 概述214
7.2 算術表達式214
7.2.1 運算符求值順序215
7.2.2 運算分量求值順序219
7.3 重載運算符221
7.4 類型轉換222
7.4.1 表達式中的強制轉換222
7.4.2 顯式類型轉換223
7.4.3 表達式錯誤224
7.5 關係表達式和布爾表達式224
7.5.1 關係表達式224
7.5.2 布爾表達式225
7.6 短路求值226
7.7 賦值語句227
7.7.1 簡單賦值227
7.7.2 條件賦值227
7.7.3 複合賦值運算符227
7.7.4 一元賦值運算符228
7.7.5 賦值表達式229
7.7.6 多重賦值229
7.7.7 函數式程序設計語言中的賦值230
7.8 混合方式賦值230
小結231
複習題231
習題232
程序設計練習233
第8章 語句級控制結構234
8.1 概述234
8.2 選擇語句235
8.2.1 二路選擇語句235
8.2.2 多路選擇語句238
8.3 重複語句244
8.3.1 計數控制循環245
8.3.2 邏輯控制循環248
8.3.3 用戶定義的循環控制機制249
8.3.4 基於數據結構的迭代250
8.4 無條件分支253
8.5 保護命令254
8.6 結論256
小結256
複習題257
習題257
程序設計練習258
第9章 子程序260
9.1 概述260
9.2 子程序基礎260
9.2.1 子程序的一般性質260
9.2.2 基本定義260
9.2.3 參數262
9.2.4 過程與函數265
9.3 子程序的設計問題265
9.4 局部引用環境266
9.4.1 局部變量266
9.4.2 嵌套子程序267
9.5 參數傳遞方法267
9.5.1 參數傳遞的語義模型268
9.5.2 參數傳遞的實現模型268
9.5.3 參數傳遞方法的實現272
9.5.4 常用語言的參數傳遞方法272
9.5.5 參數類型檢查274
9.5.6 多維數組參數276
9.5.7 設計考量277
9.5.8 參數傳遞實例277
9.6 子程序作為參數280
9.7 子程序間接調用281
9.8 函數設計問題282
9.8.1 函數的副作用283
9.8.2 返回值類型283
9.8.3 返回值的個數283
9.9 重載子程序283
9.10 泛型子程序284
9.10.1 C++泛型函數285
9.10.2 Java 5.0泛型方法286
9.10.3 C# 2005泛型方法287
9.10.4 F#泛型函數288
9.11 用戶定義的重載運算符288
9.12 閉包289
9.13 協同程序290
小結292
複習題293
習題294
程序設計練習295
第10章 子程序實現297
10.1 調用和返回的一般語義297
10.2 “簡單”子程序的實現297
10.3 具有棧動態局部變量的子程序實現299
10.3.1 更複雜的活動記錄299
10.3.2 不含遞歸的例子301
10.3.3 遞歸302
10.4 嵌套子程序304
10.4.1 基礎304
10.4.2 靜態鏈305
10.5 分程序309
10.6 動態作用域的實現310
10.6.1 深層訪問310
10.6.2 淺層訪問311
小結312
複習題312
習題313