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