《函数式语言Corefun的设计与实现.ppt》由会员分享,可免费在线阅读全文,更多与《函数式语言Corefun的设计与实现》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。
1、对栈的操作。优化PUSH操作后紧接着GET操作抽象机的实现状态的实现GMachine的一个状态是一个元组在试验中用C语言程序实现了这些成分闭包的表示:实验中用C语言的变长结构来实现,闭包:tyedefstructgm_closure{void(*code)(structgm_closure*c);intargc;structgm_node*argv[];}gm_closure;程序的工作模式Corefun的形式虽然如:实际计算是是把它当作emainexxfexxfmmmninletemainexxfexxfmmmn程序的一开始先完成一些初始化工作,然后把顺序压入栈中,然后计算main的值,接着输出计算的结果,最后完成一些收尾工作。C代码的生成GMachine的指令由C程序实现从Gcode的序列到C代码的影射想到简单:只需要把Gcode替换成对C函数或宏的调用即可。例如SLIDEn替换成C函数调用gm_slide(n);即可。Prelude的实现实现了几个基本的内部函数,包括四则运算,if函数和逻辑运算。为了保证效率,这些基本的内部都直接用C语言编写,直接操作栈,和调用其它C函数。更复杂的函数如ma,functor,可以用corefun自己实现。垃圾回收使用C语言库函数分配和释放内存。采用了最简单的内存管理办法:引用计数法。即每一个图的结点都有一个引用计数,记录了该节点被共享的次数,当某个地方不再使用某个节点时就将该节点的引用计数减,当引用计数为时,该节点无法在被访问,因此这时需要释放该节点的空间。未来的工作前端更多的relude,包括输入输出(IO)操作优化:严格性分析,及一些源到源优化使用泛型编程技术提高代码的质量,。
2、AP@+(f)MKAP@+@@+@(h)SLIDE前后对比扩展后(a)PUSHINIT(b)PUSHFUN+(c)MKAP_EX(,,)@+@@+@(e)SLIDE+@+(c)MKAP_EX(,,)Gcode窥孔优化先生成抽象机代码的好处:可以在抽象机代码级先进行优化。合并相邻SLIDE,SLIDEn;SLIDEm用SLIDE(n+m)代替。在栈中生存周期很短的指针,考虑经过寄存器来中转,减少成fxy=lettu=(x,y)c(x,y)=Ec(x,y)=Eing(ctu)(ctu)@@yfx@@cgcxy表达式全懒惰构造过去的办法对let语法成分不太适用,因为参数不能共享。引入闭包后可以把所有的变量对应到静态函数,表达式中用到的变量不是通过参数传递,而是放在闭包的结构中。不通过参数传递节省了调用时栈的开销。三种方法比较构造c的表示))((*babacba@@*@@@@@bf_ca+@−abf_ccodeab(a)(b)(c)扩展MKAP指令先生成抽象机代码的好处:容易启发更多的改进思路。MKAP:创建一个应用节点(@节点),其左、右指针分别是当前栈顶元素和其下面一个元素。把刚使用过的两个元素弹出栈,新建立的这个节点的指针入栈。扩展MKAP指令C[letx=in+xx]r=PUSHINT;PUSH;PUSH;PUSHFUN+;MKAP;MKAP;SLIDE;引入一个新的操作MKAP_EX(n,m,o),它的作用是创建一个新的应用节点,用栈中TOSn位置指向的图作为其左子树(函数),用栈中TOSmx)(succ)+(succ)(succ)+抽象机技术SECDGMachineSinelessGMachineSinelessTaglessG。
3、gv[];}gm_closure;程序的工作模式Corefun的形式虽然如:实际计算是是把它当作emainexxfexxfmmmninletemainexxfexxfmmmn程序的一开始先完成一些初始化工作,然后把顺序压入栈中,然后计算main的值,接着输出计算的结果,最后完成一些收尾工作。C代码的生成GMachine的指令由C程序实现从Gcode的序列到C代码的影射想到简单:只需要把Gcode替换成对C函数或宏的调用即可。例如SLIDEn替换成C函数调用gm_slide(n);即可。Prelude的实现实现了几个基本的内部函数,包括四则运算,if函位置指向的图作为其右子树(参数),然后从栈中弹出o个元素(其可能取值为,,),然后把新的应用节点的指针压入栈。扩展MKAP指令MKAP_EX本身可以用宏或者inline函数来实现,所以扩展MKAP成MKAP_EX,不会增加栈的使用。MKAP_EX的工作量总是小于等于MKAP的C[letx=in+xx]r=PUSHINT;PUSHFUN+;MKAP_EX(,,);MKAP_EX(,,);SLIDE;前后对比扩展前(a)PUSHINIT(b)PUSH(c)PUSH(d)PUSHFUN++(e)MKAP@+(f)MKAP@+@@+@(h)SLIDE前后对比扩展后(a)PUSHINIT(b)PUSHFUN+(c)MKAP_EX(,,)@+@@+@(e)SLIDE+@+(c)MKAP_EX(,,)Gcode窥孔优化先生成抽象机代码的好处:可以在抽象机代码级先进行优化。合并相邻SLIDE,SLIDEn;SLIDEm用SLIDE(n+m)代替。在栈中生存周期很短的指针,考虑经过寄存器来中转,减。
4、果是Run:run的结果是其他语言特点变量局部作用域let中定义的变量在对应的in中使用letrec中定义的变量在整个letrec中使用静态绑定a=fx=+axleta=inf=gt抽象机改进与优化STGM函数式语言Corefun的设计与实现研究生:欧阳坚导师:张素琴年月内容概要函数式语言图归约技术整体设计Corelan语言设计抽象机改进与优化现在的实现与未来的工作函数式语言函数式程序设计范式“I’lltellyouwhat,youworkouthow”描述的不是解决问题的方法而是问题本身函数式程序设计语言良好的数学基础(λ演算)程序简洁易于推理和正确性证明高阶函数、惰性计算例子(Haskell)简洁、抽象,面向问题qsort[]=[]qsort(x:xs)=qsort[y|y=x]高阶函数maf[]=[]maf(x:xs)=fx:mafxs惰性计算natural=[]主要障碍学院派程序员不适应在传统体系结构上的效率不高图归约技术λ演算δ归约:β归约:归约技术串归约环境归约图归约λ提升(lambdalifting)*)xx*x(yexyex)(图归约技术@FAFA+λxB@@+λxB@λx@@x+x@succ@@+@succ@@+(λx+xx对栈的操作。优化PUSH操作后紧接着GET操作抽象机的实现状态的实现GMachine的一个状态是一个元组在试验中用C语言程序实现了这些成分闭包的表示:实验中用C语言的变长结构来实现,闭包:tyedefstructgm_closure{void(*code)(structgm_closure*c);intargc;structgm_node*ar。
5、有利于以后的改进和维护谢谢!问题?achine过去的抽象机代码由抽象机指令的序列组成,每条指令通过状态转移系统被赋予精确的操作语义。STGMachine抽象机语言本身是一种很简单的函数式语言,它有通常的指称语义,并且每个语言成分有一个直接的操作语义。缺点:跨度过大,切断了语法成分之间的联系,不容易发现更多的改进空间。抽象机改进与优化改造原来的SinelessGMachine的操作语义通过增加闭包,表达式全懒惰构造使其具有和STGMachine类似的优点。得到一个比STGMachine容易理解和改进的抽象机模型。在此基础上尝试了:扩展MKAP指令,Gcode窥孔优化等提高抽象机效率的方法。增加闭包λ提升不高效的编译方法。STG中采用一种很紧凑的方式表示函数:静态的代码(被所有实例共享)和自由变量合在一起表示函数,通常这样的结构叫做闭包(closure)freevariablescode表达式全懒惰构造GMachine和SinelessGMachine的缺点:不会被计算的表达式却会被构造@@yfx@@EgEfxy=gEE表达式全懒惰构造过去的办法:fxy=gEE变换位置指向的图作为其右子树(参数),然后从栈中弹出o个元素(其可能取值为,,),然后把新的应用节点的指针压入栈。扩展MKAP指令MKAP_EX本身可以用宏或者inline函数来实现,所以扩展MKAP成MKAP_EX,不会增加栈的使用。MKAP_EX的工作量总是小于等于MKAP的C[letx=in+xx]r=PUSHINT;PUSHFUN+;MKAP_EX(,,);MKAP_EX(,,);SLIDE;前后对比扩展前(a)PUSHINIT(b)PUSH(c)PUSH(d)PUSHFUN++(e)MK。
6、achine整体设计主要研究编译器后端:从中间语言开始。定义中间语言corefun的语法:程序、表达式;完成一个arser,它把corefun程序转换成corefun的内部表示;完成一个rettyrinter,它把corefun的内部表示打印成程序;用抽象机技术为corefun实现一个编译器;完成最基本的标准函数库(standardrelude),和运行时支持。整体设计CoreIRGCodeOtimizationsCschemeEschemeBschemeFschemeCorefunProgramParser(flex,bison)CProgramAbstractMachineCProgramGMachineInstructionsPreludeObjectProgramRuntimeLibarayCComilerOtimizationsExecutableProgamlinkerCorelan语言设计定位于编译器中间语言。包含类型信息,并假设类型检查已经完成,已经保证类型正确。一种函数式语言,支持highorderfunction。惰性的语言,即采用lazyevaluation。直接支持反射语义,而不是用λ演算来表示反射。语法注释“”入口“main”一个例子反射元编程(metarogramming)克服传统程序设的局限性,例如语言的表达能力,程序的灵活性及程序执行的效率程序反射(roceduralreflection)程序语言一级支持元编程强调程序的自我观察,思考自身的状态,并能自我调节的能力反射语法的设计Quotation:表示+这个表达式的数据结构,与不同Antiquotation:~gt的结果是Lift:lift(+)的结。