内容简介
第1章 预备知识
1.1学习程序设计语言原理的原因
1.2程序设计领域
1.2.1科学应用
1.2.2商务应用
1.2.3人工智能
1.2.4系统程序设计
1.2.5网络软件
1.3语言评价标准
1.3.1可读性
1.3.2可写性
1.3.3可靠性
1.3.4成本
1.4影响语言设计的因素
1.4.1计算机体系结构
1.4.2程序设计方法学
1.5程序设计语言的分类
1.6语言设计中的权衡
1.7实现方法
1.7.1编译
1.7.2完全解释
1.7.3混合实现系统
1.7.4预处理器
1.8编程环境
第2章 主要程序设计语言的发展
2.1 Zuse的Plankalkul语言
2.1.1历史背景
2.1.2语言概述
2.2伪代码
2.2.1 Short Code语言
2.2.2 Speedcoding系统
2.2.3 UNIVAC“编译”系统
2.2.4相关工作
2.3 IBM 704计算机与Fortran语言
2.3.1历史背景
2.3.2设计过程
2.3.3 Fortran Ⅰ概述
2.3.4 Fortran Ⅱ
2.3.5 Fortran Ⅳ、77、90、95、2003和2008
2.3.6评价
2.4函数式程序设计:LISP语言
2.4.1人工智能的起源和表处理
2.4.2 LISP语言的设计过程
2.4.3语言概述
2.4.4评价
2.4.5 LISP的两种后代语言
2.4.6相关语言
2.5迈向成熟的第一步:ALGOL 60
2.5.1历史背景
2.5.2早期设计过程
2.5.3 ALGOL 58概述
2.5.4对ALGOL 58报告的响应
2.5.5 ALGOL 60的设计过程
2.5.6 ALGOL 60概述
2.5.7评价
2.6商务记录的计算机化:COBOL语言
2.6.1历史背景
2.6.2 FLOW-MATIC语言
2.6.3 COBOL语言的设计过程
2.6.4评价
2.7分时处理的开始:BASIC语言
2.7.1设计过程
2.7.2语言概述
2.7.3评价
2.8满足所有人的需要:PL/I
2.8.1历史背景
2.8.2设计过程
2.8.3语言概述
2.8.4评价
2.9两种早期的动态语言:APL和SNOBOL
2.9.1 APL语言的起源与特点
2.9.2 SNOBOL语言的起源与特点
2.10数据抽象的开始:SIMULA 67
2.10.1设计过程
2.10.2语言概述
2.11正交设计:ALGOL 68
2.11.1设计过程
2.11.2语言概述
2.11.3评价
2.12 ALGOL系列语言的早期后代语言
2.12.1为简单性而设计:Pascal语言
2.12.2可移植的系统语言:C语言
2.13基于逻辑的程序设计:Prolog语言
2.13.1设计过程
2.13.2语言概述
2.13.3评价
2.14历史上规模最大的设计工作:Ada语言
2.14.1历史背景
2.14.2设计过程
2.14.3语言概述
2.14.4评价
2.14.5 Ada 95和Ada 2005
2.15 面向对象的程序设计:Smalltalk
2.15.1设计过程
2.15.2语言概述
2.15.3评价
2.16结合命令式和面向对象的特性:C+++
2.16.1设计过程
2.16.2语言概述
2.16.3评价
2.16.4一种相关语言:Objective-C
2.16.5另一种相关语言:Delphi
2.16.6一种关系不大的语言:Go
2.17基于命令式的面向对象语言:Java
2.17.1设计过程
2.17.2语言概述
2.17.3评价
2.18脚本语言
2.18.1 Perl的起源与特点
2.18.2 JavaScript的起源与特点
2.18.3 PHP的起源与特点
2.18.4 Python的起源与特点
2.18.5 Ruby的起源与特点
2.18.6 Lua的起源与特点
2.19一流的.NET语言:C
2.19.1设计过程
2.19.2语言概述
2.19.3评价
2.20标记与程序设计混合的语言
2.20.1 XSLT
2.20.2 JSP
第3章 描述语法和语义
3.1概述
3.2描述语法的普遍问题
3.2.1语言识别器
3.2.2语言生成器
3.3描述语法的形式化方法
3.3.1巴科斯-诺尔范式和上下文无关文法
3.3.2扩展的BNF
3.3.3文法与识别器
3.4属性文法
3.4.1静态语义
3.4.2基本概念
3.4.3属性文法定义
3.4.4本质属性
3.4.5属性文法的例子
3.4.6计算属性值
3.4.7评价
3.5描述程序的意义:动态语义
3.5.1操作语义
3.5.2指称语义
3.5.3公理语义
第4章 词法分析和语法分析
4.1概述
4.2词法分析
4.3语法分析问题
4.3.1语法分析概述
4.3.2自顶向下的语法分析器
4.3.3自底向上的语法分析器
4.3.4语法分析的复杂度
4.4递归下降的语法分析
4.4.1递归下降的语法分析过程
4.4.2 LL文法类
4.5自下而上的语法分析
4.5.1自下而上的语法分析器的分析问题
4.5.2移进-归约算法
4.5.3 LR语法分析器
第5章 名字、绑定和作用域
5.1概述
5.2名字
5.2.1设计问题
5.2.2名字形式
5.2.3特殊字
5.3变量
5.3.1名字
5.3.2地址
5.3.3类型
5.3.4数值
5.4绑定的概念
5.4.1属性与变量绑定
5.4.2绑定类型
5.4.3存储绑定和生存期
5.5作用域
5.5.1静态作用域
5.5.2块
5.5.3声明的次序
5.5.4全局作用域
5.5.5静态作用域的评价
5.5.6动态作用域
5.5.7动态作用域的评价
5.6作用域和生存期
5.7引用环境
5.8命名常量
第6章 数据类型
6.1概述
6.2基本数据类型
6.2.1数值类型
6.2.2布尔类型
6.2.3字符类型
6.3字符串类型
6.3.1设计问题
6.3.2字符串及其操作
6.3.3字符串长度的设计选项
6.3.4评价
6.3.5字符串类型的实现
6.4用户定义的序数类型
6.4.1枚举类型
6.4.2子界类型
6.4.3实现用户定义的有序类型
6.5数组类型
6.5.1设计问题
6.5.2数组和索引
6.5.3下标的绑定和数组的种类
6.5.4数组的初始化
6.5.5数组操作
6.5.6矩形数组和不规则数组
6.5.7切片
6.5.8评价
6.5.9数组类型的实现
6.6关联数组
6.6.1结构和操作
6.6.2关联数组的实现
6.7记录类型
6.7.1记录的定义
6.7.2记录域的引用
6.7.3评价
6.7.4记录类型的实现
6.8元组类型
6.9列表类型
6.10联合类型
6.10.1设计问题
6.10.2判别式联合与自由联合
6.10.3 Ada的联合类型
6.10.4 F#的联合类型
6.10.5评价
6.10.6联合类型的实现
6.11指针和引用类型
6.11.1设计问题
6.11.2指针操作
6.11.3指针的相关问题
6.11.4 Ada中的指针
6.11.5 C和C++中的指针
6.11.6引用类型
6.11.7评价
6.11.8指针和引用类型的实现
6.12类型检查
6.13强类型化
6.14类型等价
6.15 理论和数据类型
第7章 表达式与赋值语句
7.1概述
7.2算术表达式
7.2.1运算符的运算顺序
7.2.2操作数的运算顺序
7.3运算符重载
7.4类型转换
7.4.1表达式中的强制类型转换
7.4.2显式类型转换
7.4.3表达式中的错误
7.5关系表达式和布尔表达式
7.5.1关系表达式
7.5.2布尔表达式
7.6短路求值
7.7赋值语句
7.7.1简单赋值
7.7.2条件赋值
7.7.3混合赋值运算符
7.7.4一元赋值运算符
7.7.5赋值表达式
7.7.6多重赋值
7.7.7函数式编程语言中的赋值
7.8混合模式赋值
第8章 语句级控制结构
8.1概述
8.2选择语句
8.2.1双路选择语句
8.2.2多重选择结构
8.3迭代语句
8.3.1计数控制循环
8.3.2逻辑控制循环
8.3.3用户自定义的循环控制机制
8.3.4基于数据结构的迭代
8.4无条件分支
8.5防护命令
8.6结论
第9章 子程序
9.1概述
9.2子程序的基本原理
9.2.1子程序的一般性质
9.2.2子程序的基本定义
9.2.3参数
9.2.4过程与函数
9.3子程序的设计问题
9.4局部引用环境
9.4.1局部变量
9.4.2嵌套子程序
9.5参数传递方式
9.5.1参数传递的语义模型
9.5.2参数传递的实现模型
9.5.3参数传递方法的实现
9.5.4常见语言的参数传递方法
9.5.5参数的类型检查
9.5.6多维数组作为参数
9.5.7设计考虑
9.5.8参数传递的例子
9.6子程序作为参数
9.7间接调用子程序
9.8重载子程序
9.9泛型子程序
9.9.1 C++中的泛型函数
9.9.2 Java 5.0中的泛型方法
9.9.3 C# 2005中的泛型方法
9.9.4 F#中的泛型函数
9.10函数的设计问题
9.10.1函数的副作用
9.10.2返回值的类型
9.10.3返回值的个数
9.11用户定义重载运算符
9.12闭包
9.13协同程序
第10章 实现子程序
10.1调用和返回的一般语义
10.2实现“简单”的子程序
10.3通过栈动态局部变量实现子程序
10.3.1更复杂的活动记录
10.3.2一个不含递归调用的例子
10.3.3递归调用
10.4嵌套子程序
10.4.1基础知识
10.4.2静态链
10.5块
10.6动态作用域的实现
10.6.1深层访问
10.6.2浅层访问
第11章 抽象数据类型与封装结构
11.1抽象的概念
11.2数据抽象简介
11.2.1抽象数据类型之浮点型
11.2.2用户自定义的抽象数据类型
11.2.3示例
11.3抽象数据类型的设计问题
11.4语言示例
11.4.1 Ada中的抽象数据类型
11.4.2 C++中的抽象数据类型
11.4.3 Objective-C中的抽象数据类型
11.4.4 Java中的抽象数据类型
11.4.5 C#中的抽象数据类型
11.4.6 Ruby中的抽象数据类型
11.5参数化的抽象数据类型
11.5.1 Ada
11.5.2 C++
11.5.3 Java 5.0
11.5.4 C# 2005
11.6封装结构
11.6.1引言
11.6.2 C中的封装
11.6.3 C++中的封装
11.6.4 Ada包
11.6.5 C#程序集
11.7命名封装
11.7.1 C++命名空间
11.7.2 Java包
11.7.3 Ada包
11.7.4 Ruby模块
第12章 面向对象程序设计的支持
12.1概述
12.2面向对象编程
12.2.1引言
12.2.2继承
12.2.3动态绑定
12.3面向对象语言的设计问题
12.3.1对象的排他性
12.3.2子类是子类型吗
12.3.3单继承与多继承
12.3.4对象的分配和释放
12.3.5动态绑定与静态绑定
12.3.6嵌套类
12.3.7对象的初始化
12.4 Smalltalk对面向对象编程的支持
12.4.1一般特征
12.4.2继承
12.4.3动态绑定
12.4.4 Smalltalk的评价
12.5 C++对面向对象编程的支持
12.5.1一般特征
12.5.2继承
12.5.3动态绑定
12.5.4评价
12.6 Objective-C对面向对象编程的支持
12.6.1一般特征
12.6.2继承
12.6.3动态绑定
12.6.4评价
12.7 Java对面向对象编程的支持
12.7.1一般特征
12.7.2继承
12.7.3动态绑定
12.7.4被嵌套的类
12.7.5评价
12.8 C#对面向对象编程的支持
12.8.1一般特征
12.8.2继承
12.8.3动态绑定
12.8.4被嵌套的类
12.8.5评价
12.9 Ada 95对面向对象编程的支持
12.9.1一般特征
12.9.2继承
12.9.3动态绑定
12.9.4子包
12.9.5评价
12.10 Ruby对面向对象编程的支持
12.10.1一般特征
12.10.2继承
12.10.3动态绑定
12.10.4评价
12.11面向对象构造的实现
12.11.1存储实例数据
12.11.2方法调用到方法的动态绑定
第13章 并发
13.1概述
13.1.1多处理器体系结构
13.1.2并发的种类
13.1.3使用并发的目的
13.2子程序级并发概述
13.2.1基本概念
13.2.2为并发而设计的语言
13.2.3设计问题
13.3信号量
13.3.1概述
13.3.2合作同步
13.3.3竞争同步
13.3.4评价
13.4管程
13.4.1概述
13.4.2竞争同步
13.4.3合作同步
13.4.4评价
13.5消息传递
13.5.1概述
13.5.2同步消息传递的原理
13.6 Ada对并发的支持
13.6.1基本原理
13.6.2合作同步
13.6.3竞争同步
13.6.4任务终止
13.6.5优先级
13.6.6受保护对象
13.6.7评价
13.7 Java线程
13.7.1 Thread类
13.7.2优先级
13.7.3信号量
13.7.4竞争同步
13.7.5合作同步
13.7.6非阻塞同步
13.7.7显式锁定
13.7.8评价
13.8 C#线程
13.8.1基本线程操作
13.8.2同步线程
13.8.3评价
13.9函数式语言中的并发
13.9.1 Multilisp
13.9.2并发ML
13.9.3 F
13.10语句级并发
第14章 异常处理和事件处理
14.1异常处理概述
14.1.1基本概念
14.1.2设计问题
14.2 Ada中的异常处理
14.2.1异常处理程序
14.2.2将异常绑定到处理程序
14.2.3继续
14.2.4其他设计选择
14.2.5例子
14.2.6评价
14.3 C++中的异常处理
14.3.1异常处理程序
14.3.2异常与处理程序的绑定
14.3.3继续
14.3.4其他设计选择
14.3.5例子
14.3.6评价
14.4 Java中的异常处理
14.4.1异常类
14.4.2异常处理程序
14.4.3异常与处理程序的绑定
14.4.4其他设计选择
14.4.5例子
14.4.6 finally子句
14.4.7断言
14.4.8评价
14.5事件处理概述
14.6 Java的事件处理
14.6.1 Java Swing的GUI组件
14.6.2 Java事件模型
14.7 C#中的事件处理
第15章 函数式程序设计语言
15.1概述
15.2数学函数
15.2.1简单函数
15.2.2函数形式
15.3函数式程序设计语言基础
15.4第一种函数式程序设计语言LISP
15.4.1数据类型和结构
15.4.2第一个LISP解释器
15.5 Scheme概述
15.5.1 Scheme的起源
15.5.2 Scheme解释器
15.5.3基本数值函数
15.5.4定义函数
15.5.5输出函数
15.5.6数值谓词函数
15.5.7控制流
15.5.8表函数
15.5.9用于符号原子和表的谓词函数
15.5.10 Scheme函数示例
15.5.11 LET
15.5.12 Scheme中的尾递归
15.5.13函数形式
15.5.14构建代码的函数
15.6 Common LISP
15.7 ML
15.8 Haskell
15.9 F
15.10基本命令式语言对函数式编程的支持
15.11函数式语言和命令式语言的比较
第16章 逻辑程序设计语言
16.1概述
16.2谓词演算简介
16.2.1命题
16.2.2子句形式
16.3谓词演算与定理证明
16.4逻辑程序设计概述
16.5 Prolog的起源
16.6 Prolog的基本元素
16.6.1项
16.6.2事实语句
16.6.3规则语句
16.6.4目标语句
16.6.5 Prolog的推理过程
16.6.6简单算术
16.6.7表结构
16.7 Prolog存在的缺陷
16.7.1归结的顺序控制
16.7.2封闭世界假设
16.7.3否定问题
16.7.4固有的限制
16.8逻辑程序设计的应用
16.8.1关系数据库管理系统
16.8.2专家系统
16.8.3自然语言处理
参考文献