132函数式语言的编译简介 1321几个受启发的例子 12 letrecx==1y;y=0;==x in 1+2 由ere或函数抽象引入的变量在FAM的栈上分 配单元 x、y和z的等式的编译:产生的指令序列不直接 计算它们的右部,将来需要这些值时再计算 于是,生成的指令序列构造x、y和的闭包,并将 它们的指针存放在栈中 y的等式无须构造闭包,因其右部不含自由变量 让z和x约束到同一个闭包
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 约束到同一个闭包
132函数式语言的编译简介 1321几个受启发的例子 例3if(if1≠2 then true else false)then3else4 if1≠2 then true else false的结果在栈上更好,因 为假转指令 false希望在栈顶测试它的值 由此,表达式的编译方式还依赖于上下文 由上下文可知,表达式true和alse应该按照结 果在栈上的方式来编译
13.2函数式语言的编译简介 13.2.1 几个受启发的例子 例3 if (if 12 then true else false) then 3 else 4 – if 1 2 then true else false的结果在栈上更好,因 为假转指令jfalse希望在栈顶测试它的值 – 由此,表达式的编译方式还依赖于上下文 – 由上下文可知,表达式true和false也应该按照结 果在栈上的方式来编译
132函数式语言的编译简介 1321几个受启发的例子 1 4 letrecf==ny z if z=0 then 1 else 1/y x==5 in f1(x+ 1) 由于yz.fz=0then1eel/是函数表达式,需 把它的闭包进一步做成 FUNVAL对象 FUNVAL对象和一般闭包的区别仅在于前者还包 含存放变元指针的存储空间 为保证1和x+1仅在需要时计算,将它们以闭包 (包含一个指令序列和一个约束向量)的形式传递
13.2函数式语言的编译简介 13.2.1 几个受启发的例子 例4 letrec f == y z. if z = 0 then 1 else 1/y; x == 5 in f 1 (x + 1) – 由于y z. if z = 0 then 1 else 1/y是函数表达式,需 把它的闭包进一步做成FUNVAL对象 – FUNVAL对象和一般闭包的区别仅在于前者还包 含存放变元指针的存储空间 – 为保证1和x + 1仅在需要时计算,将它们以闭包 (包含一个指令序列和一个约束向量)的形式传递
132函数式语言的编译简介 1321几个受启发的例子 例5 letrec x=2+ ∫=λab.ga+hb g=λx h==^.. in fxx 以闭包或值形式的表达式的指针可以拷贝多份 总是值的指针和闭包的指针而不是它们本身在传 递,将它们存于约束向量和栈帧中 每个表达式只有一个实例存在 表达式对应变量的首次使用引起该表达式闭包的 计算
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 – 以闭包或值形式的表达式的指针可以拷贝多份 – 总是值的指针和闭包的指针而不是它们本身在传 递,将它们存于约束向量和栈帧中 – 每个表达式只有一个实例存在 – 表达式对应变量的首次使用引起该表达式闭包的 计算
132函数式语言的编译简介 1321几个受启发的例子 36 letrec f== letrecx==2 in y.xty in f5 该例可用来说明命令式语言和函数式语言在局部 变量生存期上的区别 为了把∫作用于5,需要计算由较内erec构造的函 数。若该 letrec已经计算,栈式管理会忘掉属于这 个 letrec的一切东西,包括局部变量x 高阶函数的出现需要延长局部变量的生存期
13.2函数式语言的编译简介 13.2.1 几个受启发的例子 例6 letrec f == letrec x == 2 in y. x + y in f 5 – 该例可用来说明命令式语言和函数式语言在局部 变量生存期上的区别 – 为了把f 作用于5,需要计算由较内letrec构造的函 数。若该letrec已经计算,栈式管理会忘掉属于这 个letrec的一切东西,包括局部变量x – 高阶函数的出现需要延长局部变量的生存期