AMD和Intel处理器使用相同的指令集和机器架构(从执行机器代码的角度来看)。
C和C++编译器将编译代码转换为机器代码,并附带针对目标操作系统的头文件。一旦编译完成,它们就不再与编译所用的语言有任何关联,只是二进制可执行文件。(虽然存在可能显示编译自哪种语言的工件,但这并不是本文的重点)
因此,一旦编译完成,它们就与机器(x86,即Intel和AMD的指令集和架构)以及操作系统相关联。
这就是为什么它们可以在任何兼容的x86计算机上运行,以及任何兼容的操作系统上(对于某些软件而言,包括win95到winvista)。
然而,它们无法在OSX机器上运行,即使它运行在Intel处理器上- 除非您运行其他仿真软件(例如parallels或带有Windows的虚拟机)。
除此之外,如果要在ARM处理器、MIPS或PowerPC上运行它们,则必须运行完整的机器指令集模拟器,将X86的二进制机器代码解释为您正在运行其上的任何机器。
与此相反,是.NET。
.NET虚拟机的制造方式仿佛有比现在更好的处理器-理解对象、内存分配和垃圾收集等高级构造的处理器。它是一台非常复杂的机器,现在无法直接在硅中建造(性能良好),但可以编写一个仿真器,使其可以在任何现有处理器上运行。
突然之间,您可以为要在其上运行.NET的任何处理器编写一个特定于该处理器的仿真器,然后任何.NET程序都可以在其上运行。不需要担心操作系统或底层CPU架构-如果有.NET VM,则软件将运行。
但让我们进一步探讨-一旦拥有这种通用语言,为什么不制作编译器,将任何其他编写语言转换为它?
因此,现在你可以拥有C、C#、C++、Java、JavaScript、Basic、Python、Lua或任何其他编程语言编译器,将编写的代码转换为在此虚拟机上运行的代码。
您已将机器与语言分离了两个程度,并且只要有编译器和VM来映射这两个分离的程度,不需要太多工作,即可使任何人编写任何代码并在任何机器上运行。
如果您仍然想知道为什么这是好事,请考虑早期的DOS机器以及微软对世界的“真正”贡献:
Autocad必须为可以打印到的每台打印机编写驱动程序。Lotus 1-2-3也是如此。实际上,如果您想让软件打印,就必须编写自己的驱动程序。如果有10台打印机和10个程序,则必须单独且独立地编写100个基本相同的代码片段。
Windows 3.1(以及GEM和其他许多抽象层)试图实现的目标是使打印机制造商为其打印机编写一个驱动程序,而程序员则为Windows打印机类编写一个驱动程序。
现在,对于10个程序和10个打印机,只需要编写20个代码片段,由于Microsoft端的代码对于每个人都是相同的,因此MS的示例意味着您需要做的工作非常少。
现在,程序不仅限于它们选择支持的10个打印机,而且限于所有其制造商在Windows中提供驱动程序的打印机。
应用程序开发也出现了同样的问题。有些非常棒的应用程序我无法使用,因为我没有使用MAC。存在大量重复(我们真正需要多少世界级文字处理器?)。
Java旨在解决这个问题,但它有很多限制,其中一些并没有真正解决。
.NET更接近,但没有人为除Windows之外的平台开发世界级VMs(mono非常接近...但还没有完全达到目标)。
所以…… 这就是为什么我们需要VMs。因为我不想仅仅因为他们选择了与我的不同的操作系统/机器组合而将自己限制在较小的受众范围内。
- Adam