Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';s虚拟机与CLR_Java_.net_Bytecode_Cil_Vm Implementation - Fatal编程技术网

Java';s虚拟机与CLR

Java';s虚拟机与CLR,java,.net,bytecode,cil,vm-implementation,Java,.net,Bytecode,Cil,Vm Implementation,作为问题的后续,Java虚拟机的工作方式与.NET Framework公共语言运行时(CLR)的工作方式有什么(主要)区别或相似之处 另外,.NET framework CLR是“虚拟机”还是没有虚拟机的属性 CLR和JVM都是虚拟机 NET Framework和Java运行时环境是各自虚拟机及其库的捆绑。没有库,虚拟机就毫无用处。它不是虚拟机,.net framework在第一次运行时将程序集编译为本机二进制: 在计算中,即时编译(JIT),也称为动态翻译,是一种提高计算机程序运行时性能的技术

作为问题的后续,Java虚拟机的工作方式与.NET Framework公共语言运行时(CLR)的工作方式有什么(主要)区别或相似之处


另外,.NET framework CLR是“虚拟机”还是没有虚拟机的属性

CLR和JVM都是虚拟机


NET Framework和Java运行时环境是各自虚拟机及其库的捆绑。没有库,虚拟机就毫无用处。

它不是虚拟机,.net framework在第一次运行时将程序集编译为本机二进制:

在计算中,即时编译(JIT),也称为动态翻译,是一种提高计算机程序运行时性能的技术。JIT建立在运行时环境中的两个早期思想之上:字节码编译和动态编译。它在运行时将代码转换为本机代码,然后以本机方式执行,例如字节码。与解释器相比,性能的提高源于缓存翻译代码块的结果,而不是在每次遇到行或操作数时简单地重新计算它们(请参见解释语言)。与在开发时静态编译代码相比,它还有一些优势,因为如果发现这是有利的,它可以重新编译代码,并且可以强制执行安全保证。因此,JIT可以结合解释和静态(提前)编译的一些优点

一些现代运行时环境,如Microsoft的.NET Framework、大多数Java实现以及最近的Actionscript 3,都依赖JIT编译来实现高速代码执行

资料来源:


添加.NET framework包含一个虚拟机,就像Java一样。

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

一个重要的区别是,CLR被设计成与语言无关的体系结构,与JVM不同

另一个重要的区别是CLR是专门设计来允许与本机代码进行高级别的互操作的。这意味着在访问和修改本机内存时,以及在基于CLR的数据结构和本机数据结构之间,CLR必须管理可靠性和安全性

要回答第二个问题,术语“虚拟机”是来自硬件世界的一个较旧术语(例如,20世纪60年代IBM对360的虚拟化),它过去指的是对底层机器进行软件/硬件仿真,以完成VMWare所做的相同工作

CLR通常被称为“执行引擎”。在本文中,这是一个在x86之上的IL机器的实现。这也是JVM所做的,尽管您可以认为CLR的多态字节码和JVM的类型化字节码之间有着重要的区别

所以你第二个问题的学究式回答是“不”。但这实际上取决于你如何定义这两个术语

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

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


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

两种实现之间有很多相似之处(在我看来:是的,它们都是“虚拟机”)

首先,它们都是基于堆栈的虚拟机,没有“寄存器”的概念,就像我们在x86或PowerPC等现代CPU中看到的那样。所有表达式((1+1)/2)的求值是通过将操作数推到“堆栈”上,然后在指令(加法、除法等)需要使用这些操作数时将这些操作数从堆栈中弹出来执行的。每个指令都将其结果推回到堆栈上

这是实现虚拟机的一种方便方法,因为世界上几乎每个CPU都有一个堆栈,但寄存器的数量往往不同(有些寄存器是专用的,每条指令都希望其操作数位于不同的寄存器中,等等)

所以,如果你要对一个抽象机器建模,一个纯粹基于堆栈的模型是一个很好的方法

当然,真正的机器不是这样运行的。因此,JIT编译器负责执行字节码操作的“注册”,本质上是调度实际CPU寄存器,以便尽可能包含操作数和结果

所以,我认为这是CLR和JVM之间最大的共同点之一

至于差异

这两种实现之间一个有趣的区别是,CLR包含用于创建泛型类型的指令,然后用于对这些类型应用参数化专门化。因此,在运行时,CLR将列表视为与列表完全不同的类型

在封面下,它对所有引用类型专门化使用相同的MSIL(因此列表使用与列表相同的实现,在API边界使用不同的类型强制转换),但