基于过程集成编译优化.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于过程集成编译优化

基于过程集成编译优化   摘 要 过程间的优化是扩大编译器的视野,把一个一个的过程作为其优化的对象。文章对实现过程集成的前提条件和具体实现步骤进行研究,分析其特点、算法和性能。   关键词 编译优化;过程集成;语言内嵌   中图分类号:TP202 文献标识码:A 文章编号:1671-7597(2013)22-0071-02   编译程序的主要任务就是把用户用高级语言的编写的程序转换成机器语言,在确保正确转换的前提下编译程序应尽可能的根据目标机器的特点对源程序进行优化,以提高目标程序的运行效率。传统的编译器对源程序的优化大多集中在单个过程内部,而事实上一个程序可有很多过程组成,如果编译器能够进行过程间的优化,充分利用过程间的信息,那么必将大大提高目标程序运行效率。   1 过程集成   过程集成也称作自动内嵌,它通过复制过程的程序体来置换对过程的调用。是一种非常有用的优化技术。它把调用从一个不透明的对象——这个对象会对重名的变量和参数产生不可预知的影响,转变成本地的代码,这个代码不仅能够展示其作用也能被作为调用过程的一部分而加以优化。   一个程序有很多过程组成,过程之间存在调用,很多时候这些调用是非常频繁的。如果我们不对其处理,每次调用时程序都要在内存中为调用开辟空间来存放上下文信息,甚至有些时候这些空间可能大于被调用的程序的本身。因此我们设想用被调用过程本身来替换对其的调用,也就是把调用和被调用者整合为一个程序,这样通过整合消除了调用,节省了系统资源,减少了运行时开辟调用空间的时间,大大提高了程序的运行效率。   但是我们不可能整合所有的过程来消除所有的调用,因为整合会带来源代码体积的增大,会引起指令缓存的失效。我们必须根据一定的规则来整合过程。这种调用的规则有如下几种:   平均循环体积大小算法。使用失效代价来决定是否合并过程。当失效代价增大时,建议合并较少的过程。   体积临界值方法。所有体积小于该临界值的方法我们都加以整合。   比例临界值方法。比例指的是被调用过程在每一个调用点执行的次数和被调用过程的体积的比。如???这个比例超过某个临界值,那么我们就合并这个过程。   2 过程集成的前提   当我们决定在一个编译系统中应提供多大程度的过程集成以及如何实现这种程度时,我们必须考虑以下的几个问题。   1)提供基于多个编译单元还是基于单个编译单元?如果是前者,我们需要提供一种方法来保存过程的中间代码表示,或者更有可能保存整个编译单元到文件,因为我们通常并不是依赖编译用户来决定集成哪个过程的。如果是后者,我们仅仅需要当在单独的编译单元中需要做合适的内嵌时,我们能够保存中间代码。   2)如果我们提供基于多个编译单元的过程集成,我们需要决定是不是需要调用者和被调用者用同一种语言编写或者是不是支持用不同的语言编写他们。在这里主要考虑的问题是不同的语言有不同的传递参数和访问非本地变量的规则,这些规则需要根据内嵌的过程分别加以考虑。处理参数传递规则不同的一种技术是:给在源语言中单独被编译的过程提供一个“外部语言名过程名”声明作为接口的一部分,这样也说明了书写外部语言的源语言。这将会引起对外部程序的调用,这个程序遵循编写他所用的语言的参数传递规则。   3)在交错编译单元过程集成中,我们是不是需要保存被内嵌的过程的中间代码复本,尤其是一些语言把过程的可见性限制在它嵌套的范围中。例如:Pascal中的被嵌套过程,模块化语言族和Mesa中的非接口过程,Fortran 77中的声明过程,Fortran 90中没有被外部声明的过程。如果保存中间代码的目的仅仅是为了完成过程集成,那么对编译单元而言这些过程的复本不需要被保持在一种被保存的中间代码的状态,因为在其视野外部我们不能引用他们。从另一方面来说如果目的是为了减少在对源语言作出改动后重编译的时间,那么我们需要保存中间代码。   4)假定我们在所有可见的调用点内嵌了一个过程,那么我们是不是需要编译整个过程的复本?如果过程的地址采用C语言的形式或者将会被当前不可见的其他的编译单元调用,我们才需要这样做。   5)我们是不是应该完成递归过程的所有内嵌?很显然我们不能这么做除非我们能够运行完所有的调用,而这将是一个没有穷尽的过程。但是内嵌递归过程一到两次还是很有意义的,因为能够降低对其的调用负载。   3 实现与应用   一旦我们选定了在哪个调用点集成哪个过程的标准,剩下的问题就是如何完成集成。一个明显的部分就是用相应的过程的复制来替换对其的调用。一般性起见,我们假定是在中间代码级实现的,这样就能够做多语言间的内嵌,在这里3个主要的问题:   1)满足语言所包含的参数传递的规则。   2)处理调用者和被调用者的参数名字的冲突。   3)处理静态变量

文档评论(0)

erterye + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档