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

时间:2012-03-04 15:53:20

标签: c# programming-languages

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

3 个答案:

答案 0 :(得分:28)

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

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


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

答案 1 :(得分:2)

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

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

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

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

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

  

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

答案 2 :(得分:1)

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

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