函数的中间代码生成
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 值可以存储在那里。
我正在关注编译器设计,我发现了以下问题。
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 值可以存储在那里。