虚拟通用方法调用的静态分析

7
Xamarin是一个系统,它将.NET代码完全提前编译(AOT)为禁止数据执行且不能有JIT的平台。本问题不涉及Xamarin,而是关于其文档所做的断言。它在这里声明:
“通用虚拟方法支持受到限制,静态无法确定在所有情况下将调用哪个方法,因此编译器可能会省略其中一些。”
我可能错了,但他们似乎在暗示通过静态分析可能实现的广泛声明,而不仅仅是他们选择在自己的软件中实现的内容。
正如Hans Passant所指出的那样,他们给出的示例实际上并没有展示他们所指的问题,所以我已经将其排除在外。
因此,除了这些明显棘手的特殊情况之外:
- 反射; - 动态生成的代码(在此场景中是非法的); - 涉及值类型的类型参数中的病态循环引用; 和 - 外部程序集;
什么会导致AOT编译器无法处理虚拟泛型方法的情况?
2个回答

2
那个例子只是有缺陷的,根本没有展示问题。虚方法隐含的问题在于编译器无法可靠地确定从哪些调用站点可能调用该方法。对于通用方法来说这是一个问题,因为编译器必须创建多个版本。需要一个版本来处理任何引用类型,具体由备注“通常可以使用泛型虚方法与引用类型(如Object或String),因为编译器始终会编译一个可以处理它们的版本”涵盖。换句话说,它可能只是盲目地生成那个版本。
麻烦制造者是T为值类型的版本。必须为每个不同的值类型编译一个独特的具体方法。由于编译器无法猜测调用站点,因此也无法看到它必须为哪些值类型创建方法。由于结构类型和具有多个类型参数的方法,盲目生成它们是不可行的。

0

我基本上同意你的分析。

Xamarin和类似工具可以采用相反的顺序,即包括每种可能的实例类型和虚拟方法签名,然后再删除那些可以证明不需要的部分。

他们可能已经尝试过这样做了,但是发现对于复杂的对象层次结构,生成的代码往往会变得非常大/慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接