我正在阅读这个问题以找出 Java 虚拟机和 .NET CLR 之间的区别,而 Benji 的回答让我想知道为什么首先需要虚拟机。
根据我对 Benji 解释的理解,虚拟机的 JIT 编译器将中间代码解释为在 CPU 上运行的实际汇编代码。之所以必须这样做,是因为 CPU 通常具有不同数量的寄存器,并且根据 Benji 的说法,“有些寄存器是专用的,每条指令都希望其操作数位于不同的寄存器中。” 这是有道理的,因此需要像虚拟机这样的中间解释器,以便可以在任何 CPU 上运行相同的代码。
但是,如果是这样的话,那么我不明白为什么编译成机器代码的 C 或 C++ 代码能够在任何计算机上运行,只要它是正确的操作系统。那么为什么我在使用 Pentium 的 Windows 机器上编译的 C 程序能够在使用 AMD 的其他 Windows 机器上运行?
如果 C 代码可以在任何 CPU 上运行,那么虚拟机的目的是什么?是否可以在任何操作系统上运行相同的代码?我知道 Java 在几乎任何操作系统上都有 VM 版本,但是除了 Windows 之外,还有其他操作系统的 CLR 吗?
还是我还缺少其他东西?操作系统是否对其运行的汇编代码进行其他解释以使其适应特定的 CPU 或其他东西?
我很好奇这一切是如何运作的,因此将不胜感激。
注意:我不只是在 JVM 与 CLR 问题中将我的查询作为评论发布的原因是因为我还没有足够的积分来发表评论 =b。
编辑:感谢所有伟大的答案!所以似乎我缺少的是,尽管所有处理器都有差异,但有一个共同的标准化,主要是 X86 架构,它提供了足够多的通用特性集,以便在一个 X86 处理器上编译的 C 代码大部分都可以工作在另一个 X86 处理器上。这进一步证明了虚拟机的合理性,更不用说我忘记了垃圾收集的重要性。