我读 这个问题 要找出之间的差异Java虚拟机。净CLR和班吉的答案了我不知道为什么虚拟机必须放在第一位。

从我理解的班吉的解释,即编译器的虚拟机的解释中间代码到实际装运行的代码,在CPU。原因,它这样做是因为Cpu往往有不同的数字的登记册和根据本"一些寄存器的特殊目的,每一个指令,预计其操作数中的不同寄存器。" 这是有道理的,然后,需要有一种中间解释喜欢的虚拟的机器如此,同样的代码可以运行上的任何CPU。

但是,如果是这种情况,那么什么我不明白的是为什么C或C++码编译成机器码能够运行的任何计算机上,只要它是正确的操作系统。那么,为什么将一C节目我编写了关于我的Windows的机器使用一个奔腾能够运行,在我的其他窗口机使用AMD?

如果C码可以运行上的任何CPU后的目的是什么虚拟机?它是如此,同样的代码可以运行上的任何操作系统?我知道Java VM版本上差不多任何操作系统,但是有一个CLR其他操作系统的一窗口?

或者是还有别的东西我的失踪?不OS做一些其他的解释大会的代码运行,以使其适应特定的CPU什么的?

我很好奇这一切是如何工作的,因此,一个明确的解释,将不胜感激。

注:原因我不只是发表我的查询意见,在与JVMCLR的问题是因为我没有足够的分后的意见尚未=b。

编辑:感谢所有伟大的答案!因此它似乎什么我错过的是,尽管所有处理器都有差异有一个共同的标准化,主要是X86构,它提供了一个足够大的一套共同的特点,以便对C码编制一个X86会的工作大部分在另一个X86处理器。这进一步加强的理由说明为虚拟机,更不要说,我忘记了重要的垃圾收集。

有帮助吗?

解决方案

AMD和英特尔处理器的使用相同的指令设和机构(从的角度来看,执行机代码)。

C和C++编纂的机器码,标题相应的操作系统,他们是有针对性。一旦编成,他们停止相关联的任何方式或形式的语言,他们编制了在,并且仅仅是二进制的可执行程序。(有文物taht可能显示出什么样的语言,它是编制从,但这并不是这里的要点)

所以一旦编成,它们是相关的机(X86、英特尔和amd指示设置和结构)和系统。

这就是为什么他们可以运行上的任何兼容x86机和任何兼容的操作系统(win95通过winvista,对于某些软件)。

然而,他们不能运行OS x机,甚至如果这是上运行的英特尔处理器-二进制不兼容,除非运行的附加模拟软件(例如相似之处,或虚拟机windows)。

除此之外,如果想跑他们一臂处理器,或MIPS,或支持,那么你必须要运行完整的机器指示设置的程序,解释二进制的机器码,从X86成任何机器在运行。

对比。网。

。净虚拟机制作为虽然有更好的处理器在世界上处理,了解对象,存分配和垃圾收集,以及其他高级别结构。这是一个非常复杂的机器并不能直接建立在现在,硅(良好业绩),但是一个仿真器可以写,将使它能够运行上的任何现有的处理器。

突然间,你可以写一台机器的特定程序,任何处理器要运行。网上,然后任。净节目可以在其上运行。不需要担心的操作系统或基础CPU结构-如果有一个.净虚拟机,然后将软件运行。

但是,让我们远一点-一旦你有了这个共同的语言,为什么不做编译器转换的任何其他书面语言吗?

所以现在你可以有一C,C#、C++、Java,javascript,基本的,蟒蛇,lua,或任何其他语言编译器,将编写代码,所以它将在这个虚拟的机。

你已经回避的机从语言通过2度,并且不太多的工作使任何人都可以写任何代码和运行它的任何计算机上,只要作为一个编译器和虚拟机的存在是为了地图上两度分离。

如果你仍然想知道为什么这是件好事,考虑尽早DOS机,微软的 真的 对世界的贡献是:

Autocad已经编写驱动程序的每个打印机,他们可以打印。因此,没有lotus1-2-3。事实上,如果你想要你的软件,打印,你得写自己的驱动程序。如果有10打印机、10个计划,然后100个不同的碎片基本上相同的代码必须是书面单独和独立。

什么windows3.1试图完成的(随着宝石,所以许多其他的抽象层)是使它打印机制造商写了一个司机为他们的打印机,以及该程序编写了一个驱动程序的窗户打印机的类。

现在有10个项目和10台打印机,只有20块代码必须是书面的,并且由于microsoft侧的代码是一样的每个人,然后实例,从MS意味着你有很少工作要做。

现在的程序并不仅限于10个打印机,他们选择支持,但所有打印机的制造商提供的驱动程序,在windows.

同样的问题是发生在应用程序开发。真整齐的应用的我不能使用,因为我不会用一个MAC。有一吨重叠(如许多世界级的文字处理我们真的需要吗?).

Java是为了解决这个问题,但它有许多限制,一些不是真正的解决。

.净是更接近,但没有一个是发展中世界级的虚拟机平台的其他窗口(单是这么近...和尚不存在).

所以...这就是为什么我们需要虚拟机。因为我不想要限制自己来一个小的观众只是因为他们选择了一个操作系统/机组合不同,从我自己的。

-亚当

其他提示

你的假设,C代码可以运行上的任何处理是不正确的。有些事情就像寄存器和字节序,这会使汇编C程序并不在所有的工作在一个平台,同时它可能会工作上另一个。

然而,也有某些相似之处,处理共享的,例如,英特尔x86处理器和AMD处理器共享一个足够大的设置的特性,大多数代码汇编针对一个会运行。然而,如果要使用处理器的特定性质的,然后你需要一个编译器或设置的库,它将为你做的。

为什么你会希望有一个虚拟机,超出了声明,它将处理差异,在处理对你来说,也是事实,虚拟机器提供服务代码,不可用于方案编制,在C++(管理)的今天。

最突出的服务提供垃圾收集,所提供的CLR和JVM。这两个虚拟机你提供这种服务是免费的。他们管理忆。

事情就像的边界检查,访问的侵犯(同时仍然是可能的,他们是非常困难的)还提供。

CLR还提供一个代码形式的安全。

没有这些都提供了基本的运行环境的其他一些语言不要操作与虚拟机。

你可能会得到他们中的一些通过使用图书馆,但那么强迫你变成一种模式的使用的图书馆,而中。净和Java提供的服务向你通过CLR和JVM是一致的,在他们访问。

本质上,它允许为'管理的码',这意味着什么说-虚拟机管理的码的运行过程。三个主要好处是只是时间编纂、管理的指针/垃圾收集和安全控制。

为的只是时间汇编一,虚拟机表代码的执行和所以,作为代码运行更经常的是,它是reoptimised运行得更快。你不能这样做与原代码。

管理指针也更容易以优化,因为虚拟机跟踪它们,因为他们绕过去,管理它们以不同的方式取决于它们的大小和寿命。这是难以做到这一点在C++因为你真的不能告诉其中一指针是要去就读的编码。

安全是一个不言自明的一个,虚拟机停止码做的事情,它不应该因为这是观看。我个人认为这是可能的最大原因为什么Microsoft选择管理的代码。

基本上我的一点是,因为虚拟的机器可以看码,因为它发生时,它可以做的事情,这使生活更容易的程序和作出的代码的更快。

最编译器,即使母代码编译器,使用某种中间体的语言。

这主要是为了减少编译器的建筑费用。有许多(N)编程语言中的世界。也有很多(M)硬件平台的世界。如果编译器的工作没有使用中的语言总数的"编",将需要编写,以支持所有语言上的所有硬件平台将N*M.

然而,通过限定中间的语言,并打破一个编译器为2部分,前端和后端,与前端编写的源代码转IL和后端编制IL成机器码,你可以逃脱,只写N+M编译器。这个结束是一个巨大的成本节约。

之间的巨大差异CLR/JVM编译器和地代码汇编者是前端和后端编译器是相互关联。在一个地代码编译器的两个组件通常是结合成同一个可执行的,两者都是时运行的程序员命"建立"在IDE。

与CLR/JVM编译器,前端和后端运行在不同的时间。前端运行,在编制时,产生IL这实际上是运送给客户。后尾随后体现在一个单独的组件,是援引在运行时间。

因此,这带来了替代问题,"有什么好处的拖延后终汇编,直到运行时"?

答案是:"它取决于"。

通过延迟回端汇编,直到运行时,就有可能对船舶的一个组二进制文件,可以运行在多硬件平台。它还使得有可能对程序的利用改进后端编制技术而未被重新部署。它还可以提供一个基础,为有效地实施了许多动态的语言功能。最后,它提供了能够介绍的安全性和可靠性的制约之间分别单独编制,地方与库(dll)就是不可能与前期机代码汇编。

然而,也有画的后面。该分析有必要执行广泛的编译器优化可能是昂贵的。这意味着,"准时"后结束往往会较少的优化,比前期后端做。这可以伤害的性能。此外,需要调用编译器在运行时也增加了所需要的时间负载的程序。项目产生的"前期"编译器,不拥有这些问题。

首先机的代码不是最低的形式的说明cpu。今天x86CPU自己解释X86的指令组成的另一个内部的格式使用微码。唯一的人,那些实际程序的微码是芯片工程师开发的类型,谁忠实地和痛苦效仿的遗产x86指令芯片来实现最高性能使用当今的技术。

开发类型一直是加入额外的层的抽象概念,因为权力和功能是他们带来。之后,所有更好的抽象,让新的应用程序可以写的更迅速和可靠。企业不关心什么,或者它们如何代码看起来像他们只是想完成工作的可靠地和迅速。不真正的问题,如果C版本的应用程序需要几毫秒的时间较少,但最终采取双倍的时间来发展?

速度问题是几乎不参数作为许多企业应用程序,为数以百万计的人都写在平台/语言类似的java-例如免费允许你搜索.忘记关于其语言/平台是最快的。什么更重要的是,使用正确的算法和编写高效的代码和完成工作。

AMD和英特尔处理器都有x86架构,如果你想要跑c/c++的程序在不同的建筑你必须使用一个编译器用于架构,同样的二进制的可执行不会遇到不同的处理架构。

我知道Java VM版本上差不多任何操作系统,但是有一个CLR其他操作系统的一窗口?

在一个非常简化的方式,这是因为英特尔公司和AMD实现同大会的语言,具有相同编号的注册,等等...

所以你C编译器编码工作Linux。大会是使用Linux ABI, ,因为只编译程序运行在Linux上,在x86会,并正确的功能签名,则都是花花公子。

现在尝试采取这一编码,并坚持说Linux/PPC(例如Linux在一个旧的笔记本电脑或台式电脑).不会的工作。在那里作为Java程序将因为JVM已经执行在Linux/PPC平台。

大会语言现在基本上是另一种接口是一个程序员可程序。x86(32-bit)允许访问eax,ebx,ecx,edx的一般目的整寄存器和f00-f07为浮点。幕后,CPU实际上已百多个寄存器和混乱的那些东西的周围挤的性能。

你就在你的分析、java或C#有可能被设计用来编译直接运行上的任何机,并且很可能会更快,如果他们这样做。但是虚拟机的办法给出了完全控制的环境中,你的代码运行,虚拟机建立一个安全的沙盒,只允许的命令有权的安全访问,以执行潜在的破坏性代码,如改变口令,或更新清启动扇区.还有许多其他的好处,但这是凶手的原因。你不能让一个计算器在C#...

我认为的前提下你的问题是有效的-你肯定不是第一个问这个问题。因此,检查出来的 http://llvm.org 看到一个替代办法(其是现在一个项目正在运行?或赞助Apple)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top