Concepts of Programming Languages
副标题:无
分类号:
ISBN:9787111137559
微信扫一扫,移动浏览光盘
简介
本书从为什么学习程序设计语言、评估程序设计语言和语言结构的标准、常见的设计权衡以及基本的实现方法开始讲起,然后简略描述了在本书中讨论的大部分语言的演化。并且在第3章讨论语法和语义,还在第4章为不开设编译课程的学校新增了词法和语法分析的内容。本书主要是描述命令式语言的主要结构的设计问题及其实现,涉及变量、数据类型、表达式和赋值语句、控制语句、子程序、数据抽象设施、支持面向对象程序设计的语言特性(继承和动态方法绑定)、并发程序单元和异常处理等内容。在最后两章描述了函数式程序设计语言和逻辑程序设计语言。
本书适用面很广,既可用作计算机专业本科生程序设计语言课程的教材,也可用作自学语言的参考书。经验丰富的计算机工作者也可以用它来更新知识。
本书通过陈述各种语言结构的设计问题,分析一些常用语言中这些结构的设计选择,并比较不同的选择方案,来描述程序设计语言的基本概念。本书并不教读者如何使用一种语言,而是讨论语言的结构与特征及其在不同语言中的不同设计与实现,以及如何为给定的任务选择合适的语言。
本书所使用的描述方式不但为读者提供对现有的和将来的程序设计语言进行批判性评估所需的工具,而且可以增强读者学习新语言和理解语言实现的重要性的能力。
本书适合作为计算机专业本科生程序设计语言原理课程的教材,但对于成熟的程序员,这也是一本深入了解程序设计语言的理想书籍。
本书特点:
●使用java、javascript、c++。perl、ada和fortran来讨论各种语言结构以及设计选择方案
●将面向对象程序设计与非面向对象的命令式语言结合起来讨论
●提供产生现有语言的特定设计选择的历史背景
目录
出版者的话
专家指导委员会
译者序
前言
第1章 基本概念 1
1.1 学习程序设计语言原理的缘由 2
1.2 程序设计领域 3
1.2.1 科学应用 4
1.2.2 商务应用 4
1.2.3 人工智能 4
1.2.4 系统程序设计 4
1.2.5 脚本语言 5
1.2.6 专用语言 5
1.3 语言评估标准 5
1.3.1 可读性 6
1.3.2 可写性 10
1.3.3 可靠性 11
1.3.4 代价 12
1.4 影响语言设计的因素 13
1.4.1 计算机体系结构 13
.1.4.2 程序设计方法学 14
1.5 语言分类 15
1.6 语言设计中的权衡 15
1.7 实现方法 16
1.7.1 编译方法 17
1.7.2 单纯解释 19
1.7.3 混合实现系统 20
1.8 程序设计环境 20
本章小结 21
复习题 21
练习题 22
第2章 主要程序设计语言的发展 23
2.1 zuse的plankalk焞语言 25
2.1.1 历史背景 25
2.1.2 语言概述 25
2.2 最小硬件的程序设计:伪代码 26
2.2.1 短代码 26
2.2.2 快速编码 27
2.2.3 univac “编译”系统 27
2.2.4 相关的工作 27
2.3 ibm 704 计算机和 fortran 语言 27
2.3.1 历史背景 27
2.3.2 设计过程 28
2.3.3 fortran i 概况 28
2.3.4 fortran ii 概况 29
2.3.5 fortran iv、fortran 77和
fortran 90 29
2.3.6 评估 30
2.4 函数式程序设计:lisp语言 31
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 相关的语言 35
2.5 迈向成熟的第一步: algol 60 35
2.5.1 历史背景 35
2.5.2 早期设计过程 36
2.5.3 algol 58 概况 36
2.5.4 algol 58 报告的接受 36
2.5.5 algol 60 的设计过程 37
2.5.6 algol 60 语言概述 37
2.5.7 algol 60 的评估 38
2.6 商务记录的计算机化:cobol 39
2.6.1 历史背景 39
2.6.2 flow-matic 语言 39
2.6.3 cobol 的设计过程 40
2.6.4 评估 40
2.7 分时操作的开始:basic 42
2.7.1 设计过程 43
2.7.2 语言概述 43
2.7.3 评估 43
2.8 用途广泛的语言:pl/i 44
2.8.1 历史背景 44
2.8.2 设计过程 45
2.8.3 语言概述 45
2.8.4 评估 46
2.9 两种早期的动态语言:apl 和 snobol 47
2.9.1 apl 的起源与特征 47
2.9.2 snobol 的起源与特征 47
2.10 数据抽象的开始:simula 67 48
2.10.1 设计过程 48
2.10.2 语言概述 48
2.11 正交性语言的设计:algol 68 48
2.11.1 设计过程 49
2.11.2 语言概述 49
2.11.3 评估 49
2.12 algol 系列语言的重要后代语言 50
2.12.1 为简单性而设计的语言: pascal 50
2.12.2 可移植的系统语言: c 51
2.12.3 algol 的其他后代语言 53
2.13 基于逻辑的程序设计:prolog 54
2.13.1 设计过程 54
2.13.2 语言概述 54
2.13.3 评估 55
2.14 历史上最大规模的语言设计:ada 55
2.14.1 历史背景 55
2.14.2 设计过程 55
2.14.3 语言概述 57
2.14.4 评估 57
2.14.5 ada 95 58
2.15 面向对象的程序设计:smalltalk 59
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 一种相关语言: eiffel 62
2.17 万维网程序设计:java 63
2.17.1 设计过程 63
2.17.2 语言概述 63
2.17.3 评估 64
本章小结 65
文献注释 65
复习题 66
练习题 67
第3章 描述语法和语义 69
3.1 介绍 70
3.2 描述语法的普遍问题 70
3.2.1 语言识别器 71
3.2.2 语言生成器 71
3.3 描述语法的形式方法 71
3.3.1 巴科斯-诺尔范式与上下文无关文法 71
3.3.2 扩展的bnf 79
3.3.3 语法图 80
3.3.4 文法与识别器 80
3.4 属性文法 80
3.4.1 静态语义 81
3.4.2 基本概念 81
3.4.3 属性文法定义 81
3.4.4 内在属性 82
3.4.5 属性文法的例子 82
3.4.6 计算属性值 83
3.4.7 评估 83
3.5 描述程序的意义:动态语义 84
3.5.1 操作语义 84
3.5.2 公理语义 86
3.5.3 指称语义 93
本章小结 96
文献注释 97
复习题 97
练习题 97
第4章 词法分析和语法分析 101
4.1 介绍 102
4.2 词法分析 102
4.3 语法分析问题 105
4.3.1 语法分析介绍 105
4.3.2 自顶向下语法分析器 106
4.3.3 自底向上语法分析器 106
4.3.4 语法分析的复杂性 106
4.4 递归下降语法分析 107
4.4.1 递归下降语法分析过程 107
4.4.2 ll 文法类 109
4.5 自底向上语法分析 110
4.5.1 自底向上语法分析器的语法分析
问题 110
4.5.2 移进-归约算法 112
4.5.3 lr语法分析器 112
本章小结 115
复习题 116
练习题 117
第5章 名字、绑定、类型检测和作用域 119
5.1 介绍 120
5.2 名字 120
5.2.1 设计问题 120
5.2.2 名字形式 120
5.2.3 特殊字 121
5.3 变量 122
5.3.1 名字 122
5.3.2 地址 122
5.3.3 类型 123
5.3.4 值 123
5.4 绑定概念 123
5.4.1 属性-变量绑定 124
5.4.2 类型绑定 124
5.4.3 存储绑定与生存期 126
5.5 类型检测 128
5.6 强类型化 129
5.7 类型兼容性 130
5.8 作用域 132
5.8.1 静态作用域 132
5.8.2 块 134
5.8.3 静态作用域的评估 134
5.8.4 动态作用域 136
5.8.5 动态作用域的评估 137
5.9 作用域与生存期 137
5.10 引用环境 138
5.11 命名常量 139
5.12 变量初始化 141
本章小结 141
复习题 142
练习题 142
第6章 数据类型 147
6.1 介绍 148
6.2 基本数据类型 149
6.2.1 数值类型 149
6.2.2 布尔类型 150
6.2.3 字符类型 150
6.3 字符串类型 151
6.3.1 设计问题 151
6.3.2 字符串及操作 151
6.3.3 串长度的选择 152
6.3.4 评估 153
6.3.5 字符串类型的实现 153
6.4 用户定义的序数类型 154
6.4.1 枚举类型 154
6.4.2 子范围类型 155
6.4.3 实现用户定义的序数类型 156
6.5 数组类型 156
6.5.1 设计问题 157
6.5.2 数组和下标 157
6.5.3 下标绑定和数组类别 158
6.5.4 数组中的下标数目 159
6.5.5 数组初始化 160
6.5.6 数组操作 160
6.5.7 片 161
6.5.8 评估 162
6.5.9 数组类型的实现 162
6.6 相关数组 165
6.6.1 结构和操作 165
6.6.2 实现相关数组 166
6.7 记录类型 166
6.7.1 记录的定义 166
6.7.2 对记录域的引用 167
6.7.3 记录操作 168
6.7.4 评估 168
6.7.5 记录类型的实现 169
6.8 联合类型 169
6.8.1 设计问题 169
6.8.2 自由联合 169
6.8.3 pascal 联合类型 169
6.8.4 ada 联合类型 171
6.8.5 评估 172
6.8.6 联合类型的实现 172
6.9 集合类型 173
6.9.1 pascal 中的集合 173
6.9.2 评估 173
6.9.3 集合类型的实现 174
6.10 指针类型 174
6.10.1 设计问题 175
6.10.2 指针操作 175
6.10.3 指针的一些问题 176
6.10.4 pascal 语言中的指针 176
6.10.5 ada 中的指针 177
6.10.6 c 和 c++ 中的指针 177
6.10.7 fortran 90 中的指针 178
6.10.8 引用类型 179
6.10.9 评估 179
6.10.10 指针类型和引用类型的实现 180
本章小结 183
文献注释 184
复习题 184
练习题 185
第7章 表达式与赋值语句 187
7.1 介绍 188
7.2 算术表达式 188
7.2.1 操作符求值顺序 188
7.2.2 操作数求值顺序 192
7.3 重载操作符 193
7.4 类型转换 195
7.4.1 表达式中的强制转换 195
7.4.2 显式类型转换 196
7.4.3 表达式中的错误 196
7.5 关系表达式和布尔表达式 197
7.5.1 关系表达式 197
7.5.2 布尔表达式 197
7.6 短路求值 198
7.7 赋值语句 199
7.7.1 简单赋值 200
7.7.2 多目标 200
7.7.3 条件目标 200
7.7.4 复合赋值操作符 200
7.7.5 一元赋值操作符 201
7.7.6 赋值作为表达式 201
7.8 混合模式赋值 202
本章小结 203
复习题 203
练习题 203
第8章 语句层次的控制结构 207
8.1 介绍 208
8.2 复合语句 208
8.3 选择语句 209
8.3.1 双向选择语句 209
8.3.2 多向选择结构 212
8.4 循环语句 217
8.4.1 计数器控制的循环 217
8.4.2 逻辑控制的循环 223
8.4.3 用户定位的循环控制机制 224
8.4.4 基于数据结构的重复 226
8.5 无条件转移 227
8.5.1 无条件转移中的问题 227
8.5.2 标号形式 228
8.6 受保护命令 228
8.7 结论 230
本章小结 231
复习题 231
练习题 232
第9章 子程序 235
9.1 介绍 236
9.2 子程序的基本原理 236
9.2.1 子程序的共同特征 236
9.2.2 基本定义 236
9.2.3 参数 237
9.2.4 过程与函数 238
9.3 子程序的设计问题 239
9.4 局部引用环境 240
9.5 参数传递方法 241
9.5.1 参数传递的语义模型 241
9.5.2 参数传递的实现模型 242
9.5.3 主要语言中的参数传递 245
9.5.4 参数类型检测 246
9.5.5 实现参数传递方法 247
9.5.6 多维数组作为参数 248
9.5.7 设计考虑 251
9.5.8 参数传递的例子 251
9.6 子程序名作为参数传递 254
9.7 重载子程序 256
9.8 通用子程序 257
9.8.1 ada 中的通用子程序 257
9.8.2 c++ 中的通用函数 258
9.9 分别编译与独立编译 260
9.10 函数的设计问题 261
9.10.1 函数的副作用 261
9.10.2 返回值的类型 261
9.11 访问非局部环境 261
9.11.1 fortran common 块 261
9.11.2 外部声明和模块 262
9.12 用户定义的重载操作符 263
9.13 协同程序 263
本章小结 265
复习题 265
练习题 266
第10章 实现子程序 269
10.1 调用与返回的一般语义 270
10.2 实现 fortran 77 子程序 270
10.3 在类 algol语言中实现子程序 272
10.3.1 更复杂的活动记录 272
10.3.2 一个没有递归及非局部引用的例子 273
10.3.3 递归 275
10.3.4 实现非局部引用的机制 275
10.4 块 285
10.5 实现动态作用域 286
10.5.1 深访问 286
10.5.2 浅访问 287
10.6 子程序名参数的实现 288
10.6.1 静态链方法 288
10.6.2 显示 288
10.6.3 再次讨论引用环境的混乱 288
本章小结 290
文献注释 290
复习题 290
练习题 291
第11章 抽象数据类型 293
11.1 抽象的概念 294
11.2 封装 294
11.3 数据抽象的介绍 295
11.3.1 浮点数作为抽象数据类型 295
11.3.2 用户定义的抽象数据类型 296
11.3.3 一个例子 296
11.4 设计问题 297
11.5 语言示例 297
11.5.1 simula 67 中的类 297
11.5.2 ada 中的抽象数据类型 298
11.5.3 c++ 中的抽象数据类型 301
11.6 有参数的抽象数据类型 305
11.6.1 ada 305
11.6.2 c++ 305
本章小结 306
复习题 307
练习题 307
第12章 支持面向对象的程序设计 309
12.1 介绍 310
12.2 面向对象程序设计 310
12.2.1 介绍 310
12.2.2 继承 310
12.2.3 多态与动态绑定 312
12.2.4 面向对象语言的计算 312
12.3 面向对象语言的设计问题 313
12.3.1 纯对象模型 313
12.3.2 子类是子类型吗 313
12.3.3 实现继承与接口继承 313
12.3.4 类型检测与多态 314
12.3.5 单继承与多继承 314
12.3.6 对象的分配与解除分配 315
12.3.7 动态绑定与静态绑定 315
12.4 smalltalk 概况 315
12.4.1 一般特征 316
12.4.2 smalltalk 环境 316
12.5 smalltalk 语言介绍 316
12.5.1 表达式 316
12.5.2 方法 318
12.5.3 赋值语句 319
12.5.4 块与控制结构 320
12.5.5 类 322
12.5.6 方法的更多方面 323
12.6 smalltalk 程序示例 324
12.6.1 简单表格处理 324
12.6.2 logo 风格的图形 325
12.7 smalltalk 的轮廓特性 329
12.7.1 类型检测与多态 329
12.7.2 继承 329
12.8 smalltalk 的评估 329
12.9 c++ 对面向对象程序设计的支持 330
12.9.1 一般特征 330
12.9.2 继承 330
12.9.3 动态绑定 333
12.9.4 评估 334
12.10 java 对面向对象程序设计的支持 335
12.10.1 一般特征 335
12.10.2 继承 336
12.10.3 动态绑定 336
12.10.4 封装 336
12.10.5 评估 337
12.11 ada 95 对面向对象程序设计的支持 337
12.11.1 一般特征 337
12.11.2 继承 338
12.11.3 动态绑定 338
12.11.4 评估 339
12.12 eiffel 对面向对象程序设计的支持 339
12.12.1 一般特征 340
12.12.2 继承 340
12.12.3 动态绑定 341
12.12.4 评估 341
12.13 javascript 的对象模型 341
12.13.1 一般特征 341
12.13.2 javascript 对象 342
12.13.3 对象的创建与修改 342
12.13.4 评估 343
12.14 面向对象结构的实现 343
12.14.1 存储实例数据 343
12.14.2 消息对方法的动态绑定 344
本章小结 345
复习题 345
练习题 346
第13章 并发 349
13.1 介绍 350
13.1.1 多处理器体系结构 350
13.1.2 并发的种类 351
13.1.3 学习并发的动机 351
13.2 子程序层次并发的介绍 351
13.2.1 基本概念 351
13.2.2 为并发而设计的语言 353
13.2.3 设计问题 354
13.3 信号量 354
13.3.1 介绍 354
13.3.2 合作同步 354
13.3.3 竞争同步 356
13.3.4 评估 357
13.4 管程 357
13.4.1 介绍 357
13.4.2 竞争同步 358
13.4.3 合作同步 358
13.4.4 评估 361
13.5 消息传递 361
13.5.1 介绍 361
13.5.2 同步消息传递的概念 361
13.5.3 ada 83 的消息传递模型 361
13.5.4 合作同步 365
13.5.5 竞争同步 365
13.5.6 任务的终止 367
13.5.7 优先级 367
13.5.8 二元信号量 367
13.5.9 评估 368
13.6 ada 95中的并发 368
13.6.1 保护的对象 368
13.6.2 异步消息 369
13.7 java线程 370
13.7.1 thread类 370
13.7.2 优先级 370
13.7.3 竞争同步 371
13.7.4 合作同步 371
13.7.5 评估 373
13.8 语句层次的并发 373
本章小结 375
文献注释 376
复习题 376
练习题 376
第14章 异常处理 379
14.1 异常处理介绍 380
14.1.1 基本概念 380
14.1.2 设计问题 381
14.1.3 历史 383
14.2 pl/i 中的异常处理 384
14.2.1 异常处理程序 384
14.2.2 异常与异常处理程序的绑定 384
14.2.3 继续 384
14.2.4 其他设计选择 384
14.2.5 示例 385
14.2.6 评估 386
14.3 ada 中的异常处理 387
14.3.1 异常处理程序 387
14.3.2 异常与异常处理程序的绑定 387
14.3.3 继续 388
14.3.4 其他设计选择 389
14.3.5 示例 390
14.3.6 评估 391
14.4 c++ 中的异常处理 391
14.4.1 异常处理程序 391
14.4.2 异常与异常处理程序的绑定 391
14.4.3 继续 392
14.4.4 其他设计选择 392
14.4.5 示例 393
14.4.6 评估 393
14.5 java 中的异常处理 394
14.5.1 异常类 394
14.5.2 异常处理程序 394
14.5.3 异常与异常处理程序的绑定 394
14.5.4 继续 395
14.5.5 其他设计选择 396
14.5.6 示例 396
14.5.7 finally子句 397
14.5.8 评估 398
本章小结 399
文献注释 399
复习题 399
练习题 400
第15章 函数式程序设计语言 403
15.1 介绍 404
15.2 数学函数 404
15.2.1 简单函数 404
15.2.2 函数形式 405
15.3 函数式程序设计语言的基础 406
15.4 第一种函数式程序设计语言: lisp 406
15.4.1 数据类型和结构 407
15.4.2 第一个lisp 解释器 407
15.5 scheme 介绍 408
15.5.1 scheme 的起源 409
15.5.2 原始函数 409
15.5.3 构造函数的函数 410
15.5.4 谓词函数 412
15.5.5 控制流程 414
15.5.6 scheme 示例函数 415
15.5.7 函数形式 418
15.5.8 产生代码的函数 419
15.5.9 scheme的命令式特性 419
15.6 common lisp 420
15.7 ml 422
15.8 haskell 423
15.9 函数式语言的应用 425
15.10 函数式语言和命令式语言的比较 426
本章小结 426
文献注释 427
复习题 427
练习题 427
第16章 逻辑程序设计语言 429
16.1 介绍 430
16.2 谓词演算的简短介绍 430
16.2.1 命题 430
16.2.2 子句形式 431
16.3 谓词演算与定理证明 432
16.4 逻辑程序设计概述 434
16.5 prolog 的起源 435
16.6 prolog 的基本元素 435
16.6.1 项 435
16.6.2 事实语句 435
16.6.3 规则语句 436
16.6.4 目标语句 437
16.6.5 prolog 的推理过程 437
16.6.6 简单算术 439
16.6.7 链表结构 441
16.7 prolog 的缺陷 444
16.7.1 归结次序控制 444
16.7.2 封闭世界假设 446
16.7.3 否定问题 446
16.7.4 内在的限制 448
16.8 逻辑程序设计的应用 448
16.8.1 关系数据库管理系统 448
16.8.2 专家系统 448
16.8.3 自然语言处理 449
16.8.4 教育 449
16.9 结论 449
本章小结 450
文献注释 450
复习题 450
练习题 451
参考文献 453
索引 465
专家指导委员会
译者序
前言
第1章 基本概念 1
1.1 学习程序设计语言原理的缘由 2
1.2 程序设计领域 3
1.2.1 科学应用 4
1.2.2 商务应用 4
1.2.3 人工智能 4
1.2.4 系统程序设计 4
1.2.5 脚本语言 5
1.2.6 专用语言 5
1.3 语言评估标准 5
1.3.1 可读性 6
1.3.2 可写性 10
1.3.3 可靠性 11
1.3.4 代价 12
1.4 影响语言设计的因素 13
1.4.1 计算机体系结构 13
.1.4.2 程序设计方法学 14
1.5 语言分类 15
1.6 语言设计中的权衡 15
1.7 实现方法 16
1.7.1 编译方法 17
1.7.2 单纯解释 19
1.7.3 混合实现系统 20
1.8 程序设计环境 20
本章小结 21
复习题 21
练习题 22
第2章 主要程序设计语言的发展 23
2.1 zuse的plankalk焞语言 25
2.1.1 历史背景 25
2.1.2 语言概述 25
2.2 最小硬件的程序设计:伪代码 26
2.2.1 短代码 26
2.2.2 快速编码 27
2.2.3 univac “编译”系统 27
2.2.4 相关的工作 27
2.3 ibm 704 计算机和 fortran 语言 27
2.3.1 历史背景 27
2.3.2 设计过程 28
2.3.3 fortran i 概况 28
2.3.4 fortran ii 概况 29
2.3.5 fortran iv、fortran 77和
fortran 90 29
2.3.6 评估 30
2.4 函数式程序设计:lisp语言 31
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 相关的语言 35
2.5 迈向成熟的第一步: algol 60 35
2.5.1 历史背景 35
2.5.2 早期设计过程 36
2.5.3 algol 58 概况 36
2.5.4 algol 58 报告的接受 36
2.5.5 algol 60 的设计过程 37
2.5.6 algol 60 语言概述 37
2.5.7 algol 60 的评估 38
2.6 商务记录的计算机化:cobol 39
2.6.1 历史背景 39
2.6.2 flow-matic 语言 39
2.6.3 cobol 的设计过程 40
2.6.4 评估 40
2.7 分时操作的开始:basic 42
2.7.1 设计过程 43
2.7.2 语言概述 43
2.7.3 评估 43
2.8 用途广泛的语言:pl/i 44
2.8.1 历史背景 44
2.8.2 设计过程 45
2.8.3 语言概述 45
2.8.4 评估 46
2.9 两种早期的动态语言:apl 和 snobol 47
2.9.1 apl 的起源与特征 47
2.9.2 snobol 的起源与特征 47
2.10 数据抽象的开始:simula 67 48
2.10.1 设计过程 48
2.10.2 语言概述 48
2.11 正交性语言的设计:algol 68 48
2.11.1 设计过程 49
2.11.2 语言概述 49
2.11.3 评估 49
2.12 algol 系列语言的重要后代语言 50
2.12.1 为简单性而设计的语言: pascal 50
2.12.2 可移植的系统语言: c 51
2.12.3 algol 的其他后代语言 53
2.13 基于逻辑的程序设计:prolog 54
2.13.1 设计过程 54
2.13.2 语言概述 54
2.13.3 评估 55
2.14 历史上最大规模的语言设计:ada 55
2.14.1 历史背景 55
2.14.2 设计过程 55
2.14.3 语言概述 57
2.14.4 评估 57
2.14.5 ada 95 58
2.15 面向对象的程序设计:smalltalk 59
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 一种相关语言: eiffel 62
2.17 万维网程序设计:java 63
2.17.1 设计过程 63
2.17.2 语言概述 63
2.17.3 评估 64
本章小结 65
文献注释 65
复习题 66
练习题 67
第3章 描述语法和语义 69
3.1 介绍 70
3.2 描述语法的普遍问题 70
3.2.1 语言识别器 71
3.2.2 语言生成器 71
3.3 描述语法的形式方法 71
3.3.1 巴科斯-诺尔范式与上下文无关文法 71
3.3.2 扩展的bnf 79
3.3.3 语法图 80
3.3.4 文法与识别器 80
3.4 属性文法 80
3.4.1 静态语义 81
3.4.2 基本概念 81
3.4.3 属性文法定义 81
3.4.4 内在属性 82
3.4.5 属性文法的例子 82
3.4.6 计算属性值 83
3.4.7 评估 83
3.5 描述程序的意义:动态语义 84
3.5.1 操作语义 84
3.5.2 公理语义 86
3.5.3 指称语义 93
本章小结 96
文献注释 97
复习题 97
练习题 97
第4章 词法分析和语法分析 101
4.1 介绍 102
4.2 词法分析 102
4.3 语法分析问题 105
4.3.1 语法分析介绍 105
4.3.2 自顶向下语法分析器 106
4.3.3 自底向上语法分析器 106
4.3.4 语法分析的复杂性 106
4.4 递归下降语法分析 107
4.4.1 递归下降语法分析过程 107
4.4.2 ll 文法类 109
4.5 自底向上语法分析 110
4.5.1 自底向上语法分析器的语法分析
问题 110
4.5.2 移进-归约算法 112
4.5.3 lr语法分析器 112
本章小结 115
复习题 116
练习题 117
第5章 名字、绑定、类型检测和作用域 119
5.1 介绍 120
5.2 名字 120
5.2.1 设计问题 120
5.2.2 名字形式 120
5.2.3 特殊字 121
5.3 变量 122
5.3.1 名字 122
5.3.2 地址 122
5.3.3 类型 123
5.3.4 值 123
5.4 绑定概念 123
5.4.1 属性-变量绑定 124
5.4.2 类型绑定 124
5.4.3 存储绑定与生存期 126
5.5 类型检测 128
5.6 强类型化 129
5.7 类型兼容性 130
5.8 作用域 132
5.8.1 静态作用域 132
5.8.2 块 134
5.8.3 静态作用域的评估 134
5.8.4 动态作用域 136
5.8.5 动态作用域的评估 137
5.9 作用域与生存期 137
5.10 引用环境 138
5.11 命名常量 139
5.12 变量初始化 141
本章小结 141
复习题 142
练习题 142
第6章 数据类型 147
6.1 介绍 148
6.2 基本数据类型 149
6.2.1 数值类型 149
6.2.2 布尔类型 150
6.2.3 字符类型 150
6.3 字符串类型 151
6.3.1 设计问题 151
6.3.2 字符串及操作 151
6.3.3 串长度的选择 152
6.3.4 评估 153
6.3.5 字符串类型的实现 153
6.4 用户定义的序数类型 154
6.4.1 枚举类型 154
6.4.2 子范围类型 155
6.4.3 实现用户定义的序数类型 156
6.5 数组类型 156
6.5.1 设计问题 157
6.5.2 数组和下标 157
6.5.3 下标绑定和数组类别 158
6.5.4 数组中的下标数目 159
6.5.5 数组初始化 160
6.5.6 数组操作 160
6.5.7 片 161
6.5.8 评估 162
6.5.9 数组类型的实现 162
6.6 相关数组 165
6.6.1 结构和操作 165
6.6.2 实现相关数组 166
6.7 记录类型 166
6.7.1 记录的定义 166
6.7.2 对记录域的引用 167
6.7.3 记录操作 168
6.7.4 评估 168
6.7.5 记录类型的实现 169
6.8 联合类型 169
6.8.1 设计问题 169
6.8.2 自由联合 169
6.8.3 pascal 联合类型 169
6.8.4 ada 联合类型 171
6.8.5 评估 172
6.8.6 联合类型的实现 172
6.9 集合类型 173
6.9.1 pascal 中的集合 173
6.9.2 评估 173
6.9.3 集合类型的实现 174
6.10 指针类型 174
6.10.1 设计问题 175
6.10.2 指针操作 175
6.10.3 指针的一些问题 176
6.10.4 pascal 语言中的指针 176
6.10.5 ada 中的指针 177
6.10.6 c 和 c++ 中的指针 177
6.10.7 fortran 90 中的指针 178
6.10.8 引用类型 179
6.10.9 评估 179
6.10.10 指针类型和引用类型的实现 180
本章小结 183
文献注释 184
复习题 184
练习题 185
第7章 表达式与赋值语句 187
7.1 介绍 188
7.2 算术表达式 188
7.2.1 操作符求值顺序 188
7.2.2 操作数求值顺序 192
7.3 重载操作符 193
7.4 类型转换 195
7.4.1 表达式中的强制转换 195
7.4.2 显式类型转换 196
7.4.3 表达式中的错误 196
7.5 关系表达式和布尔表达式 197
7.5.1 关系表达式 197
7.5.2 布尔表达式 197
7.6 短路求值 198
7.7 赋值语句 199
7.7.1 简单赋值 200
7.7.2 多目标 200
7.7.3 条件目标 200
7.7.4 复合赋值操作符 200
7.7.5 一元赋值操作符 201
7.7.6 赋值作为表达式 201
7.8 混合模式赋值 202
本章小结 203
复习题 203
练习题 203
第8章 语句层次的控制结构 207
8.1 介绍 208
8.2 复合语句 208
8.3 选择语句 209
8.3.1 双向选择语句 209
8.3.2 多向选择结构 212
8.4 循环语句 217
8.4.1 计数器控制的循环 217
8.4.2 逻辑控制的循环 223
8.4.3 用户定位的循环控制机制 224
8.4.4 基于数据结构的重复 226
8.5 无条件转移 227
8.5.1 无条件转移中的问题 227
8.5.2 标号形式 228
8.6 受保护命令 228
8.7 结论 230
本章小结 231
复习题 231
练习题 232
第9章 子程序 235
9.1 介绍 236
9.2 子程序的基本原理 236
9.2.1 子程序的共同特征 236
9.2.2 基本定义 236
9.2.3 参数 237
9.2.4 过程与函数 238
9.3 子程序的设计问题 239
9.4 局部引用环境 240
9.5 参数传递方法 241
9.5.1 参数传递的语义模型 241
9.5.2 参数传递的实现模型 242
9.5.3 主要语言中的参数传递 245
9.5.4 参数类型检测 246
9.5.5 实现参数传递方法 247
9.5.6 多维数组作为参数 248
9.5.7 设计考虑 251
9.5.8 参数传递的例子 251
9.6 子程序名作为参数传递 254
9.7 重载子程序 256
9.8 通用子程序 257
9.8.1 ada 中的通用子程序 257
9.8.2 c++ 中的通用函数 258
9.9 分别编译与独立编译 260
9.10 函数的设计问题 261
9.10.1 函数的副作用 261
9.10.2 返回值的类型 261
9.11 访问非局部环境 261
9.11.1 fortran common 块 261
9.11.2 外部声明和模块 262
9.12 用户定义的重载操作符 263
9.13 协同程序 263
本章小结 265
复习题 265
练习题 266
第10章 实现子程序 269
10.1 调用与返回的一般语义 270
10.2 实现 fortran 77 子程序 270
10.3 在类 algol语言中实现子程序 272
10.3.1 更复杂的活动记录 272
10.3.2 一个没有递归及非局部引用的例子 273
10.3.3 递归 275
10.3.4 实现非局部引用的机制 275
10.4 块 285
10.5 实现动态作用域 286
10.5.1 深访问 286
10.5.2 浅访问 287
10.6 子程序名参数的实现 288
10.6.1 静态链方法 288
10.6.2 显示 288
10.6.3 再次讨论引用环境的混乱 288
本章小结 290
文献注释 290
复习题 290
练习题 291
第11章 抽象数据类型 293
11.1 抽象的概念 294
11.2 封装 294
11.3 数据抽象的介绍 295
11.3.1 浮点数作为抽象数据类型 295
11.3.2 用户定义的抽象数据类型 296
11.3.3 一个例子 296
11.4 设计问题 297
11.5 语言示例 297
11.5.1 simula 67 中的类 297
11.5.2 ada 中的抽象数据类型 298
11.5.3 c++ 中的抽象数据类型 301
11.6 有参数的抽象数据类型 305
11.6.1 ada 305
11.6.2 c++ 305
本章小结 306
复习题 307
练习题 307
第12章 支持面向对象的程序设计 309
12.1 介绍 310
12.2 面向对象程序设计 310
12.2.1 介绍 310
12.2.2 继承 310
12.2.3 多态与动态绑定 312
12.2.4 面向对象语言的计算 312
12.3 面向对象语言的设计问题 313
12.3.1 纯对象模型 313
12.3.2 子类是子类型吗 313
12.3.3 实现继承与接口继承 313
12.3.4 类型检测与多态 314
12.3.5 单继承与多继承 314
12.3.6 对象的分配与解除分配 315
12.3.7 动态绑定与静态绑定 315
12.4 smalltalk 概况 315
12.4.1 一般特征 316
12.4.2 smalltalk 环境 316
12.5 smalltalk 语言介绍 316
12.5.1 表达式 316
12.5.2 方法 318
12.5.3 赋值语句 319
12.5.4 块与控制结构 320
12.5.5 类 322
12.5.6 方法的更多方面 323
12.6 smalltalk 程序示例 324
12.6.1 简单表格处理 324
12.6.2 logo 风格的图形 325
12.7 smalltalk 的轮廓特性 329
12.7.1 类型检测与多态 329
12.7.2 继承 329
12.8 smalltalk 的评估 329
12.9 c++ 对面向对象程序设计的支持 330
12.9.1 一般特征 330
12.9.2 继承 330
12.9.3 动态绑定 333
12.9.4 评估 334
12.10 java 对面向对象程序设计的支持 335
12.10.1 一般特征 335
12.10.2 继承 336
12.10.3 动态绑定 336
12.10.4 封装 336
12.10.5 评估 337
12.11 ada 95 对面向对象程序设计的支持 337
12.11.1 一般特征 337
12.11.2 继承 338
12.11.3 动态绑定 338
12.11.4 评估 339
12.12 eiffel 对面向对象程序设计的支持 339
12.12.1 一般特征 340
12.12.2 继承 340
12.12.3 动态绑定 341
12.12.4 评估 341
12.13 javascript 的对象模型 341
12.13.1 一般特征 341
12.13.2 javascript 对象 342
12.13.3 对象的创建与修改 342
12.13.4 评估 343
12.14 面向对象结构的实现 343
12.14.1 存储实例数据 343
12.14.2 消息对方法的动态绑定 344
本章小结 345
复习题 345
练习题 346
第13章 并发 349
13.1 介绍 350
13.1.1 多处理器体系结构 350
13.1.2 并发的种类 351
13.1.3 学习并发的动机 351
13.2 子程序层次并发的介绍 351
13.2.1 基本概念 351
13.2.2 为并发而设计的语言 353
13.2.3 设计问题 354
13.3 信号量 354
13.3.1 介绍 354
13.3.2 合作同步 354
13.3.3 竞争同步 356
13.3.4 评估 357
13.4 管程 357
13.4.1 介绍 357
13.4.2 竞争同步 358
13.4.3 合作同步 358
13.4.4 评估 361
13.5 消息传递 361
13.5.1 介绍 361
13.5.2 同步消息传递的概念 361
13.5.3 ada 83 的消息传递模型 361
13.5.4 合作同步 365
13.5.5 竞争同步 365
13.5.6 任务的终止 367
13.5.7 优先级 367
13.5.8 二元信号量 367
13.5.9 评估 368
13.6 ada 95中的并发 368
13.6.1 保护的对象 368
13.6.2 异步消息 369
13.7 java线程 370
13.7.1 thread类 370
13.7.2 优先级 370
13.7.3 竞争同步 371
13.7.4 合作同步 371
13.7.5 评估 373
13.8 语句层次的并发 373
本章小结 375
文献注释 376
复习题 376
练习题 376
第14章 异常处理 379
14.1 异常处理介绍 380
14.1.1 基本概念 380
14.1.2 设计问题 381
14.1.3 历史 383
14.2 pl/i 中的异常处理 384
14.2.1 异常处理程序 384
14.2.2 异常与异常处理程序的绑定 384
14.2.3 继续 384
14.2.4 其他设计选择 384
14.2.5 示例 385
14.2.6 评估 386
14.3 ada 中的异常处理 387
14.3.1 异常处理程序 387
14.3.2 异常与异常处理程序的绑定 387
14.3.3 继续 388
14.3.4 其他设计选择 389
14.3.5 示例 390
14.3.6 评估 391
14.4 c++ 中的异常处理 391
14.4.1 异常处理程序 391
14.4.2 异常与异常处理程序的绑定 391
14.4.3 继续 392
14.4.4 其他设计选择 392
14.4.5 示例 393
14.4.6 评估 393
14.5 java 中的异常处理 394
14.5.1 异常类 394
14.5.2 异常处理程序 394
14.5.3 异常与异常处理程序的绑定 394
14.5.4 继续 395
14.5.5 其他设计选择 396
14.5.6 示例 396
14.5.7 finally子句 397
14.5.8 评估 398
本章小结 399
文献注释 399
复习题 399
练习题 400
第15章 函数式程序设计语言 403
15.1 介绍 404
15.2 数学函数 404
15.2.1 简单函数 404
15.2.2 函数形式 405
15.3 函数式程序设计语言的基础 406
15.4 第一种函数式程序设计语言: lisp 406
15.4.1 数据类型和结构 407
15.4.2 第一个lisp 解释器 407
15.5 scheme 介绍 408
15.5.1 scheme 的起源 409
15.5.2 原始函数 409
15.5.3 构造函数的函数 410
15.5.4 谓词函数 412
15.5.5 控制流程 414
15.5.6 scheme 示例函数 415
15.5.7 函数形式 418
15.5.8 产生代码的函数 419
15.5.9 scheme的命令式特性 419
15.6 common lisp 420
15.7 ml 422
15.8 haskell 423
15.9 函数式语言的应用 425
15.10 函数式语言和命令式语言的比较 426
本章小结 426
文献注释 427
复习题 427
练习题 427
第16章 逻辑程序设计语言 429
16.1 介绍 430
16.2 谓词演算的简短介绍 430
16.2.1 命题 430
16.2.2 子句形式 431
16.3 谓词演算与定理证明 432
16.4 逻辑程序设计概述 434
16.5 prolog 的起源 435
16.6 prolog 的基本元素 435
16.6.1 项 435
16.6.2 事实语句 435
16.6.3 规则语句 436
16.6.4 目标语句 437
16.6.5 prolog 的推理过程 437
16.6.6 简单算术 439
16.6.7 链表结构 441
16.7 prolog 的缺陷 444
16.7.1 归结次序控制 444
16.7.2 封闭世界假设 446
16.7.3 否定问题 446
16.7.4 内在的限制 448
16.8 逻辑程序设计的应用 448
16.8.1 关系数据库管理系统 448
16.8.2 专家系统 448
16.8.3 自然语言处理 449
16.8.4 教育 449
16.9 结论 449
本章小结 450
文献注释 450
复习题 450
练习题 451
参考文献 453
索引 465
Concepts of Programming Languages
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×
亲爱的云图用户,
光盘内的文件都可以直接点击浏览哦
无需下载,在线查阅资料!