简介
这是一本很有特色的计算机教材,其核心是讨论程序设计语言的基本原理和技术。《程序设计语言——实践之路(第3版)》融合了传统的程序设计语言教科书和编译教科书的有关知识,并增加了一些有关汇编层体系结构的材料,以满足没学过计算机组织的学生们的需要。书中通过各种语言的例子,阐释了程序设计语言的重要基础概念,讨论了各种概念之间的关系,解释了语言中许多结构的形成和发展过程,以及它们演化为今天这种形式的根源。书中还详细讨论了编译器的工作方式和工作过程,说明它们对源程序做了什么,以及为什么要那样做。书的每章最后附有复习题和一些更具挑战性的练习与探索。这些练习的特别价值在于引导学生进一步深入理解各种语言和技术。《程序设计语言——实践之路(第3版)》新增了关于运行时程序管理的讨论,对关于并发的一章做了重大的改写,并更新了大量的实例。 这本教材在美国大学已使用了二十余年,目前被欧美许多重要大学用于“程序设计语言”或者“软件系统”课程。《程序设计语言——实践之路(第3版)》适合高年级本科生或者一年级研究生使用,许多内容对专业程序员也很有价值。
目录
《程序设计语言——实践之路(第3版)》
第1部分 基础 3
第1章 引言 5
1.1 语言设计的艺术 7
1.2 程序设计语言的谱系 10
1.3 为什么要研究程序设计语言? 14
1.4 编译和解释 16
1.5 程序设计环境 24
1.6 编译概览 25
1.6.1 词法和语法分析 27
1.6.2 语义分析和中间代码生成 29
1.6.3 目标代码生成 33
1.6.4 代码改进 33
1.7 总结和注记 35
1.8 练习 36
1.9 探索 37
1.10 有关参考文献 39
第2章 程序设计语言的语法 41
2.1 描述语法:正则表达式和上下文无关文法 42
2.1.1 单词和正则表达式 43
.2.1.2 上下文无关文法 46
2.1.3 推导和语法分析树 48
2.2 扫描 51
2.2.1 生成一个有穷自动机 55
2.2.2 扫描器代码 60
2.2.3 表格驱动的扫描 63
2.2.4 词法错误 63
2.2.5 编译指示 65
2.3 语法分析 67
2.3.1 递归下降 70
2.3.2 表格驱动的自上而下语法分析 76
2.3.3 自下而上的语法分析 87
2.3.4 语法错误 1 99
2.4 理论基础 13 100
2.4.1 有穷自动机 13
2.4.2 下推自动机 18
2.4.3 文法和语言类 19
2.5 总结和注记 101
2.6 练习 102
2.7 探索 108
2.8 有关参考文献 109
第3章 名字、作用域和约束 111
3.1 约束时间的概念 112
3.2 对象生存期和存储管理 114
3.2.1 静态分配 115
3.2.2 基于栈的分配 117
3.2.3 基于堆的分配 118
3.2.4 废料收集 120
3.3 作用域规则 121
3.3.1 静态作用域 123
3.3.2 嵌套子程序 124
3.3.3 声明的顺序 127
3.3.4 模块 132
3.3.5 模块类型和类 136
3.3.6 动态作用域 139
3.4 作用域的实现 29 143
3.4.1 符号表 29
3.4.2 关联表和中心引用表 33
3.5 作用域中名字的含义 144
3.5.1 别名 144
3.5.2 重载 146
3.5.3 多态性及相关概念 148
3.6 引用环境的约束 151
3.6.1 子程序闭包 153
3.6.2 一级值和非受限生存期 154
3.6.3 对象闭包 157
3.7 宏扩展 159
3.8 分别编译 39 161
3.8.1 c的分别编译 40
3.8.2 包和自动头文件推理 42
3.8.3 模块分层结构 43
3.9 总结和注记 162
3.10 练习 163
3.11 探索 171
3.12 有关参考文献 172
第4章 语义分析 175
4.1 语义分析器所扮演的角色 176
4.2 属性文法 180
4.3 属性求值 182
4.4 动作例程 191
4.5 属性的空间管理 49 196
4.5.1 自下而上求值 49
4.5.2 自上而下求值 54
4.6 语法树的标注 197
4.7 总结和注记 204
4.8 练习 205
4.9 探索 209
4.10 有关参考文献 210
第5章 目标机体系结构 65 213
5.1 存储器层次结构 66
5.2 数据表示 68
5.2.1 整数算术 69
5.2.2 浮点数算术 72
5.3 指令集体系结构 75
5.3.1 寻址模式 75
5.3.2 条件和分支 76
5.4 体系结构和实现 78
5.4.1 微程序设计 79
5.4.2 微处理器 80
5.4.3 risc 81
5.4.4 多线程和多核 82
5.4.5 两个示例体系结构:x86和mips 84
5.5 为新型处理器做编译 91
5.5.1 保持流水线满 91
5.5.2 寄存器分配 96
5.6 总结和注记 101
5.7 练习 103
5.8 探索 107
5.9 有关参考文献 109
第2部分 语言设计的核心问题 217
第6章 控制流 219
6.1 表达式求值 220
6.1.1 优先级和结合性 222
6.1.2 赋值 224
6.1.3 初始化 233
6.1.4 表达式中的顺序问题 235
6.1.5 短路求值 238
6.2 结构化和非结构化的流程 241
6.2.1 goto的结构化替代品 242
6.2.2 继续 245
6.3 顺序执行 246
6.4 选择 247
6.4.1 短路条件 248
6.4.2 case/switch语句 251
6.5 迭代 256
6.5.1 枚举控制的循环 256
6.5.2 组合循环 261
6.5.3 迭代器 262
6.5.4 icon的生成器 111 268
6.5.5 逻辑控制的循环 268
6.6 递归 270
6.6.1 迭代和递归 271
6.6.2 应用序和正则序求值 275
6.7 非确定性 115 277
6.8 总结和注记 278
6.9 练习 279
6.10 探索 285
6.11 有关参考文献 287
第7章 数据类型 289
7.1 类型系统 290
7.1.1 类型检查 291
7.1.2 多态性 291
7.1.3 “类型”的含义 293
7.1.4 类型的分类 294
7.1.5 正交性 301
7.2 类型检查 303
7.2.1 类型等价 303
7.2.2 类型相容性 310
7.2.3 类型推理 314
7.2.4 ml类型系统 125 316
7.3 记录(结构)与变体(联合) 317
7.3.1 语法和运算 318
7.3.2 存储布局及其影响 319
7.3.3 with语句 135 323
7.3.4 变体记录(联合) 139 324
7.4 数组 325
7.4.1 语法和操作 326
7.4.2 维数、上下界和分配 330
7.4.3 内存布局 335
7.5 字符串 342
7.6 集合 344
7.7 指针和递归类型 345
7.7.1 语法和操作 346
7.7.2 悬空引用 149 356
7.7.3 废料收集 357
7.8 表 364
7.9 文件和输入/输出 153 367
7.9.1 交互式i/o 153
7.9.2 基于文件的i/o 154
7.9.3 正文i/o 156
7.10 相等检测和赋值 368
7.11 总结和注记 371
7.12 练习 373
7.13 探索 379
7.14 有关参考文献 380
第8章 子程序和控制抽象 383
8.1 回顾栈的布局 384
8.2 调用序列 386
8.2.1 区头向量 169 389
8.2.2 案例研究:在mips上实现c,在x86上实现pascal 173 389
8.2.3 寄存器窗口 181 390
8.2.4 内联展开 391
8.3 参数传递 393
8.3.1 参数模式 394
8.3.2 名字调用 185 402
8.3.3 特殊目的的参数 403
8.3.4 函数返回 408
8.4 泛型子程序和模块 410
8.4.1 不同的实现方法 412
8.4.2 泛型参数的约束条件 414
8.4.3 隐式实例化 416
8.4.4 c++、java和c#中的泛型 189 417
8.5 异常处理 418
8.5.1 异常的定义 421
8.5.2 异常的传播 423
8.5.3 异常的实现 425
8.6 协作程序 428
8.6.1 栈分配 430
8.6.2 转移 432
8.6.3 迭代器的实现 201 433
8.6.4 离散事件模拟 205 433
8.7 事件 434
8.7.1 顺序处理程序 434
8.7.2 基于线程的处理程序 436
8.8 总结和注记 438
8.9 练习 439
8.10 探索 446
8.11 有关参考文献 447
第9章 数据抽象和面向对象 449
9.1 面向对象程序设计 451
9.2 封装和继承 460
9.2.1 模块 460
9.2.2 类 463
9.2.3 嵌套(内层类) 465
9.2.4 类型扩展 466
9.2.5 不使用继承扩展 468
9.3 初始化和终结处理 469
9.3.1 构造函数的选择 470
9.3.2 引用和值 472
9.3.3 执行顺序 475
9.3.4 废料收集 477
9.4 动态方法约束 478
9.4.1 虚方法和非虚方法 480
9.4.2 抽象类 482
9.4.3 成员查找 482
9.4.4 多态性 486
9.4.5 对象闭包 489
9.5 多重继承 215 491
9.5.1 语义歧义性 217
9.5.2 复本式继承 220
9.5.3 共享继承 222
9.5.4 混入式继承 223
9.6 重温面向对象的程序设计 492
9.6.1 smalltalk的对象模型 227 493
9.7 总结和注记 494
9.8 练习 495
9.9 探索 498
9.10 有关参考文献 499
第3部分 其他程序设计模型 503
第10章 函数式语言 505
10.1 历史渊源 506
10.2 函数式程序设计的概念 507
10.3 scheme回顾/简介 509
10.3.1 约束 512
10.3.2 表和数 513
10.3.3 相等检测和检索 514
10.3.4 控制流和赋值 515
10.3.5 程序作为表 517
10.3.6 一个扩展的实例:dfa模拟 519
10.4 重温求值顺序 521
10.4.1 严格求值和惰性求值 523
10.4.2 i/o:流和单体 525
10.5 高阶函数 530
10.6 理论基础 237 534
10.6.1 lambda 演算 239
10.6.2 控制流 242
10.6.3 结构 244
10.7 函数式程序设计展望 534
10.8 总结和注记 537
10.9 练习 538
10.10 探索 542
10.11 有关参考文献 543
第11章 逻辑式语言 545
11.1 逻辑式程序设计的概念 546
11.2 prolog 547
11.2.1 归结和合一 549
11.2.2 表 550
11.2.3 算术 551
11.2.4 搜索/执行顺序 552
11.2.5 一个较大的实例:九宫棋 554
11.2.6 命令式控制流 557
11.3 理论基础 253 566
11.3.1 子句形式 254
11.3.2 局限性 255
11.3.3 skolem 257
11.4 逻辑式程序设计的展望 566
11.4.1 没有覆盖的逻辑部分 566
11.4.2 执行顺序 567
11.4.3 否定和“闭世界”假设 568
11.5 总结和注记 570
11.6 练习 571
11.7 探索 573
11.8 有关参考文献 573
第12章 并发 575
12.1 基础和动力 576
12.1.1 多线程程序的各种情况 579
12.1.2 多处理器体系结构 581
12.2 并发程序设计基础 586
12.2.1 通信和同步 587
12.2.2 语言和库 588
12.2.3 创建线程的语法 589
12.2.4 线程的实现 598
12.3 实现 603
12.3.1 忙等待同步 604
12.3.2 非阻塞算法 607
12.3.3 内存一致模型 610
12.3.4 调度器的实现 613
12.3.5 信号量 617
12.4 语言级机制 619
12.4.1 管程 619
12.4.2 条件临界区域 624
12.4.3 java中的同步 626
12.4.4 事务存储 629
12.4.5 隐式同步 633
12.5 消息传递 263 637
12.5.1 通信对方的命名 263
12.5.2 发送 267
12.5.3 接收 272
12.5.4 远程过程调用 278
12.6 总结和注记 638
12.7 练习 640
12.8 探索 645
12.9 有关参考文献 647
第13章 脚本语言 649
13.1 什么是脚本语言? 650
13.1.1 公共特性 652
13.2 问题领域 655
13.2.1 外壳(命令)语言 655
13.2.2 文字处理和报表生成 663
13.2.3 数学和统计 667
13.2.4 “粘结”语言和通用脚本 668
13.2.5 扩充语言 676
13.3 万维网脚本 680
13.3.1 cgi脚本 680
13.3.2 嵌入式服务器端脚本 681
13.3.3 客户端脚本 686
13.3.4 java小程序 686
13.3.5 xslt 287 689
13.4 新特征 691
13.4.1 名字和作用域 691
13.4.2 串和模式匹配 696
13.4.3 数据类型 704
13.4.4 面向对象 710
13.5 总结和注记 717
13.6 练习 718
13.7 探索 723
13.8 有关参考文献 724
第4部分 对实现的近距离考查 727
第14章 构造可运行的程序 729
14.1 后端编译器结构 729
14.1.1 一种可行的多阶段组织 730
14.1.2 阶段和遍 734
14.2 中间形式 303 734
14.2.1 diana 303
14.2.2 gcc中间形式 306
14.2.3 基于栈的中间形式 736
14.3 代码生成 738
14.3.1 一个属性文法实例 738
14.3.2 寄存器分配 741
14.4 地址空间组织 744
14.5 汇编 746
14.5.1 指令发射 748
14.5.2 为名字指定地址 749
14.6 连接 750
14.6.1 重定位和名字解析 751
14.6.2 类型检查 751
14.7 动态连接 311 754
14.7.1 与定位无关的代码 312
14.7.2 完全动态连接(惰性连接) 313
14.8 总结和注记 755
14.9 练习 756
14.10 探索 758
14.11 有关参考文献 759
第15章 运行时程序管理 761
15.1 虚拟机 764
15.1.1 java虚拟机 766
15.1.2 公共语言基础架构 775
15.2 机器码的迟绑定 784
15.2.1 即时和动态编译 785
15.2.2 二进制翻译 791
15.2.3 二进制重写 795
15.2.4 移动代码和沙箱 797
15.3 审查/自反 799
15.3.1 自反 799
15.3.2 符号调试 806
15.3.3 性能分析 809
15.4 总结和注记 811
15.5 练习 812
15.6 探索 815
15.7 有关参考文献 816
第16章 代码改进 321 817
16.1 代码改进的阶段 323
16.2 窥孔优化 325
16.3 基本块内的冗余删除 328
16.3.1 一直使用的实例 328
16.3.2 值编号 331
16.4 全局冗余删除和数据流分析 336
16.4.1 ssa(静态单赋值)形式和全局值编号 336
16.4.2 全局公共子表达式删除 339
16.5 循环改进i 346
16.5.1 循环不变量 347
16.5.2 归纳变量 348
16.6 指令调度 351
16.7 循环改进ii 355
16.7.1 循环展开和软件流水线 355
16.7.2 循环重排 359
16.8 寄存器分配 366
16.9 总结和注记 370
16.10 练习 377
16.11 探索
16.12 有关参考文献
附录a 本书中提到的程序设计语言 819
附录b 语言设计和语言实现 831
附录c 编号示表 835
第1部分 基础 3
第1章 引言 5
1.1 语言设计的艺术 7
1.2 程序设计语言的谱系 10
1.3 为什么要研究程序设计语言? 14
1.4 编译和解释 16
1.5 程序设计环境 24
1.6 编译概览 25
1.6.1 词法和语法分析 27
1.6.2 语义分析和中间代码生成 29
1.6.3 目标代码生成 33
1.6.4 代码改进 33
1.7 总结和注记 35
1.8 练习 36
1.9 探索 37
1.10 有关参考文献 39
第2章 程序设计语言的语法 41
2.1 描述语法:正则表达式和上下文无关文法 42
2.1.1 单词和正则表达式 43
.2.1.2 上下文无关文法 46
2.1.3 推导和语法分析树 48
2.2 扫描 51
2.2.1 生成一个有穷自动机 55
2.2.2 扫描器代码 60
2.2.3 表格驱动的扫描 63
2.2.4 词法错误 63
2.2.5 编译指示 65
2.3 语法分析 67
2.3.1 递归下降 70
2.3.2 表格驱动的自上而下语法分析 76
2.3.3 自下而上的语法分析 87
2.3.4 语法错误 1 99
2.4 理论基础 13 100
2.4.1 有穷自动机 13
2.4.2 下推自动机 18
2.4.3 文法和语言类 19
2.5 总结和注记 101
2.6 练习 102
2.7 探索 108
2.8 有关参考文献 109
第3章 名字、作用域和约束 111
3.1 约束时间的概念 112
3.2 对象生存期和存储管理 114
3.2.1 静态分配 115
3.2.2 基于栈的分配 117
3.2.3 基于堆的分配 118
3.2.4 废料收集 120
3.3 作用域规则 121
3.3.1 静态作用域 123
3.3.2 嵌套子程序 124
3.3.3 声明的顺序 127
3.3.4 模块 132
3.3.5 模块类型和类 136
3.3.6 动态作用域 139
3.4 作用域的实现 29 143
3.4.1 符号表 29
3.4.2 关联表和中心引用表 33
3.5 作用域中名字的含义 144
3.5.1 别名 144
3.5.2 重载 146
3.5.3 多态性及相关概念 148
3.6 引用环境的约束 151
3.6.1 子程序闭包 153
3.6.2 一级值和非受限生存期 154
3.6.3 对象闭包 157
3.7 宏扩展 159
3.8 分别编译 39 161
3.8.1 c的分别编译 40
3.8.2 包和自动头文件推理 42
3.8.3 模块分层结构 43
3.9 总结和注记 162
3.10 练习 163
3.11 探索 171
3.12 有关参考文献 172
第4章 语义分析 175
4.1 语义分析器所扮演的角色 176
4.2 属性文法 180
4.3 属性求值 182
4.4 动作例程 191
4.5 属性的空间管理 49 196
4.5.1 自下而上求值 49
4.5.2 自上而下求值 54
4.6 语法树的标注 197
4.7 总结和注记 204
4.8 练习 205
4.9 探索 209
4.10 有关参考文献 210
第5章 目标机体系结构 65 213
5.1 存储器层次结构 66
5.2 数据表示 68
5.2.1 整数算术 69
5.2.2 浮点数算术 72
5.3 指令集体系结构 75
5.3.1 寻址模式 75
5.3.2 条件和分支 76
5.4 体系结构和实现 78
5.4.1 微程序设计 79
5.4.2 微处理器 80
5.4.3 risc 81
5.4.4 多线程和多核 82
5.4.5 两个示例体系结构:x86和mips 84
5.5 为新型处理器做编译 91
5.5.1 保持流水线满 91
5.5.2 寄存器分配 96
5.6 总结和注记 101
5.7 练习 103
5.8 探索 107
5.9 有关参考文献 109
第2部分 语言设计的核心问题 217
第6章 控制流 219
6.1 表达式求值 220
6.1.1 优先级和结合性 222
6.1.2 赋值 224
6.1.3 初始化 233
6.1.4 表达式中的顺序问题 235
6.1.5 短路求值 238
6.2 结构化和非结构化的流程 241
6.2.1 goto的结构化替代品 242
6.2.2 继续 245
6.3 顺序执行 246
6.4 选择 247
6.4.1 短路条件 248
6.4.2 case/switch语句 251
6.5 迭代 256
6.5.1 枚举控制的循环 256
6.5.2 组合循环 261
6.5.3 迭代器 262
6.5.4 icon的生成器 111 268
6.5.5 逻辑控制的循环 268
6.6 递归 270
6.6.1 迭代和递归 271
6.6.2 应用序和正则序求值 275
6.7 非确定性 115 277
6.8 总结和注记 278
6.9 练习 279
6.10 探索 285
6.11 有关参考文献 287
第7章 数据类型 289
7.1 类型系统 290
7.1.1 类型检查 291
7.1.2 多态性 291
7.1.3 “类型”的含义 293
7.1.4 类型的分类 294
7.1.5 正交性 301
7.2 类型检查 303
7.2.1 类型等价 303
7.2.2 类型相容性 310
7.2.3 类型推理 314
7.2.4 ml类型系统 125 316
7.3 记录(结构)与变体(联合) 317
7.3.1 语法和运算 318
7.3.2 存储布局及其影响 319
7.3.3 with语句 135 323
7.3.4 变体记录(联合) 139 324
7.4 数组 325
7.4.1 语法和操作 326
7.4.2 维数、上下界和分配 330
7.4.3 内存布局 335
7.5 字符串 342
7.6 集合 344
7.7 指针和递归类型 345
7.7.1 语法和操作 346
7.7.2 悬空引用 149 356
7.7.3 废料收集 357
7.8 表 364
7.9 文件和输入/输出 153 367
7.9.1 交互式i/o 153
7.9.2 基于文件的i/o 154
7.9.3 正文i/o 156
7.10 相等检测和赋值 368
7.11 总结和注记 371
7.12 练习 373
7.13 探索 379
7.14 有关参考文献 380
第8章 子程序和控制抽象 383
8.1 回顾栈的布局 384
8.2 调用序列 386
8.2.1 区头向量 169 389
8.2.2 案例研究:在mips上实现c,在x86上实现pascal 173 389
8.2.3 寄存器窗口 181 390
8.2.4 内联展开 391
8.3 参数传递 393
8.3.1 参数模式 394
8.3.2 名字调用 185 402
8.3.3 特殊目的的参数 403
8.3.4 函数返回 408
8.4 泛型子程序和模块 410
8.4.1 不同的实现方法 412
8.4.2 泛型参数的约束条件 414
8.4.3 隐式实例化 416
8.4.4 c++、java和c#中的泛型 189 417
8.5 异常处理 418
8.5.1 异常的定义 421
8.5.2 异常的传播 423
8.5.3 异常的实现 425
8.6 协作程序 428
8.6.1 栈分配 430
8.6.2 转移 432
8.6.3 迭代器的实现 201 433
8.6.4 离散事件模拟 205 433
8.7 事件 434
8.7.1 顺序处理程序 434
8.7.2 基于线程的处理程序 436
8.8 总结和注记 438
8.9 练习 439
8.10 探索 446
8.11 有关参考文献 447
第9章 数据抽象和面向对象 449
9.1 面向对象程序设计 451
9.2 封装和继承 460
9.2.1 模块 460
9.2.2 类 463
9.2.3 嵌套(内层类) 465
9.2.4 类型扩展 466
9.2.5 不使用继承扩展 468
9.3 初始化和终结处理 469
9.3.1 构造函数的选择 470
9.3.2 引用和值 472
9.3.3 执行顺序 475
9.3.4 废料收集 477
9.4 动态方法约束 478
9.4.1 虚方法和非虚方法 480
9.4.2 抽象类 482
9.4.3 成员查找 482
9.4.4 多态性 486
9.4.5 对象闭包 489
9.5 多重继承 215 491
9.5.1 语义歧义性 217
9.5.2 复本式继承 220
9.5.3 共享继承 222
9.5.4 混入式继承 223
9.6 重温面向对象的程序设计 492
9.6.1 smalltalk的对象模型 227 493
9.7 总结和注记 494
9.8 练习 495
9.9 探索 498
9.10 有关参考文献 499
第3部分 其他程序设计模型 503
第10章 函数式语言 505
10.1 历史渊源 506
10.2 函数式程序设计的概念 507
10.3 scheme回顾/简介 509
10.3.1 约束 512
10.3.2 表和数 513
10.3.3 相等检测和检索 514
10.3.4 控制流和赋值 515
10.3.5 程序作为表 517
10.3.6 一个扩展的实例:dfa模拟 519
10.4 重温求值顺序 521
10.4.1 严格求值和惰性求值 523
10.4.2 i/o:流和单体 525
10.5 高阶函数 530
10.6 理论基础 237 534
10.6.1 lambda 演算 239
10.6.2 控制流 242
10.6.3 结构 244
10.7 函数式程序设计展望 534
10.8 总结和注记 537
10.9 练习 538
10.10 探索 542
10.11 有关参考文献 543
第11章 逻辑式语言 545
11.1 逻辑式程序设计的概念 546
11.2 prolog 547
11.2.1 归结和合一 549
11.2.2 表 550
11.2.3 算术 551
11.2.4 搜索/执行顺序 552
11.2.5 一个较大的实例:九宫棋 554
11.2.6 命令式控制流 557
11.3 理论基础 253 566
11.3.1 子句形式 254
11.3.2 局限性 255
11.3.3 skolem 257
11.4 逻辑式程序设计的展望 566
11.4.1 没有覆盖的逻辑部分 566
11.4.2 执行顺序 567
11.4.3 否定和“闭世界”假设 568
11.5 总结和注记 570
11.6 练习 571
11.7 探索 573
11.8 有关参考文献 573
第12章 并发 575
12.1 基础和动力 576
12.1.1 多线程程序的各种情况 579
12.1.2 多处理器体系结构 581
12.2 并发程序设计基础 586
12.2.1 通信和同步 587
12.2.2 语言和库 588
12.2.3 创建线程的语法 589
12.2.4 线程的实现 598
12.3 实现 603
12.3.1 忙等待同步 604
12.3.2 非阻塞算法 607
12.3.3 内存一致模型 610
12.3.4 调度器的实现 613
12.3.5 信号量 617
12.4 语言级机制 619
12.4.1 管程 619
12.4.2 条件临界区域 624
12.4.3 java中的同步 626
12.4.4 事务存储 629
12.4.5 隐式同步 633
12.5 消息传递 263 637
12.5.1 通信对方的命名 263
12.5.2 发送 267
12.5.3 接收 272
12.5.4 远程过程调用 278
12.6 总结和注记 638
12.7 练习 640
12.8 探索 645
12.9 有关参考文献 647
第13章 脚本语言 649
13.1 什么是脚本语言? 650
13.1.1 公共特性 652
13.2 问题领域 655
13.2.1 外壳(命令)语言 655
13.2.2 文字处理和报表生成 663
13.2.3 数学和统计 667
13.2.4 “粘结”语言和通用脚本 668
13.2.5 扩充语言 676
13.3 万维网脚本 680
13.3.1 cgi脚本 680
13.3.2 嵌入式服务器端脚本 681
13.3.3 客户端脚本 686
13.3.4 java小程序 686
13.3.5 xslt 287 689
13.4 新特征 691
13.4.1 名字和作用域 691
13.4.2 串和模式匹配 696
13.4.3 数据类型 704
13.4.4 面向对象 710
13.5 总结和注记 717
13.6 练习 718
13.7 探索 723
13.8 有关参考文献 724
第4部分 对实现的近距离考查 727
第14章 构造可运行的程序 729
14.1 后端编译器结构 729
14.1.1 一种可行的多阶段组织 730
14.1.2 阶段和遍 734
14.2 中间形式 303 734
14.2.1 diana 303
14.2.2 gcc中间形式 306
14.2.3 基于栈的中间形式 736
14.3 代码生成 738
14.3.1 一个属性文法实例 738
14.3.2 寄存器分配 741
14.4 地址空间组织 744
14.5 汇编 746
14.5.1 指令发射 748
14.5.2 为名字指定地址 749
14.6 连接 750
14.6.1 重定位和名字解析 751
14.6.2 类型检查 751
14.7 动态连接 311 754
14.7.1 与定位无关的代码 312
14.7.2 完全动态连接(惰性连接) 313
14.8 总结和注记 755
14.9 练习 756
14.10 探索 758
14.11 有关参考文献 759
第15章 运行时程序管理 761
15.1 虚拟机 764
15.1.1 java虚拟机 766
15.1.2 公共语言基础架构 775
15.2 机器码的迟绑定 784
15.2.1 即时和动态编译 785
15.2.2 二进制翻译 791
15.2.3 二进制重写 795
15.2.4 移动代码和沙箱 797
15.3 审查/自反 799
15.3.1 自反 799
15.3.2 符号调试 806
15.3.3 性能分析 809
15.4 总结和注记 811
15.5 练习 812
15.6 探索 815
15.7 有关参考文献 816
第16章 代码改进 321 817
16.1 代码改进的阶段 323
16.2 窥孔优化 325
16.3 基本块内的冗余删除 328
16.3.1 一直使用的实例 328
16.3.2 值编号 331
16.4 全局冗余删除和数据流分析 336
16.4.1 ssa(静态单赋值)形式和全局值编号 336
16.4.2 全局公共子表达式删除 339
16.5 循环改进i 346
16.5.1 循环不变量 347
16.5.2 归纳变量 348
16.6 指令调度 351
16.7 循环改进ii 355
16.7.1 循环展开和软件流水线 355
16.7.2 循环重排 359
16.8 寄存器分配 366
16.9 总结和注记 370
16.10 练习 377
16.11 探索
16.12 有关参考文献
附录a 本书中提到的程序设计语言 819
附录b 语言设计和语言实现 831
附录c 编号示表 835
程序设计语言:实践之路(第3版)
- 名称
- 类型
- 大小
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×
亲爱的云图用户,
光盘内的文件都可以直接点击浏览哦
无需下载,在线查阅资料!
