第十三章 函数式语言的编译.ppt
《第十三章 函数式语言的编译.ppt》由会员分享,可在线阅读,更多相关《第十三章 函数式语言的编译.ppt(48页珍藏版)》请在麦多课文档分享上搜索。
1、第十三章 函数式语言的编译,本章内容 介绍一种简单的函数式编程语言SFP 介绍一种抽象机FAM,它的机器语言是SFP语言的目标语言 介绍SFP各种语言构造到FAM的编译,13.1 函数式编程语言简介,13.1.1 语言构造 函数是构建程序的基本成分 还提供一些机制用于构造更为复杂的函数 纯函数式语言禁止使用赋值语句,从而不会产生副作用,其优点是具有引用透明性,有助于程序的等式变换和推理 程序设计的任务就是定义函数 计算机按照所定义函数的相应表达式,根据计算规则逐步计算,最后得到所需的结果,13.1 函数式编程语言简介,语法论域和语法产生式 B:基值集,如布尔值、整数、. . .,用b示例 Op
2、bin:二元算符集,如+, =, and, . . . , 用opbin示例 Opun: 一元算符集,如, not, . . .,用opun示例 V :变量集,用v 示例 E :表达式集,用e 示例e b | v | (opun e) | (e1 opbin e2) | (if e1 then e2 else e3)| (e1 e2) / 函数应用| (v.e) / 函数抽象, 如x.x+1, 即f (x) = x+1| (letrec v1= e1; v2= e2; . . . vn= en in e0)/ 联立递归定义,13.1 函数式编程语言简介,约定 e b | v | (opun e
3、) | | (e1 e2) | (v.e)| (letrec v1= e1; v2= e2; . . . vn= en in e0) 函数应用有最高优先级并且左结合 算术和逻辑算符有通常的优先级 抽象选择最大可能的语法表达式作为v. e的体e,即e延伸到表达式的结尾或碰到第一个不能配对的右括号为止 n元函数写成v1 vn.e的形式 把fe1 em实现为一次函数应用,而不是m次应用,13.1 函数式编程语言简介,13.1.2 参数传递机制 对于表达式e1e2,用按需调用的方式传递参数 值调用 换名调用 按需调用又称惰性计算。从e1的计算开始,当第一次需要e2时,计算它的值,也就计算这一次。其它访
4、问用第一次访问时计算的值。这种方式结合了前两种方式的优点,13.1 函数式编程语言简介,例1 letrec x = 2;f = y. x + y;F = g x. g2 in F f 1 静态作用域,结果等于4 x :2, f : y. x + y, F : g x. g2是表达式2, y.x+y, g x. g2和F f 1的计算环境 表达式e和它的计算环境u形成二元组(e, u),叫做闭包。环境u用来保证e中的自由变量会被正确地解释,因此环境u和变元e需要一起传递,13.1 函数式编程语言简介,例2 letrec comp = f .g. x. f (gx); F = x. ;G = z.
5、 ;h = comp F G in h( . ) + F( . ) + G( . ) 函数可以作为函数的变元 函数也可以作为函数的结果 n元函数可作为高阶函数使用, 当作用于m (m n)个变元时,结果是一个( n m )元的函数,13.1 函数式编程语言简介,13.1.3 变量的自由出现和约束出现 在letrec v1= e1; v2= e2; . . . vn= en in e0中,等号左边的v1, , vn是这些变量的定义性出现 在v1 vn.e的v1 vn中的v1, , vn是这些变量的定义性出现 变量出现在其它地方都是引用性出现引用性出现分成自由出现和约束出现在 (x y. (z.
6、x + z) (y + z ) ) x中,自由出现的变量:x, z约束出现的变量:x, y, z,13.2函数式语言的编译简介,概述 将按需调用语义和静态约束的函数式语言SFP的程序编译成FAM的机器语言 FAM是一种抽象机,它有一个栈,生存期符合栈式管理的所有变量都分配在栈中;它还有一个堆,所有其它的变量都存在堆中 先用一连串的例子来启发后面从SFP程序到FAM程序的编译描述,13.2函数式语言的编译简介,13.2.1 几个受启发的例子例1 1 + 2 本表达式的结果是基值类型,可以放在栈上 但是表达式结果也可能是函数,它不能放在栈上统一做法:把程序表达式的结果统一存放在堆中,在栈顶用一个指
7、针指向堆中的结果,13.2函数式语言的编译简介,13.2.1 几个受启发的例子例2 letrec x = 1/y; y = 0; z = x in 1 + 2 由letrec或函数抽象引入的变量在FAM的栈上分配单元x、y和z 的等式的编译:产生的指令序列不直接计算它们的右部,将来需要这些值时再计算 于是,生成的指令序列构造x、y和z的闭包,并将它们的指针存放在栈中y的等式无须构造闭包,因其右部不含自由变量 让z 和x 约束到同一个闭包,13.2函数式语言的编译简介,13.2.1 几个受启发的例子例3 if (if 12 then true else false) then 3 else 4
8、if 1 2 then true else false的结果在栈上更好,因为假转指令jfalse希望在栈顶测试它的值 由此,表达式的编译方式还依赖于上下文 由上下文可知,表达式true和false也应该按照结果在栈上的方式来编译,13.2函数式语言的编译简介,13.2.1 几个受启发的例子例4 letrec f = y z. if z = 0 then 1 else 1/y;x = 5in f 1 (x + 1) 由于y z. if z = 0 then 1 else 1/y是函数表达式,需把它的闭包进一步做成FUNVAL对象 FUNVAL对象和一般闭包的区别仅在于前者还包含存放变元指针的存储
9、空间 为保证1和x + 1仅在需要时计算,将它们以闭包 (包含一个指令序列和一个约束向量)的形式传递,13.2函数式语言的编译简介,13.2.1 几个受启发的例子例5 letrec x = 2 + 1;f = a b. g a + h b; g = x. . . .h = y. . . .in f x x 以闭包或值形式的表达式的指针可以拷贝多份 总是值的指针和闭包的指针而不是它们本身在传递,将它们存于约束向量和栈帧中 每个表达式只有一个实例存在 表达式对应变量的首次使用引起该表达式闭包的计算,13.2函数式语言的编译简介,13.2.1 几个受启发的例子例6 letrec f = letrec
10、 x = 2in y. x + y in f 5 该例可用来说明命令式语言和函数式语言在局部变量生存期上的区别 为了把f 作用于5,需要计算由较内letrec构造的函数。若该letrec已经计算,栈式管理会忘掉属于这个letrec的一切东西,包括局部变量x 高阶函数的出现需要延长局部变量的生存期,13.2函数式语言的编译简介,13.2.2 编译函数 表达式在不同的上下文中会编译成不同的指令序列 P:编译完整的程序表达式。结果在堆中,栈顶有一指针指向它 B:结果必须是基值并且存在栈上 V:结果在堆中,栈顶有一指针指向它。这是计算的正常情况 C:结果必须是被编译表达式的闭包。函数的变元和递归等式的
11、右部总是这种情况,13.2函数式语言的编译简介,13.2.3 环境与约束 名字的定义性出现总是关联到一个闭包1、一个等式被编译时,其左部的名字总是关联到 其右部的闭包2、抽象中的约束名字是在函数应用时关联到该 次应用的变元的闭包 名字引用性出现的编译:获得相关联的定义性出现的值 符号表在此称为编译环境 当函数抽象的体或letrec中的表达式开始编译时,新引入的局部变量必须被加入编译环境,13.2函数式语言的编译简介,13.2.3 环境与约束 编译环境包含1、变量的性质:自由(GLOB)还是约束(LOC)2、变量的位置:相对地址或下标 存储分配1、表达式中的局部变量在栈上分配存储单元, 使用栈帧
12、的相对地址 2、全局变量存储单元的指针分配在约束向量中, 依据约束向量中下标可以找到这些指针,13.3 抽象机的体系结构,从本节开始, 逐步描述FAM 的体系结构和指令集, 以及把SFP编译到FAM的编译方案 FAM的存储器包含:程序存储区PS、栈ST、堆HP FAM的程序1、每条指令占一个单元2、某些指令含一个运算对象3、程序计数器PC总是保留当前指令的地址,13.3 抽象机的体系结构,13.3.1 抽象机的栈 和第6章的活动记录栈类似,但这里栈向下增长 基值、各种地址都只占一个单元 函数应用的栈帧如图 SP是栈顶指针 FP是当前栈帧指针 继续地址就是返回地址 FPold是老FP的值 GPo
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十三 函数 语言 编译 PPT
