.net 虚拟泛型方法调用的静态分析

.net 虚拟泛型方法调用的静态分析,.net,generics,static-analysis,compiler-construction,.net,Generics,Static Analysis,Compiler Construction,Xamarin是一个完全提前编译.NET代码(AOT)的系统,适用于不允许执行数据的平台,因此不能使用JIT。这个问题不是关于Xamarin的,而是关于其文档中的一个断言。它说: 泛型虚拟方法的支持是有限的,不可能静态地确定在所有情况下调用什么方法,因此编译器可能会忽略其中一些方法 我可能弄错了,但他们似乎暗示了通过静态分析可以实现什么,而不仅仅是他们选择在自己的软件中实现什么 正如汉斯·帕桑(Hans Passant)恰当地指出的那样,他们给出的例子实际上并没有说明他们所指的问题,因此我将其排

Xamarin是一个完全提前编译.NET代码(AOT)的系统,适用于不允许执行数据的平台,因此不能使用JIT。这个问题不是关于Xamarin的,而是关于其文档中的一个断言。它说:

泛型虚拟方法的支持是有限的,不可能静态地确定在所有情况下调用什么方法,因此编译器可能会忽略其中一些方法

我可能弄错了,但他们似乎暗示了通过静态分析可以实现什么,而不仅仅是他们选择在自己的软件中实现什么

正如汉斯·帕桑(Hans Passant)恰当地指出的那样,他们给出的例子实际上并没有说明他们所指的问题,因此我将其排除在外

所以,除了这些非常棘手的特殊情况外:

  • 反思

  • 动态生成的代码(在这种情况下无论如何都是非法的)

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

  • 外国集会


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

我基本上同意您的分析

可以说,Xamarin和类似的工具可以按相反的顺序进行,包括实例类型和虚拟方法签名的所有可能组合,然后只删除那些可以证明不需要的组合


不过,他们可能尝试过,发现对于复杂的对象层次结构,生成的代码确实会变得相当大/缓慢。

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

处理任何引用类型都需要一个版本,这一点在下面的注释中特别提到:“如果编译器总是编译一个可以处理的版本,那么使用具有引用类型(如对象或字符串)的泛型虚拟方法通常是安全的”。或者换言之,它可能只是盲目地产生一个

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