作为一种叫跟进这个问题的MSIL和Java字节码之间的差异? 什么是Java虚拟机的工作原理与在怎样的(主要)的差异或相似性 .NET框架 公共语言运行时(CLR)的作品?
另外,是 .NET框架 CLR的“虚拟机”或者它没有一个虚拟机的属性?
作为一种叫跟进这个问题的MSIL和Java字节码之间的差异? 什么是Java虚拟机的工作原理与在怎样的(主要)的差异或相似性 .NET框架 公共语言运行时(CLR)的作品?
另外,是 .NET框架 CLR的“虚拟机”或者它没有一个虚拟机的属性?
有很多都实现之间的相似性(在我看来:是的,他们都是“虚拟机”)。
一方面,它们都是基于堆栈的虚拟机的,没有概念,像我们已经习惯了现代的CPU如x86或PowerPC的在看到“寄存”。 所有表达式((1 + 1)/ 2)的评价通过推动操作数到“堆”,然后弹出那些操作数关每当指令(加,除法等),需要消耗那些操作数堆栈进行的。 每个指令将其结果返回到堆栈中。
这是实现虚拟机的便捷方式,因为几乎世界上每一个CPU有一个堆栈,但寄存器的数量往往是不同的(和一些寄存器是特殊用途,并且每条指令期望其在不同的寄存器等操作数)。
所以,如果你要一个抽象的机器型号,纯粹基于堆栈的模型是去一个不错的办法。
当然,真正的机器不运转的方式。 所以JIT编译器负责执行字节码操作的“enregistration”,基本上调度实际CPU寄存器包含操作数和结果只要有可能。
所以,我认为这是CLR和JVM之间最大的共同点之一。
至于差异...
这两种实现之间的一个有趣的区别是,CLR包括用于创建泛型类型,然后将参数专门化的类型进行了说明。 因此,在运行时,CLR认为一个List <int>的是从一个列表<字符串>一个完全不同的类型。
下盖,它使用相同的MSIL所有参考型专业化(这样一个列表<字符串>使用相同的实现作为List <对象>,具有不同类型强制转换在API边界),但是每个值型用途其独特的实现(列表<int>的生成从列表<双>完全不同的代码)。
在Java中,泛型类型是一个纯粹的编译器的把戏。 JVM有没有概念,其中类具有类型的参数,它是无法在运行时执行参数专业。
从实用的角度来看,这意味着你不能超载泛型类型的Java方法。 你不能有两种不同的方法,使用相同的名称,只在是否接受一个List <String>的或List <日期>不同。 当然,由于CLR知道参数类型,却没有这个问题的处理上重载泛型类型专业化的方法。
在某一天到一天的基础上,那就是我的CLR和JVM之间最知道其中的差别。
其他重要的不同之处包括:
该CLR有倒闭(如C#委托实现)。 在JVM不支持关闭只有从Java 8。
在CLR具有协同程序(与C#“成品率”关键字实现)。 在JVM没有。
在CLR允许用户代码来定义新的值类型(结构),而JVM提供值类型(字节,短型,整型,长整型,浮点,双,炭,布尔值)的固定的收集和只允许用户定义新的参比类型(类)。
CLR提供了声明和处理指针的支持。 因为这两个JVM和CLR使用严格代压实垃圾收集器的实现作为自己的内存管理策略,这是特别有趣。 在一般情况下,严格的压实GC有一个真正艰难的时间与指针,因为当你从一个内存位置移动值到另一个,所有的指针(和指针的指针)的无效。 但CLR提供了一个“钉扎”机构,使得开发者可以声明的在其内CLR不允许移动某些指针代码块。 这是非常方便。
在JVM代码的最大单元是通过能够specifiy在类路径一个罐子证明,并将它当作一个文件夹作为证明的“保护”的关键字或可以说是一个JAR(即Java归档)或者是“包”的代码。 在CLR中,类被聚集成“组件”,和CLR提供逻辑约推理和操作组件(其被加载到“应用程序域”,用于存储器分配及代码执行提供子应用程序级沙箱)。
在CLR字节码格式(的MSIL指令和元数据组成)具有较少的指令类型比JVM。 在JVM中,每一个独特的操作(添加两个int值,添加两个浮点值等)都有自己独特的指令。 在CLR中,所有的MSIL指令是多态的(添加两个值)和JIT编译器负责确定该类型的操作数并创建适当的机器代码。 我不知道这是最好的策略,虽然。 两者都有取舍。 热点JIT编译器,JVM的,可以用一个简单的代码生成机制(它并不需要确定操作的类型,因为他们在指令已被编码),但是这意味着它需要一个更复杂的字节码格式,有多种指令类型。
我一直在使用Java(和欣赏JVM)现在大约十年。
但是,在我看来,在CLR现在是优越的实现,几乎在每一个方式。
你的第一个问题是比较.NET Framework中的JVM - 我假设你其实是要与CLR,而不是比较。 如果是这样,我想你可以写一本小书对这个( 编辑:看起来像石磊已经:-)
一个重要的区别是,CLR被设计为一个中性语言体系结构,不同的是JVM。
另一个重要的区别是,CLR是专门设计为允许高级别的互操作性与本地代码。 这意味着,当本地存储器被访问和修改的CLR必须管理的可靠性和安全性,并且还管理编组基于CLR的数据结构和本地数据结构之间。
要回答你的第二个问题,术语“虚拟机”是从硬件世界中的旧术语(例如,IBM公司在20世纪60年代的360的虚拟化)是用来表示底层机器的软件/硬件仿真来实现相同的排序东西,VMWare的一样。
CLR是通常被称为“执行引擎”。 在此背景下,这是一个IL机在x86之上的实现。 这也是JVM做什么,虽然你可以说,有CLR的字节码多态性和JVM的类型字节码之间的一个重要区别。
所以,迂腐回答你的第二个问题是“不”。 但它真的可以归结为你如何定义这两个方面。
编辑:JVM和CLR之间还有一个区别是,JVM(第6版)是非常不愿意释放分配的内存返回给操作系统,即使它可以。
例如,让我们说,一个JVM进程启动,并从操作系统最初分配25 MB的内存。 该应用程序代码然后尝试需要额外的50 MB的分配。 JVM将来自操作系统的分配额外的50 MB。 一旦应用程序代码使用的内存停止,它是垃圾回收和JVM堆大小将减少。 但是,JVM将仅释放在特定分配的操作系统的内存非常特殊的情况 。 否则,流程生命周期的其余部分内存将保持分配。
CLR中,而另一方面,释放,如果它不再需要分配的内存返回给操作系统。 在上面的例子中,CLR会释放的存储器,一旦堆已经减少。
上的差异更多的细节可以从各种学术和私人来源中找到。 一旦很好的例子是CLR设计选择 。
一些具体的例子包括:
CLR和JVM都是虚拟机。
.NET Framework和Java运行时环境是各自的虚拟机和他们的图书馆的捆绑。 如果没有库的虚拟机都没什么用。
它不是一个虚拟机,.NET框架编译组件插入机二进制在第一次运行的时间:
在计算中,即时编译(JIT),也被称为动态翻译,是用于改善计算机程序的运行时性能的技术。 JIT是建立在在运行时环境中前面两个观点:字节码编译和动态编译。 它在之前本地执行它,例如字节码到本机机器代码的运行时转换代码。 在解释业绩改善从缓存转换的代码块,并且在每次会见的时间(见解释语言)不是简单地重新评估每行或操作数的结果起源。 它还拥有超过静态编译在开发时的代码,因为它可以重新编译代码,如果这被证明是有利的,也可以是能够执行安全保障优势。 因此JIT可以结合一些解释和静态(名列前茅的时间)汇编的优点。
一些现代的运行时环境,如Microsoft的.NET Framework,爪哇的大多数实现,以及最近的ActionScript 3,依靠JIT编译高速代码执行。
来源: http://en.wikipedia.org/wiki/Just-in-time_compilation
加起来.NET框架包含的虚拟机,这与Java一样。