编程语言静态分析中的语义与数据结构抽象
1. 支持函数和递归调用的语言语义
1.1 语言特性与具体语义
我们考虑一种允许函数的命令式语言,它在原有命令式语言基础上扩展了函数定义和递归调用。该语言具有扁平函数定义(无嵌套函数定义),类似于 C 语言,除函数参数外的变量均为全局变量,函数返回值通过对全局变量赋值模拟。函数调用在运行时确定,函数名是一等值,可存储在变量中或作为参数传递给其他函数,调用语句的函数部分可以是任何能求值为函数名的表达式。
例如,有如下递归函数调用的程序:
sum(x) = if(x = 0) {z ≔ 0; return} else {sum(x − 1); z ≔ z + x; return} sum(2)
sum 函数是递归的,结果存储在 z 变量中。经过两次递归调用 sum(1) 和 sum(0) 后, sum(2) 的结果 3 存储在 z 中。
在执行过程中,由于递归调用,递归函数的参数在内存中可能同时存在多个实例。每次递归调用时,会在内存中分配函数参数的新实例,函数体使用这个新实例作为参数,之前的实例在递归调用返回后仍需保持可用。因此,在定义该语言的语义时,需要一个语义实体(环境)来确定函数参数的当前实例,同时还需要一个栈(延续)来记住函数调用的返回上下文。
状态除了程序标签外,还需要四个组件:内存、环境、
超级会员免费看
订阅专栏 解锁全文
967

被折叠的 条评论
为什么被折叠?



