书籍作者:弗莱明·尼尔森 | ISBN:9787111706885 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:2125 |
创建日期:2023-05-07 | 发布日期:2023-05-07 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
该书共分为6章,其中第1章为介绍,第2~5章依次为数据流分析、基于约束的分析、抽象解释、类型和作用系统,第6章为分析算法介绍。该书内容基本囊括了程序分析领域中的经典方法和技术,配以严谨的形式化系统,全书思路清晰、逻辑性强,是不可多得的经典书籍。
本书的写作目的
我们写这本书有两个目的:一是很长时间以来我们缺乏用于教授程序分析课程的教材,这迫使我们使用会议论文、期刊和已绝版的教科书的章节来替代;二是我们越来越感觉到研究人员在该领域的不同分支研究类似的问题时,没有充分意识到其他分支已有的领悟和发展。这促使我们撰写一本不但对程序分析的高级课程有用,而且能提高对该领域不同技术路线相似性的认识的教材。
我们可以用计算复杂性理论做个比喻。假设研究人员或学生想通过查阅文献寻找解决图问题的巧妙算法或启发式方法。他们可能会碰到描述解决布尔公式问题的巧妙算法或启发式方法的文献。或许他们会忽略这些文献,认为图和布尔公式显然是完全不同的东西。然而复杂性理论告诉我们这是一个错误的观点。不同问题之间的log空间规约关系和NP完全问题的概念让我们意识到表面上不相关的问题实际上可能密切相关,以至于某个问题的巧妙算法或启发式方法可能引向另一个问题的算法或启发式方法。我们认为,学习程序语言的学生,特别是学习程序分析的学生经常被允许做出类似的幼稚决定,这是一个令人悲哀的事实。程序分析理论还远远不能将不同技术路线的想法准确而密切地联系在一起,但我们希望这本书可以是一个开始。事实上,我们希望令一些读者感到震惊,让他们发现自己在工作中使用的方法与看似不相关的方法之间有重要的相似性。
本书的重点是(我们认为的)程序分析的四个主要方法:数据流分析、基于约束的分析、抽象解释、类型和作用系统。对于每种方法,我们的目标是鉴别和描述主要技术原理,而不是提供一个分析方法和程序语言构造的“宝典”。我们希望告诉读者如何把基本原理用于更复杂的程序语言和分析。
因此,我们特意决定不涵盖一些很有意思的方法,包括作者非常喜爱的方法,以保留篇幅来对这四种主要方法做比较深入的阐述。本书没有介绍的方法包括基于指称的程序分析、投影分析、基于Stone对偶性的逻辑表述。由于篇幅有限,我们也不得不省略一些本应在本书中有一席之地的方法,包括基于集合的约束、基于类型的分析的高效实现技术、静态单赋值形式(SSA)、更广的指针分析,以及程序分析与程序变换之间的相互影响和如何高效地重算因程序变换而失效的分析。
如何阅读本书
本书相对来说是自成一体的,但具有离散数学和编译原理方面的背景会对阅读本书有帮助。在本书的主要部分(第2~5章),每章的前半部分以严谨的形式介绍基本技术,后半部分以不那么严谨的方式介绍高级技术。
第1章是为了快速阅读。目的是概述程序分析的主要技术,强调程序分析把近似作为本质目的,并展示表面上不同的技术具有内在的相似性。我们推荐所有读者都阅读第1章,即使最终目的是专注于本书某一章的内容。
第2章介绍数据流分析。21~24节覆盖过程内分析的基本技术,包括单调框架作为位向量框架的推广,以及高效计算的工作列表算法。22节覆盖更理论的性质(语义正确性),第一次阅读时可以跳过该节。该节使用了格理论,可参考附录A1和附录A2,以及附录A3的一部分。 25节包含高级内容,给出了过程间分析,包括基于调用字符串和基于假设集的方法。25节是学习第3章的基础,建议至少阅读到252节。26节也包含高级内容,展示如何结合简单的技术来设计一个非常复杂的形状分析。这些内容与本书的其余章节没有太大关系。
第3章讲述基于约束的分析。这里明确区分了分析结果的安全性和如何计算最好的分析结果,同时强调了分析开放系统的必要性。31节、33节和34节介绍基本技术,包括余归纳概念,建议参考附录B(建立在附录A4的Tarski定理的基础上)。32节介绍较理论的性质(语义正确性和最优解的存在性),第一次阅读时可以跳过该节。35节和36节扩展这些技术,将其与数据流分析联系起来。35节介绍如何结合单调框架(见23节),36节介绍如何基于调用字符串和假设集(见25节)添加上下文。
第4章以独立于程序语言的方式介绍抽象解释理论,强调它能与数据流分析和基于约束的分析结合使用。41节介绍一些关键考虑因素,并为后几节的技术性定义做铺垫。42节介绍加宽算子和变窄算子,用于不动点的近似。43节介绍Galois连接。按这个顺序编排内容的目的是强调加宽算子的根本重要性,但这两节是相互独立的。44节和45节研究如何以系统的方式构造Galois连接,以及如何使用它们衍生近似分析,这些内容与本书的其余章节没有太大关系。
第5章介绍类型和作用系统,这通常被认为是一种和前面介绍的技术十分不同的程序分析方法。51节介绍主要方法(涵盖与第3章的基于约束的分析的联系),来帮助读者初步了解该方法。52节研究更理论的性质(语义正确性)。53节讨论算法问题(算法W的一个变体的可靠性和完备性),第一次阅读时可以跳过该节。54节和55节将逐步介绍类型和作用系统的更高级的内容。
第6章介绍数据流分析和基于约束的分析的算法,主要涉及不等式系统求解的通用技术。我们强调相同的算法在很大程度上可用于程序分析领域的很多不同情况。61节介绍一个通用的工作列表算法,将工作列表上的操作看作一个抽象数据类型,并证明该算法的正确性和复杂度。62节介绍如何组织工作列表使迭代根据逆后序进行,其中循环算法是一个特例。63节的算法进一步识别强分量,并在每个强分量完成逆后序迭代之后才考虑下一个强分量。
附录A和附录C介绍偏序集合、图和正则表达式的概念,本书有多处涉及了这些概念。附录B类似于教程,因为余归纳对于大多数读者来说可能是一个新概念。
我们使用的符号大多数是标准的,当使用时再解释。一些常用的符号解释如下:
“iff”为“if and only if”(当且仅当)的缩写。
…\[……\]代表语法替换和环境或存储的修改。
…→fin…表示有限函数(具有有限定义域的部分函数)的集合。
如果能让表达更为清晰,我们将使用λ符号表示函数:λx…x…表示由f(x)=…x…定义的一元函数f。
如何教授本书
本书包含的内容超过一个学期的课程内容。课程的进度自然取决于学生的背景,我们为大四学生和拥有不同背景的博士生都开设过这门课。下面我们总结教授本书不同部分需要多少课时,以作为以上关于如何阅读本书的内容的补充。
用两到三节课足以讲完第1章以及附录A1和附录A2中较简单的概念。
21节、23节和24节应该是任何数据流分析课程的核心内容。用三到四节课可以讲完21~24节,但如果学生缺乏操作语义或格理论(附录A1~A3的一部分)的背景知识,则需要增加一节课。25节和26节是高级内容。用一到两节课可以讲完25节,而在两节课内讲完26节比较困难。
用四到五节课应该能讲完第3章和附录B;但是,需要一段时间来熟悉余归纳的概念,因此最好解释不止一次。
用四到五节课应该能讲完第4章和附录A4。
用四节课应该能讲完第5章。
用两节课应该能讲完第6章,但如果需要复习附录C的大部分内容,则需要三节课。
我们把附录作为其他章节的一部分。实际上,第1章也介绍了一些基础的偏序概念,而且大多数学生对偏序、图和正则表达式已经有了一些了解。
本书包括很多练习和一些迷你项目,涉及本书内容的实践或理论方面的问题,以及不同章节之间的联系和类比。较难的练习标注了星号。
致谢
感谢Reinhard Wilhelm对本书的长期关注,他给了我们许多鼓励和建设性的意见。我们也从与Alan Mycroft、Mooly Sagiv、Helmut Seidl关于本书部分章节的讨论中受益匪浅。同事Alex Aiken、Torben Amtoft、Patrick Cousot、Laurie Hendren、Suresh Jagannathan、Florian Martin、Barbara Ryder、Bernhard Steffen也影响了这本书的写作,在此我们表示感谢。我们也感谢Schloss Dagstuhl主持了两次关键会议:1997年3月作者间的一周会议和1998年11月的高级讨论班。非常感谢参加在Dagstuhl举办的高级讨论班的学生,以及帮助测试本书的来自Aarhus、London、Saarbrücken和Tel Aviv的学生。最后我们感谢Springer出版社的Alfred Hofmann提供的非常令人满意的合同。René Rydhof Hansen帮助我们调整了LATEX命令。
Flemming Nielson
Hanne Riis Nielson
Chris Hankin
1999年8月于奥胡斯和伦敦
第二次印刷的前言
在第二次印刷中,我们纠正了第一次印刷的错误和缺陷,感谢Torben Amtoft、John Tang Boyland、 Jurriaan Hage和Mirko Luedde,以及我们的学生的敏锐观察。
前言
第1章概述1
11什么是程序分析1
12设置场景2
13数据流分析3
131等式方法3
132基于约束的方法5
14基于约束的分析6
15抽象解释8
16类型和作用系统11
161注释类型系统12
162作用系统14
17算法16
18程序转换17
结束语18
迷你项目18
练习20
第2章数据流分析22
21过程内数据流分析22
211可用表达式分析24
212到达定值分析26
213很忙的表达式分析29
214活跃变量分析31
215派生数据流信息33
22理论性质34
221结构操作语义34
222活跃变量分析的正确性38
23单调框架41
231基本定义43
232案例回顾44
233一个不可分配的例子46
24等式系统的求解47
241MFP解47
242MOP解50
25过程间分析53
251结构操作语义55
252过程内分析与过程间分析56
253显式使用上下文58
254调用字符串作为上下文61
255假设集作为上下文63
256流敏感与流不敏感64
26形状分析66
261结构操作语义67
262形状图70
263分析的描述73
结束语82
迷你项目84
练习86
第3章基于约束的分析90
31抽象0CFA分析90
311分析的描述91
312分析的明确定义96
32理论性质97
321结构操作语义98
322语义正确性101
323解的存在性104
324余归纳和归纳的比较106
33语法引导的0CFA分析108
331语法引导的规范108
332解的保持110
34基于约束的0CFA分析111
341解的保持113
342约束的求解113
35添加数据流分析117
351抽象值为幂集117
352抽象值为完全格119
36添加上下文信息122
361均匀kCFA分析123
362笛卡儿积算法127
结束语128
迷你项目130
练习132
第4章抽象解释135
41一种普通的正确性定义135
411正确性关系136
412表示函数138
413一个较小的扩展139
42不动点的近似141
421加宽算子143
422变窄算子146
43Galois连接149
431Galois连接的性质152
432Galois插入155
44Galois连接的系统的设计方法157
441组件上的组合159
442其他组合方式162
45衍生的操作165
451沿着抽象化函数衍生165
452数据流分析中的应用168
453沿着具体化函数衍生171
结束语174
迷你项目176
练习177
第5章类型和作用系统182
51控制流分析182
511底层类型系统183
512基于类型的分析184
52理论性质187
521自然语义187
522语义正确性189
523解的存在性191
53类型推导算法193
531一个底层类型系统的算法193
532一个控制流分析的算法196
533语法可靠性和完备性200
534解的存在性204
54作用205
541副作用分析206
542异常分析210
543区域推导213
55行为219
551通信分析219
结束语225
迷你项目228
练习231
第6章算法234
61工作列表算法234
611工作列表算法的结构235
612LIFO和FIFO迭代238
62逆后序迭代239
621循环算法242
63在强分量里迭代243
结束语245
迷你项目247
练习248
附录A偏序集合250
附录B归纳和余归纳258
附录C图和正则表达式265
参考文献272
符号索引283
术语索引287
很不错的一本书,程序员推荐读物
2022-10-22 10:41:54
不错的程序分析入门书 写工具的时候已经用到了
2022-09-11 17:00:43
JD购物方便快捷,快递给力!黑皮书,经典!
2022-10-14 15:23:29
物流很快,东西都是品,好用
2022-09-02 23:36:02
还可以,好好看看,应该还行
2022-08-31 23:42:38
技术部分翻译还行,前言翻译有待商榷
2022-08-17 09:38:36
确定是新书,用塑料膜封装,包装的很完整。。 这本书真的特别厚重,打印很清晰,内容很完整,没有缺页脏污。 。好好研究一波吧。
2022-08-16 15:21:06