我正在跟踪编译器设计,发现了以下问题。
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有什么区别。
请在上面澄清一下。
答案 0 :(得分:3)
设计中间语言的方式有很多种,但是您所寻找的并不是直接表示将函数调用的返回值存储在call
语法中的一部分(也就是说,不会说result = call fact, 1
或类似的内容。
应该将返回值的存储位置作为另一个参数传递。这就是为什么有两个而不是一个的原因。这就是为什么它为refparam
使用param
而不是result
的原因:我们要传递result
的地址,而不是它的值(它甚至没有那个值)点),因此返回值可以存储在此处。