函数的中间代码生成

Intermediate Code Generation on Functions

我正在关注编译器设计,我发现了以下问题。

int fact(int n){
   if(n==0) return 1;
   else return (n*fact(n-l))
}

对于上面的代码,下面给出了中间代码,

1. func begin fact
2. if (n==0) goto L1
3. T1 = n-1
4. param T1
5. refparam result
6. call fact, 2
7. T3 = n*result
8. return T3
9. L1: return 1
10. func end

以上中间代码是否正确?如果是这样,为什么第 6 行的调用需要 2 个参数,而原始函数需要 1 个参数。 param 和 refparam 有什么区别。

请澄清以上内容。

设计中间语言有多种不同的方法,但您正在查看的方法并未直接指示将函数调用的 return 值作为 call 的一部分存储在何处语法(也就是说,它没有说 result = call fact, 1 或类似的东西)。

相反,应该存储 return 值的位置作为另一个参数传递。这就是为什么有两个而不是一个。这也是它为 result 使用 refparam 而不是 param 的原因:我们想传递 result 的地址,而不是它的值(它甚至没有那个点),所以 return 值可以存储在那里。