作为对这个问题的后续行动 MSIL 和 Java 字节码之间的区别?, ,Java 虚拟机的工作方式与 Java 虚拟机的工作方式有什么(主要)差异或相似之处? .NET框架 公共语言运行时 (CLR) 有效吗?

还有,就是 .NET框架 CLR是一个“虚拟机”还是它不具备虚拟机的属性?

有帮助吗?

解决方案

有很多相似之处之间的两个实现(并在我的意见:是的,他们都是"虚拟机").

对于一件事情,他们都堆基虚拟机的,没有概念"登记"我们习惯于看到在一个现代化的CPU喜欢的x86或支持.评价的所有表现形式((1+1)/2)是通过推动操作数到"堆"和随后出现的那些操作数栈时指令(加,除,等等)需要消耗的那些操作数。每一个指令推动其结果反馈到堆。

这是一个方便的方式来实现虚拟机,因为几乎每一个CPU在世界上有一堆,但许多寄往往是不同的(和一些寄存器的特殊目的,每一个指令,预计其操作数中的不同寄存器等)。

所以,如果你要模型的一个抽象机、一个纯粹的堆为基础的模式是一个很好的路要走。

当然,真正的机不运作方式。所以JIT编译器是负责执行"enregistration"的字节的操作中,基本调度实际CPU寄存器包含的操作数和结果。

因此,我认为这是一个最大的共同点之间的CLR和JVM。

作为差异...

一个有趣的差之间的两个实现是,CLR包括关于建立通用类型,然后对申请参数的专业,这些类型。所以,在运行时,CLR认为一个列表<int> 是一个完全不同的类型,从一个名单<String>.

下面,它使用的相同的集的所有参考型的专业(这样一个列表<String> 使用同样的执行情况作为一个列表<Object>,具有不同类型转换的API边界),而每个的价值型使用其自己的独特的执行情况(列表<int> 产生完全不同的代码清单<double>).

在Java,通用类型是一个纯粹的编译器的伎俩。JVM有没有概念的这类具有类型参数,这是无法执行参数的专业在运行时间。

从实际的角度来看,这意味着你不能超载Java方法上的通用类型。你不能有两种不同的方法,用同样的名称,不同的只是他们是否接受一个列表<String> 或者一个列表<Date>.当然,由于CLR知道参数的种类,它没有问题处理方法载于一般类型的专业。

在一个日常的基础上,这就是区别我注意到大多数之间的CLR和 JVM。

其他重要差异包括:

  • CLR已经关闭(实现为C#代表).JVM不支持封锁仅仅由于Java8.

  • CLR具有协同程序(执行与C#'的产量'关键词).JVM不。

  • CLR允许用户代码定义的新价值的类型(结构),而JVM提供固定收集的数值类型(byte,短,int长,float,双,char、布尔)和只允许用户确定新的基准类型(类)。

  • CLR提供的支持声明和操作指针。这是特别有趣,因为这两个JVM和CLR采用严格的代压缩垃圾收集器作为实现他们的存储管理战略。在普通情况下,严格实GC有一个很艰难的时期与指针,因为当时你移动的价值从一个存储位置到另一个,所有的指针(和指针指针)成为无效。但CLR提供了一种"固定"机制,使开发者可以宣布一块代码在哪CLR是不允许将某些指针。这是非常方便。

  • 最大的单元的码在JVM是'包装',作为证明通过'保护'的关键词或可以说一个瓶子(即Java档案)作为证明通过能够指定一个罐子中的类路径,并将它视为一个文件夹的代码。在CLR类是聚集成大会',并CLR提供了逻辑推理和操纵装置(其中载入"应用程序域",提供子应用程序级沙箱内存分配和代码的执行)。

  • CLR码格式(由集指令和元数据)已经减少指令的类型比JVM。在JVM,每一个独特的运作(加两int值,增加两个漂浮的价值观,等等)都有自己独特的指令。在CLR,所有的集指令多态性(增加两个值)和JIT编译器是负责确定类型的操作数,并创造适当的计算机代码。我不知道这是最好的策略,虽然。两者都有权衡取舍。热点JIT编译器,JVM,可以使用更简单的代码生成的机制(它不需要确定操作数的种类,因为他们已经编码的指令),但是这意味着它需要一个更复杂的字节的格式,有更多的指令的类型。

我一直在使用Java(和欣赏JVM)的大约十年了。

但是,在我看来,CLR现的卓越的执行,在几乎每一个方式。

其他提示

您的第一个问题是将 JVM 与 .NET Framework 进行比较 - 我假设您实际上是想与 CLR 进行比较。如果是这样,我想你可以写一本关于这个的小书(编辑: 看起来 Benji 已经有了:-)

一个重要的区别是,与 JVM 不同,CLR 被设计为一种语言中立的体系结构。

另一个重要的区别是 CLR 专门设计用于允许与本机代码的高水平互操作性。这意味着 CLR 必须在访问和修改本机内存时管理可靠性和安全性,并且 管理编组 基于 CLR 的数据结构和本机数据结构之间的关系。

要回答你的第二个问题,术语“虚拟机”是硬件世界中的一个较旧术语(例如,虚拟机)。IBM 在 20 世纪 60 年代对 360 进行虚拟化,这曾经意味着底层机器的软件/硬件模拟,以完成与 VMWare 相同的任务。

CLR 通常被称为“执行引擎”。在此上下文中,这是 x86 之上的 IL 机器的实现。这也是 JVM 所做的事情,尽管您可能会认为 CLR 的多态字节码和 JVM 的类型化字节码之间存在重要区别。

所以你的第二个问题的迂腐答案是“不”。但这实际上取决于您如何定义这两个术语。

编辑: JVM 和 CLR 之间的另一个区别是 JVM(版本 6)是 很不情愿 将分配的内存释放回操作系统,即使可以的话。

例如,假设 JVM 进程启动并最初从操作系统分配 25 MB 内存。然后,应用代码尝试分配需要额外 50 MB 的空间。JVM 将从操作系统中额外分配 50 MB。一旦应用程序代码停止使用该内存,它就会被垃圾收集,并且 JVM 堆大小将会减小。然而,JVM只会在一定的条件下释放分配的操作系统内存。 非常具体的情况. 。否则,在进程生命周期的剩余时间内,该内存将保持分配状态。

另一方面,如果不再需要分配的内存,CLR 会将其释放回操作系统。在上面的示例中,一旦堆减少,CLR 就会释放内存。

更多的细节上的差异,可以发现在各种学术和私人来源。一次很好的例子是 CLR设计的选择.

一些具体的例子包括:

  • 一些低级opperands类型,如"增加两个整数",其中作为CLR使用多形态的操作数。(即fadd/iadd/拉德vs只是添加)
  • 目前,JVM不孤军运行时分析和优化(即Hotspot)。CLR目前并JIT优化,但是不运行时优化(即替代,而你在运行)。
  • CLR没有内联虚拟方法,JVM不...
  • 支持值类型的CLR不仅仅是"元".

在CLR和JVM都是虚拟机。

.NET Framework和Java运行时环境是各自的VM及其库的捆绑。而不库的VM是相当无用的。

它不是一个虚拟机,.NET框架编译组件插入机二进制在第一次运行的时间:

在计算,即时编译(JIT),也被称为动态翻译,是用于改善计算机程序的运行时性能的技术。 JIT是建立在在运行时环境中前面两个观点:字节码编译和动态编译。它在之前本地执行它,例如字节码到本机机器代码的运行时转换代码。在解释业绩改善从缓存转换的代码块,并且在每次会见的时间(见解释语言)不是简单地重新评估每行或操作数的结果起源。它还拥有超过静态编译在开发时的代码,因为它可以重新编译代码,如果这被证明是有利的,也可以是能够执行安全保障优势。因此JIT可以结合一些的解释和静态的(超前 - 的时间)编译。

的优点

若干现代化的运行时环境,如Microsoft的.NET Framework,爪哇的大多数实现,以及最近的ActionScript 3,依靠JIT编译高速代码执行。

来源: http://en.wikipedia.org/wiki/Just-in -time_compilation

加起来.NET框架包含一个虚拟机,这与Java一样。

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