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

Kev*_*vin 7 .net compiler-construction generics static-analysis

Xamarin是一个完全提前编译.NET代码的系统(AOT),用于禁止数据执行的平台,因此不能拥有JIT.这个问题不是关于Xamarin,而是关于它的文档所做的断言.它在这里说:

通用虚方法支持是有限的,不可能静态地确定在所有情况下将调用哪种方法,因此编译器可能会忽略其中的一些方法.

我可能会弄错,但他们似乎暗示通过静态分析对这里可能发生的事情进行广泛的陈述,而不仅仅是他们选择在自己的软件中实施的内容.

正如Hans Passant恰当地指出的那样,他们给出的例子实际上并没有证明他们所指的问题,所以我把它排除在外.

因此,除了这些绝对棘手的特殊情况:

  • 反射;

  • 动态生成的代码(无论如何都是非法的);

  • 涉及值类型的类型参数中的病态循环引用; 和

  • 外国议会;

什么会使AOT编译器无法处理虚拟通用方法案例?

Han*_*ant 2

这个例子只是废话,根本没有说明问题。虚拟方法中隐含的一点是,编译器无法可靠地确定可能从哪些调用站点调用该方法。对于泛型方法来说这是一个问题,因为编译器必须创建它的多个版本。

处理任何引用类型都需要一个版本,特别是“使用具有引用类型(如对象或字符串)的通用虚拟方法通常是安全的,因为编译器总是编译一个可以处理的版本”。或者换句话说,它可能只是盲目地生成那个。

麻烦制造者是 T 是值类型的版本。必须为每种不同的值类型编译一种不同的具体方法。由于编译器无法猜测调用站点,因此它也无法查看必须为其创建方法的值类型。由于结构类型和方法具有多个类型参数,盲目生成它们是不可行的。