230 likes | 429 Views
程序优化技术 PartialEvaluation 和 Supercompilation. 导师:陈海明 郑丽丽 lili@ios.ac.cn 2009-09-08. 背景 1 : LFC 语言 . LFC 是为支持软件形式规约的获取工作而开发的一种函数式语言,以上下文无关语言为数据类型,如例。 Grammar : <Bin> 0 <Bin> 1 <Bin> <Bin>0 <Bin> <Bin>1 Function: Dec bInc: Bin Bin;
E N D
程序优化技术PartialEvaluation和Supercompilation 导师:陈海明 郑丽丽 lili@ios.ac.cn 2009-09-08
背景1: LFC语言 • LFC是为支持软件形式规约的获取工作而开发的一种函数式语言,以上下文无关语言为数据类型,如例。 • Grammar: <Bin> 0 <Bin> 1 <Bin> <Bin>0 <Bin> <Bin>1 • Function: Dec bInc: Bin Bin; Var b: Bin; Def bInc(“0”) = “1”; bInc(“1”) = “10”; bInc(b [] “0”) = b [] “1”; bInc(b [] “1”) = scat (bInc (b), “0”);
背景2:程序转换技术 • 对程序进行一系列的修改使得程序能够满足某些需求。它应用在软件工程的多个方面,如下:
程序综合: 由高级语言程序转换为低级语 言程序。如:程序的编译。 高级语言(C语言等)汇编或者机器语言
程序优化:提高程序的效率(时间,空间) 程序重构:改变程序的设计增加易读性,或使 其更难理解。 逆向工程: 由低级语言程序转换为高级语 言程序。
Partial Evaluation和 Supercompilation是优化程序的转换技术,主要是为提高程序的运行时间。
Partial Evaluation • 通过提前计算程序中的已知部分,减少程序的总体运行时间。简单的描述: 函数 f(x,y)=x2 + y 当x=2已知时, x2便可提前计算,得到: g(y) = f(2,y) = 4 + y
program Known data Partial Evaluator Residual program result other data
部分参数必须已知 • 而且满足 Residual program(other data)=program (known data, other data) = result
Example power(int e, int x) { int s; if (e==0) s=1; else s=x*power(e-1, x); } 那么e=2已知时,power函数优化为: power_2 (int x) { int s; s=x*x*1; }
Partial Evaluation并不总能使程序得到优化。例如在power( )函数中,若x的值已知,设为3,而指数e未知,则power(e,3)= 3e power(3,x) { int s; if (e==0) s=1; else s=3*power(e-1, 3); } 在该程序中,程序递归的次数依然取决于e,而e未知,且程序中没有关于x的可提前计算的部分,所以程序没有得到优化。
实现: Step1:Time-Binding Analysis(时间绑定分析) ― 遍历程序,找出已知的变量和能够计算出值的变量和函 数,标记为Static,其它标记为Dynamic。 ― 其中,标记为Static的部分是可以提前进行计算的部分。 Step2:Program Specialization(程序例化) ― 将标记为Static的部分进行计算,包括: 已知变量:值替代变量。 可计算函数:计算并将结果值替代函数名。 …… 最终剩余的代码便是优化后的结果。
尤其当函数的某些参数变化的频率小于另外参数的变化频率时,便可利用PE将变化频率小的参数和程序提前计算,然后可减少剩余程序的运行时间。尤其当函数的某些参数变化的频率小于另外参数的变化频率时,便可利用PE将变化频率小的参数和程序提前计算,然后可减少剩余程序的运行时间。
计算机图像学、数值计算、文法分析器等。 • 在计算机图像学和数值计算模型中,一些参数 是固定的,所以可利用PE提前计算,然后再采集数据,计算。这样可提高实验的效率。 • 在文法分析器中,若文法已知,通过PE,我们便可得到一个固定文法的句子分析器。……
Supercompilation (SCP) • SCP也可实现PE所实现的功能,但是,SCP不要求源程序的参数已知。 • 他们的实现方法不一样,SCP不需要对程序做预处理。 • 总体上说,SCP比PE 的优化能力强。
它的思想是:由高一级(high-level)的程序控制分析低层(lower-level)的程序。 SCP < source (argument1)> = residual program ( argument2 )
实现: • Step1:Scp根据源程序的运行将其展开为一个 树。树中每个节点表示了当时的运行状 态。类似解释器运行程序的过程。 • Step2:展开的树可能是无限的,应用 Generalization Algorithm将树转换为有 限的。 • Step3:从树中提取程序。
主流的SCP是基于函数式语言Refal的。 • Refal Example: • Fab { • 'a' e.X = 'b' <Fab e.X>; • s.1 e.X = s.1 <Fab e.X>; • = ; • } • Fbc { • 'b' e.X = 'c' <Fbc e.X>; • s.1 e.X = s.1 <Fbc e.X>; • = ; • } 若要求 <Fbc <Fab e>> ,则需先运行函数Fab将 string e 中的‘a’转换为’b’,然后调用 函数Fbc将string中的’b’转换为‘c’。这样程序调用了两次函数。利用SCP优化的过程如下:
fig <Fbc <Fab e.1> e.1->'a' e.2 e.1-> e.1-> s.1 e.3 <Fbc > <Fbc 'b' <Fab e.2>> <Fbc s.1 <Fab e.3>> /*empty*/ s.1->’b’ s.1!=’b’ 'c' <Fbc <Fab e.2>> 'c' <Fbc <Fab e.3>> s.1 <Fbc <Fab e.3>> e.2<-e.1 e.3<-e.1 e.3<-e.1
最终得到的程序为: • F1{ • 'a' e.2 = 'c' <F1 e.2>; • 'b' e.2 = 'c' <F1 e.2>; • s.1 e.2 = s.1 <F1 e.2>; • = ; • }
目前,SCP还主要应用于程序方面,近期应用于程序的规范化(verification),证明两个程序是否相同(可检测多变的病毒,判断一个程序是否和一个已知病毒是一样的)目前,SCP还主要应用于程序方面,近期应用于程序的规范化(verification),证明两个程序是否相同(可检测多变的病毒,判断一个程序是否和一个已知病毒是一样的) • 目前,实现SCP的语言有Refal等一些first-order functional language。
一点体会: 1. 尽快适应科学院和实验室的氛围。 2. 尽早了解导师的相关课题。多多准备以确 定自己感兴趣的研究方向。 3. 多交流。
祝大家有一个愉快的科研生活! 谢谢!