Compiler construction 为什么需要虚拟机?

Compiler construction 为什么需要虚拟机?,compiler-construction,vm-implementation,Compiler Construction,Vm Implementation,我正在阅读以了解Java虚拟机和.NET CLR之间的区别,Benji的回答让我想知道为什么虚拟机首先是必要的 根据我对Benji解释的理解,虚拟机的JIT编译器将中间代码解释为在CPU上运行的实际汇编代码。它必须这样做的原因是,CPU通常有不同数量的寄存器,根据Benji的说法,“有些寄存器是专用的,每条指令都希望其操作数位于不同的寄存器中。”因此,有必要使用虚拟机这样的中间解释器,以便在任何CPU上运行相同的代码 但是,如果是这样,那么我不理解为什么编译成机器代码的C或C++代码只要在正确的

我正在阅读以了解Java虚拟机和.NET CLR之间的区别,Benji的回答让我想知道为什么虚拟机首先是必要的

根据我对Benji解释的理解,虚拟机的JIT编译器将中间代码解释为在CPU上运行的实际汇编代码。它必须这样做的原因是,CPU通常有不同数量的寄存器,根据Benji的说法,“有些寄存器是专用的,每条指令都希望其操作数位于不同的寄存器中。”因此,有必要使用虚拟机这样的中间解释器,以便在任何CPU上运行相同的代码

<>但是,如果是这样,那么我不理解为什么编译成机器代码的C或C++代码只要在正确的操作系统上就能够运行在任何计算机上。那么,为什么我在使用奔腾的Windows机器上编译的C程序能够在使用AMD的其他Windows机器上运行呢

如果C代码可以在任何CPU上运行,那么虚拟机的用途是什么?是否可以在任何操作系统上运行相同的代码?我知道Java在几乎所有操作系统上都有VM版本,但除了Windows之外,其他操作系统是否也有CLR

还是我还遗漏了什么?操作系统是否对运行的汇编代码进行其他解释,以使其适应特定的CPU或其他什么

我很好奇这一切是如何运作的,所以请给出一个清晰的解释

注意:我没有在JVM vs.CLR问题中仅将查询作为注释发布的原因是因为我没有足够的分数来发布注释=b


编辑:谢谢所有的好答案!因此,我似乎缺少的是,尽管所有处理器都有差异,但有一个共同的标准化,主要是X86体系结构,它提供了足够大的共同特性集,因此在一个X86处理器上编译的C代码在另一个X86处理器上大部分都能工作。这进一步证明了虚拟机的合理性,更不用说我忘记了垃圾收集的重要性。

AMD和Intel处理器都有x86体系结构,如果你想在不同的体系结构上运行c/c++程序,你必须为该体系结构使用编译器,同一个二进制可执行文件不会在不同的处理器体系结构上运行。

您的分析是对的,java或C#可以被设计为直接编译以在任何机器上运行,如果他们这样做可能会更快。但是虚拟机方法提供了对代码运行环境的完全控制,虚拟机创建了一个安全沙箱,只允许具有正确安全访问权限的命令执行潜在的破坏性代码,如更改密码或更新HD引导扇区。还有很多其他好处,但这是致命的原因。在C#中无法获得堆栈溢出

我知道Java在几乎所有操作系统上都有VM版本,但除了Windows之外,其他操作系统是否也有CLR


以一种非常简单的方式,这是因为Intel和AMD使用相同的汇编语言,使用相同数量的寄存器,等等

因此,您的C编译器编译代码以在Linux上工作。该程序集使用Linux,因此只要编译程序在Linux、x86程序集和正确的函数签名上运行,那么一切都很顺利

现在试着使用编译好的代码,并坚持下去,比如Linux/PPC(例如旧iBook上的Linux)。那是行不通的。因为JVM是在Linux/PPC平台上实现的,所以作为Java程序应该在哪里呢


现在的汇编语言基本上是程序员可以编程的另一个接口。x86(32位)允许您对通用整数寄存器访问eax、ebx、ecx、edx,对浮点寄存器访问f00-f07。在幕后,CPU实际上还有上百个寄存器,并将这些寄存器混在一起以压缩性能。

您认为C代码可以在任何处理器上运行的假设是错误的。寄存器和endianness之类的东西会使编译后的C程序在一个平台上根本无法工作,而在另一个平台上可能可以工作

然而,处理器有某些相似之处,例如,英特尔x86处理器和AMD处理器共享一组足够大的属性,大多数针对其中一个处理器编译的代码都将在另一个处理器上运行。然而,如果您想使用处理器特定的属性,那么您需要一个编译器或一组库来为您完成这项工作

<> P>至于为什么你想要一台虚拟机,除了它将处理你处理器的差异之外,还有一个事实,即虚拟机为那些在C++中编译的程序不可用的代码提供服务(不管理)。 提供的最突出的服务是垃圾收集,由CLR和JVM提供。这两个虚拟机都免费为您提供这项服务。他们为您管理内存

还提供了边界检查、访问冲突(尽管仍然可能,但它们非常困难)等功能

CLR还为您提供了一种形式的代码安全性

对于许多其他不使用虚拟机的语言,这些都不是作为基本运行时环境的一部分提供的


您可以通过使用库获得其中的一些,但这会迫使您使用库,而通过CLR和JVM提供给您的.NET和Java服务的访问是一致的。

本质上它允许“托管代码”,也就是说,虚拟机在运行时管理代码。这有三个主要好处:即时编译、托管指针/垃圾收集和安全控制

对于即时编译,虚拟机监视代码的执行,因此