





























1、该文档不包含其他附件(如表格、图纸),本站只保证下载后内容跟在线阅读一样,不确保内容完整性,请务必认真阅读。
2、有的文档阅读时显示本站(www.woc88.com)水印的,下载后是没有本站水印的(仅在线阅读显示),请放心下载。
3、除PDF格式下载后需转换成word才能编辑,其他下载后均可以随意编辑、修改、打印。
4、有的标题标有”最新”、多篇,实质内容并不相符,下载内容以在线阅读为准,请认真阅读全文再下载。
5、该文档为会员上传,下载所得收益全部归上传者所有,若您对文档版权有异议,可联系客服认领,既往收入全部归您。
为任意软件提供种对程序员透明的程序终生分析和优化的编译器框架。
依靠两个方面实现这个目标个有着多个新颖特性的代码表示方式,它成为了代码分析转换和发布的共同表示方式个成功利用这个表示方式的编译器设计,提供了组先前的我们所知的编译方法都没有的能力。
代码表示方式用种抽象的风格的指令集来表示程序,不过它还为有效地进行程序分析提供了较高层次的信息。
这包括类型信息,显式的控制流图,和个太原科技大学学士学位论文显式的数据流表示方式在静态单赋值形式中,使用了个无限的,类型化的寄存器组。
的代码表示方法有多个新颖的特性个低层次的,语言独立的类型系统,可以用来实现高级语言的数据类型和操作,把它们高级语言的实现公开到所有阶段的优化。
这个类型系统包括了被复杂的不过语言独立的技术使用的信息,例如指针分析算法,依赖性分析,和数据转化。
用来执行类型变换和低层次的地址运算保留类型信息的指令。
两条异常处理指令,用来在向编译器公开异常控制流的同时实现高级语言中的异常语义。
表示方式之所以是源语言独立的,有两个原因。
第,它使用了个低层次的指令集和内存模型,这些只是比标准的汇编语言稍微丰富点而已,它的类型系统并不妨碍用很少的类型信息来表示代码。
第二,它没有给程序强加任何特定的运行时需求或者语义。
然而,需要注意的是,不是个普遍通用的编译器。
尤其是,没有直接表示高级语言的特性因此它不能用于些依赖于语言的转换,它也无法获取依赖于机器的特性或者后端代码生成器使用的代码序列它需要降低才能做到这个。
因为目标和表示形式不同,和高级的虚拟机例如微软的,以及其他的是互补的,而且不是这些系统的替代品。
它在三个关键方面区别于这些系统。
第,没有像类继承或者异常处理语义这些高级建设的概念,即便编译有这些特性的源语言时也没有。
第二,没有指定个运行时系统或者特定的目标模型它足够低级,个特定语言的运行时系统本身就可以用实现。
第三,没有保证类型安全内存安全或者语言的互操作性,等任何个物理处理器的汇编语言没有做的。
编译器框架利用这个代码表示方式,提供了五种能力,我们认为这些能力对实现任意程序的终生分析和转变很重要。
般来说,这些能力很难同时获得,但是,天生就可以做到持久的程序信息这个编译模型在应用的整个生命期都使用表示方式,允许在所有阶段执行复杂的优化,包括运行时和不同运行间的空闲时间。
离线代码生成尽管是最后点,可以使用不适合运行时代码生成的昂贵代码生成技术,离线地把程序编译成高效地本地机器码。
基于用户的概要分析和优化框架在运行时现场搜集概要信息,这样比较具有实际用户的代表性,可以用来支持运行时和空闲时的配置导向的转换。
透明的运行时模型这个系统没有指定任何特定的目标模型异常语义,或者运行时环境,因此它允许任何语言或者不同语言的组合使用它来编译。
统的整个程序的编译语言独立性使得它可以用种统的方式优化和编译构成个应用的所有代码,包括语言特定的库和系统库。
我们相信以往没有系统提供所有这五个属性。
源级别的编译器提供了和,单不希望提供和。
商业编译器普遍使用的链接时间的过程间优化器,还提供了和,但只达到链接时间。
静态语言的配置导向的优化器,在没有透明地条件下提供了,而且关键的是它不提供。
高级语言的虚拟机,例如和提供了,也部分地提供和,但是不计划提供,而且要么不提供,要么不同或者。
二进制运行时优化系统提供,和,但是只在运行时间有限的范围内提供,最重要的是它不提供。
我们将在第三节中详细地解释这些。
太原科技大学学士学位论文我们评估系统的有效性依据了三个方面的问题表示形式的尺寸大小和有效性,包括从程序中提取有用类型信息的能力编译器的性能不是生成代码的性能,代码生成的性能依赖于具体代码生成器或者所有的优化序列证明为解决些挑战性的编译器问题,提供的关键能力的例子。
我们的实验结果表明编译器为的系列基准程序中的平均的静态内存访问指令提取了可靠的类型信息,而且实际上所有书写规范的程序的内存访问都满足。
我们还在我们的经验上讨论,为什么捕获的类型信息足够安全地执行许多通常只会在类型安全语言的原级别编译器中才会这么做的大胆的转换。
代码尺寸测量表明,尽管捕捉了更丰富的类型信息,使用个无限的形式的寄存器组,表示形式还是可以媲及机器码个体系结构,同时大概平均比代码要小。
最后,我们给出了示例计时,表明表示形式支持极速的过程间优化。
到现在,我们的实现支持和,这两种语言通常都是静态编译的。
现在我们正在研究对和这样的动态的实现是否有益。
在个非限制性许可证下,可以免费获得。
这篇文章剩余的部分组织如下。
第节描写的代码表示形式。
然后第节描写编译器框架的设计。
第节讨论我们对系统的评估,如上面所说。
第节把跟其它相关的系统对比。
第节对这篇文章进行总结。
语言独立类型信息和个的基本设计特性是它包括个语言独立的类型系统。
每个寄存器和显式的内存对象都有个关联的类型,所有的操作都需要遵守严格的类型规则。
类型信息和指令操作码结合在起,决定了条指令确切的语义例如,条加法指令是浮点型还是整型。
这些类型信息能够支持广泛的低级代码的转换。
此外,类型匹配对于检测优化器非常有用。
类型系统包括源语言独立的预先定义大小的基本类型空类型,布尔型,从比特到比特的有符号或者无符号整型,和单双精度的浮点型。
这使得它能够使用这些类型书写可移植的代码,不可移植的代码则可以直接表示。
还包括个衍生类型指针,数组,结构体,和函数。
我们相信,基于它们的操作行为,所有高级语言的数据类型都可以用这种类型的组合来表示。
例如,带继承的类可以用结构体函数,函数指针数组来实现。
同样重要的是,上面的四种衍生类型甚至捕获了复杂的语言独立的分析和优化用到的类型信息。
例如,域敏感的指向分析,调用关系图构造包括像这样的面向对象语言,标量到集合的晋升,只使用指针结构体函数和基本数据类型,而数组依赖关系分析和循环转换使用了所这些类型和数组类型。
因为是语言独立的,而且必须支持弱类型语言,所以在个合法的程序中的声明的类型信息可能并不可靠。
相反,必须使用些指针分析算法来区分指针类型不可靠而它的目标类型可靠的内存访问。
包含有那样的个分析。
我们的结果显示,虽然允许把任意类型转换成其它类型,大部分编译成的程序中地内存访问,都能够获得可靠的类型信息。
的指令被用来把个值转换成任意种其它类型,并且它执行这种太原科技大学学士学位论文操作的唯方式。
指令使得所有的类型转换都成为显式的,包括类型强制转换中没有混合类型操作物理子类型的显式造型和非类型安全代码的重解释造型。
个没有指令的程序必然是类型安全的不存在内存访问,例如,数组溢出。
为低级代码保留类型信息的个关键的困难是实现地址运算。
指令被系统用来执行保留类型信息并且拥有机器无关语义的指针运算。
给定个个集合类型对象的指针,这条指令会以保留类型的方式计算这个对象的子元素的地址实际上相当于的或操作符。
例如,语句可以翻译成对指令在这,我们假设是结构体的第三个域号,并且这个结构体的类型是。
使所有的地址运算都成为显式的非常重要,这样它就对所有的优化公开了对重新组合和冗余消除最重要做到这点,却没有模糊化类型信息。
加载和存储指令需要个指针,并且没有执行任何的索引操作,这使得内存操作变得简单而统。
运行时间路径的概要分析和再优化工程的个目标就是为普通应用程序的运行时优化开发种新的策略。
虽然这个工作超出了这篇文章的范畴,我们还是简要地描述下这种策略和它关键的好处。
程序执行时,最频繁的执行路径通过组离线和在线的测试装置来识别。
离线的测试装置通过本地代码生成器插入识别出代码中频繁执行的循环区域。
当个热点区域在运行时间被检测时,个运行时间的测试装置库会测试正在执行本地代码,以识别这个区域中频繁执行的路径。
旦热点路径被识别,我们就把原来的代码复制到个跟踪器,在它身上执行优化,然后为它重新生成本地代码,放入个软件管理跟踪缓存中。
接着,我们在原来的代码和新的代码间插入跳转指令。
这个策略很强大,因为它组合了下三个特性本地代码可以使用复杂的算法事先高质量地生成。
本地代码生成器和运行时间优化器可以起工作,因为它们都是框架的部分,这就允许运行时间优化器利用代码生成器的支持比如,为测试装置和简化转换提供支持。
运行时间优化器可以使用表示方式的高层次信息来执行复杂的运行时间优化。
我们相信这三个特性组合在起代表了个运行时间优化器的最佳设计点,因为它们允许在三个方面做出最佳选择高质量的初始代码生成离线而不是在线,来自代码生成器的协作支持,以及进行复杂分析和优化的能力使用输入而不是本地代码。
使用终端用户的概要信息进行离线再优化因为表示方式直都被保留着,这使得我们可以在终端用户的系统上程序运行的空闲时间对应用程序进行透明的离线优化。
这样的优化器只是链接时间过程间优化器的个修改版本,不过,它更加强调概要驱动和目标相关的优化。
个离线的空闲时间的优化器有几个关键的好处。
第,就像前面提到的,不同于传统的概要驱动优化比如,编译时间的或者链接时间的,它能够从终端用户的应太原科技大学学士学位论文用程序运行搜集概要信息。
它甚至可以对应用程序进行多次再优化,以应对随着时间变化使用模式的改变或者当用户模式改变时进行不同的优化。
第二,它可以根据台机器的细节特性来裁剪代码,而传统的二进制发布代码通常必须以兼容的体系结构和操作系统在配置不同的机器上运行。
第三,不同于运行时间的优化器拥有前两个好处,它能够进行更加大胆的优化,因为它是离线的。
然而,运行时间的优化可以进步提高性能,因为它不但可以基于运行时间的值来执行优化,还可以执行路径敏感的优化如果在离线时激进地去做,可能会大量增加程序的代码量,它还可以在运行期间针对性地为运行行为的改变而优化代码。
因此,对于动态长期运行的应用程序,协调利用运行时间和离线时间优化器,可以确保实现最高可达的性能。
太原科技大学学士学位论文附录Ⅱ程序代码类型的实现文件
