实例方法中的CIL(MSIL)尾调用递归

时间:2012-02-08 23:40:41

标签: tail-recursion il tail-call-optimization tail-call

背景:我正在为学校项目编写一个.NET编译器(非常类似于C#)。我目前尝试添加的功能之一是方法中的tailcall递归。

更多信息:在CIL中,“this”被传递给实例方法,就像它只是另一个参数一样。因此,访问静态方法的第一个参数,您将发出ldarg.0,但访问实例方法的第一个参数,您将发出ldarg.1,并在实例方法中访问“this”,您将发出ldarg.0 。 (实例方法甚至比我想象的扩展方法更相似。)

问题:你能用starg.0设置“this”而没有任何副作用吗?

为什么会出现问题:方法是否是实例方法是使用MethodBuilder设置的,它是一个黑盒子。虽然“this”看起来就像任何其他参数一样,但据我所知,一些JIT编译器会分别跟踪“this”并根据此值更改其行为。如果在实例方法中设置“this”时有副作用,那么我该如何避免它们?

2 个答案:

答案 0 :(得分:2)

您可能需要查看how F# implements tail-call

答案 1 :(得分:1)

您可以将其解压缩为局部变量。这样你就会知道你可以安全地设置它。 (我希望我能正确理解你的问题)