新書推薦:
《
算法图解(第2版)
》
售價:HK$
78.2
《
科学的奇幻之旅
》
售價:HK$
77.3
《
画艺循谱:晚明的画谱与消闲
》
售價:HK$
143.4
《
新民说·现实政治史:从马基雅维利到基辛格
》
售價:HK$
99.7
《
宽容是件奢侈品(人生360度·一分钟经典故事)
》
售價:HK$
44.6
《
甲骨拼合六集
》
售價:HK$
333.8
《
视觉美食家:商业摄影实战与创意解析
》
售價:HK$
132.2
《
中国经济发展的新阶段:机会与选择
》
售價:HK$
99.7
|
內容簡介: |
该书共分为6章,其中第1章为介绍,第2~5章依次为数据流分析、基于约束的分析、抽象解释、类型和作用系统,第6章为分析算法介绍。该书内容基本囊括了程序分析领域中的经典方法和技术,配以严谨的形式化系统,全书思路清晰、逻辑性强,是不可多得的经典书籍。
|
目錄:
|
前言第1章概述111什么是程序分析112设置场景213数据流分析3131等式方法3132基于约束的方法514基于约束的分析615抽象解释816类型和作用系统11161注释类型系统12162作用系统1417算法1618程序转换17结束语18迷你项目18练习20第2章数据流分析2221过程内数据流分析22211可用表达式分析24212到达定值分析26213很忙的表达式分析29214活跃变量分析31215派生数据流信息3322理论性质34221结构操作语义34222活跃变量分析的正确性3823单调框架41231基本定义43232案例回顾44233一个不可分配的例子4624等式系统的求解47241MFP解47242MOP解5025过程间分析53251结构操作语义55252过程内分析与过程间分析56253显式使用上下文58254调用字符串作为上下文61255假设集作为上下文63256流敏感与流不敏感6426形状分析66261结构操作语义67262形状图70263分析的描述73结束语82迷你项目84练习86第3章基于约束的分析9031抽象0CFA分析90311分析的描述91312分析的明确定义9632理论性质97321结构操作语义98322语义正确性101323解的存在性104324余归纳和归纳的比较10633语法引导的0CFA分析108331语法引导的规范108332解的保持11034基于约束的0CFA分析111341解的保持113342约束的求解11335添加数据流分析117351抽象值为幂集117352抽象值为完全格11936添加上下文信息122361均匀kCFA分析123362笛卡儿积算法127结束语128迷你项目130练习132第4章抽象解释13541一种普通的正确性定义135411正确性关系136412表示函数138413一个较小的扩展13942不动点的近似141421加宽算子143422变窄算子14643Galois连接149431Galois连接的性质152432Galois插入15544Galois连接的系统的设计方法157441组件上的组合159442其他组合方式16245衍生的操作165451沿着抽象化函数衍生165452数据流分析中的应用168453沿着具体化函数衍生171结束语174迷你项目176练习177第5章类型和作用系统18251控制流分析182511底层类型系统183512基于类型的分析18452理论性质187521自然语义187522语义正确性189523解的存在性19153类型推导算法193531一个底层类型系统的算法193532一个控制流分析的算法196533语法可靠性和完备性200534解的存在性20454作用205541副作用分析206542异常分析210543区域推导21355行为219551通信分析219结束语225迷你项目228练习231第6章算法23461工作列表算法234611工作列表算法的结构235612LIFO和FIFO迭代23862逆后序迭代239621循环算法24263在强分量里迭代243结束语245迷你项目247练习248附录A偏序集合250附录B归纳和余归纳258附录C图和正则表达式265参考文献272符号索引283术语索引287
|
內容試閱:
|
本书的写作目的我们写这本书有两个目的:一是很长时间以来我们缺乏用于教授程序分析课程的教材,这迫使我们使用会议论文、期刊和已绝版的教科书的章节来替代;二是我们越来越感觉到研究人员在该领域的不同分支研究类似的问题时,没有充分意识到其他分支已有的领悟和发展。这促使我们撰写一本不但对程序分析的高级课程有用,而且能提高对该领域不同技术路线相似性的认识的教材。我们可以用计算复杂性理论做个比喻。假设研究人员或学生想通过查阅文献寻找解决图问题的巧妙算法或启发式方法。他们可能会碰到描述解决布尔公式问题的巧妙算法或启发式方法的文献。或许他们会忽略这些文献,认为图和布尔公式显然是完全不同的东西。然而复杂性理论告诉我们这是一个错误的观点。不同问题之间的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 NielsonHanne Riis NielsonChris Hankin1999年8月于奥胡斯和伦敦第二次印刷的前言在第二次印刷中,我们纠正了第一次印刷的错误和缺陷,感谢Torben Amtoft、John Tang Boyland、 Jurriaan Hage和Mirko Luedde,以及我们的学生的敏锐观察。
|
|