如果没有解释C#,那么为什么需要VM呢?

我读过很多关于C#的争议,有些人说它被解释了,有人说它不是。 我知道它被编译到MSIL中,然后在运行时进行JITed,具体取决于处理器等……但它是否仍然以它需要运行VM(.NET)的方式进行解释?

VM只是微处理器的抽象。 它只是一个定义,并不存在。 即你无法在VM上运行代码; 但是,您可以为它生成IL代码。 优点是语言编译器不需要知道有关不同类型的真实处理器的细节。 由于不同的.NET语言(如C#或VB(以及更多))会生成IL,因此它们在此级别上兼容。 这与其他约定(如常见类型系统)一起允许您在C#程序中使用从VB代码生成的DLL。

当您运行.NET应用程序时,IL会在Windows上及时编译,并且也可以在Mono中提前编译。 在这两种情况下,都会生成实际处理器的机代码。 这个完全编译的代码在REAL微处理器上执行!


另一个方面是您必须编写的编译器数量。 如果您有n种语言并且希望在m个处理器体系结构上运行它们,则需要n个 语言到IL的编译器 + m个 IL到本机代码的编译器 。 没有这个中间抽象层,你需要有n×m个编译器,这可能比n + m更高的数量!

简短的回答是否定的,对VM的要求并不表示它被解释。

VM包含将IL转换为本机机器代码的JIT编译器。 它还包含.NET类库,C#程序依赖于它。 它还包含一些其他涉及动态链接的机制(这些机制完全基于Windows DLL机制,但.NET具有超出Windows自身提供的function,这些function在VM中实现)。

您可能正在引用CLR (规范CLI的实现)。

CLI定义特定类型系统,这些类型上所有操作的语义,内存模型和运行时元数据。

为了提供上述所有内容,必须对生成的代码进行一些检测。 一个简单的例子是确保支持大于32位的数字,并且浮点运算在每个架构上都按照规范运行。

此外,为了确保内存分配的正确行为,在执行CLR代码期间必须存在正确的元数据管理,静态初始化,generics类型实例化以及类似的一些其他过程。 这完全由VM处理,并且不容易由CPU提供。

来自维基百科的引用,例如:

CLR提供其他服务,包括内存管理,类型安全和exception处理。