基于过程集成的编译优化.doc

基于过程集成的编译优化.doc

ID:55690372

大小:54.00 KB

页数:6页

时间:2020-05-25

基于过程集成的编译优化.doc_第1页
基于过程集成的编译优化.doc_第2页
基于过程集成的编译优化.doc_第3页
基于过程集成的编译优化.doc_第4页
基于过程集成的编译优化.doc_第5页
资源描述:

《基于过程集成的编译优化.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、基于过程集成的编译优化摘要过程间的优化是扩大编译器的视野,把一个一个的过程作为其优化的对象。文章对实现过程集成的前提条件和具体实现步骤进行研究,分析其特点、算法和性能。关键词编译优化;过程集成;语言内嵌中图分类号:TP202文献标识码:A文章编号:1671-7597(2013)22-0071-02编译程序的主要任务就是把用户用高级语言的编写的程序转换成机器语言,在确保正确转换的前提下编译程序应尽可能的根据目标机器的特点对源程序进行优化,以提高目标程序的运行效率。传统的编译器对源程序的优化大多集中在单个过程内部,而事实

2、上一个程序可有很多过程组成,如果编译器能够进行过程间的优化,充分利用过程间的信息,那么必将大大提高目标程序运行效率。1过程集成过程集成也称作自动内嵌,它通过复制过程的程序体来置换对过程的调用。是一种非常有用的优化技术。它把调用从一个不透明的对象一一这个对象会对重名的变量和参数产生不可预知的影响,转变成本地的代码,这个代码不仅能够展示其作用也能被作为调用过程的一部分而加以优化。一个程序有很多过程组成,过程之间存在调用,很多时候这些调用是非常频繁的。如果我们不对其处理,每次调用时程序都要在内存中为调用开辟空间来存放上下文

3、信息,甚至有些时候这些空间可能大于被调用的程序的本身。因此我们设想用被调用过程本身来替换对其的调用,也就是把调用和被调用者整合为一个程序,这样通过整合消除了调用,节省了系统资源,减少了运行时开辟调用空间的时间,大大提高了程序的运行效率。但是我们不可能整合所有的过程来消除所有的调用,因为整合会带来源代码体积的增大,会引起指令缓存的失效。我们必须根据一定的规则来整合过程。这种调用的规则有如下几种:平均循环体积大小算法。使用失效代价来决定是否合并过程。当失效代价增大时,建议合并较少的过程。体积临界值方法。所有体积小于该临界

4、值的方法我们都加以整合。比例临界值方法。比例指的是被调用过程在每一个调用点执行的次数和被调用过程的体积的比。如果这个比例超过某个临界值,那么我们就合并这个过程。2过程集成的前提当我们决定在一个编译系统中应提供多大程度的过程集成以及如何实现这种程度时,我们必须考虑以下的几个问题。1)提供基于多个编译单元还是基于单个编译单元?如果是前者,我们需要提供一种方法来保存过程的中间代码表示,或者更有可能保存整个编译单元到文件,因为我们通常并不是依赖编译用户来决定集成哪个过程的。如果是后者,我们仅仅需要当在单独的编译单元中需要做合

5、适的内嵌时,我们能够保存中间代码。2)如果我们提供基于多个编译单元的过程集成,我们需要决定是不是需要调用者和被调用者用同一种语言编写或者是不是支持用不同的语言编写他们。在这里主要考虑的问题是不同的语言有不同的传递参数和访问非本地变量的规则,这些规则需要根据内嵌的过程分别加以考虑。处理参数传递规则不同的一种技术是:给在源语言中单独被编译的过程提供一个“外部语言名过程名”声明作为接口的一部分,这样也说明了书写外部语言的源语言。这将会引起对外部程序的调用,这个程序遵循编写他所用的语言的参数传递规则。3)在交错编译单元过程集

6、成中,我们是不是需要保存被内嵌的过程的中间代码复本,尤其是一些语言把过程的可见性限制在它嵌套的范围中。例如:Pascal中的被嵌套过程,模块化语言族和Mesa中的非接口过程,Fortran77中的声明过程,Fortran90中没有被外部声明的过程。如果保存中间代码的目的仅仅是为了完成过程集成,那么对编译单元而言这些过程的复本不需要被保持在一种被保存的中间代码的状态,因为在其视野外部我们不能引用他们。从另一方面来说如果目的是为了减少在对源语言作出改动后重编译的时间,那么我们需要保存中间代码。4)假定我们在所有可见的调用

7、点内嵌了一个过程,那么我们是不是需要编译整个过程的复本?如果过程的地址采用C语言的形式或者将会被当前不可见的其他的编译单元调用,我们才需要这样做。5)我们是不是应该完成递归过程的所有内嵌?很显然我们不能这么做除非我们能够运行完所有的调用,而这将是一个没有穷尽的过程。但是内嵌递归过程一到两次还是很有意义的,因为能够降低对其的调用负载。3实现与应用一旦我们选定了在哪个调用点集成哪个过程的标准,剩下的问题就是如何完成集成。一个明显的部分就是用相应的过程的复制来替换对其的调用。一般性起见,我们假定是在中间代码级实现的,这样就

8、能够做多语言间的内嵌,在这里3个主要的问题:1)满足语言所包含的参数传递的规则。2)处理调用者和被调用者的参数名字的冲突。3)处理静态变量。首先如果没有提供“外部语言名过程名”声明,过程集成必须包含所有参与进程的参数传递机制的详细信息,以便能够确定需要做什么样的集成工作以及怎样使他们起作用。例如我们不能使用一个通过值传递来调用的C语言的参数来匹

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。