Compiler construction 函数的中间代码生成

Compiler construction 函数的中间代码生成,compiler-construction,intermediate-language,Compiler Construction,Intermediate Language,我正在关注编译器设计,发现了以下问题 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

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

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有什么区别


请澄清以上内容。

设计中间语言有许多不同的方法,但您所看到的方法并没有直接指示在哪里存储函数调用的返回值,作为
调用
语法的一部分(也就是说,它没有说
结果=调用事实,1
或类似的内容)


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

因此我们可以对任意数量的参数使用call。不一定是原始函数所需的参数数量?@stevan请记住,我不知道您正在使用的特定IR的细节,我希望实际参数的数量必须与形式参数的数量完全匹配,但需要注意的是,返回值将计为附加的by ref参数。