thi*_*eek 51 .net clr vm-implementation
我读过一本书,将.net CLR称为虚拟机?谁能证明这一点?我们在某些开发平台上需要虚拟机概念的原因是什么?
是不是可以开发一个完全面向对象并且像.net一样强大的本机框架[没有虚拟机的框架]?
将CLR称为虚拟机的书是" Professional .Net Framework 2.0 ".
Joe*_*orn 92
这里有很多误解.我想你可以把.Net想象成一个虚拟机,但是让我们来看看.Net Framework如何真正处理你的代码.典型情况看起来像这样
这里有几个重点,但最重要的一点是,任何代码都不会被解释.相反,您可以在步骤5中看到它被编译为本机代码.这比将其加载到虚拟机中有很大的不同,原因如下:
我想你可以称之为虚拟机,在某种意义上,JITter从开发人员中抽象出真机的细节.我个人认为这不是正确的,因为对于许多人来说,虚拟机意味着远离本机代码的运行时抽象,而.Net程序就不存在.
关于整个过程的另一个关键点是,它真正使它与"虚拟机"环境区分开来,它只是典型的过程.如果您真的想要,可以在分发之前预编译.Net程序集,并将本机代码直接部署到最终用户(提示:在程序的整个生命周期中,它的总体速度较慢,因为您丢失了特定于机器的优化).当然,您仍然需要安装.Net运行时,但此时它与其他任何运行时API都没有太大区别; 它更像是一个带有可以链接的漂亮API的集合dll,正如您可能拥有的VB或C运行时一样,Microsoft也附带了Visual Studio.这种情况使IL脱离了图片,使VM名称更难以证明.(我说"有点"因为IL仍然被部署并用于验证保存的代码,但它本身从未触及执行).
另一个要点是缺乏VM进程.当您运行应用程序时,没有运行的常见"沙盒"进程.将其与Java进行比较,如果在程序运行时打开任务管理器,您将看到专门针对Java VM的进程,并且应用程序的实际进程是VM创建的沙箱内的线程.在.Net中,您可以直接在Windows任务管理器中查看应用程序的进程.
总结:你可以说IL + CLR + JIT以某种方式组成了一个虚拟机.就个人而言,我不这么认为,但如果你相信的话,我不会和你争论.我想说的是,当你告诉别人.Net在虚拟机中运行而没有进一步的解释时,你正在与那个人沟通的想法是"在主机进程中解释字节码".这是错的.
Hea*_*utt 24
与Java虚拟机(JVM)类似,.net CLR是一个字节码解释虚拟机.
JVM解释包含java字节代码的程序,而.net CLR解释包含Microsoft称为"中间语言(IL)"指令的程序.这些字节代码之间存在差异,但虚拟机类似,并且希望提供类似的功能.
这两种虚拟机实现都能够将其输入字节码编译为运行它们的计算机的机器语言.这称为"及时编译(JIT)",生成的输出代码称为"JIT代码".由于JIT代码包含计算机CPU的机器语言中的指令序列,因此该代码有时称为"本机"代码.
但是,JIT代码在质量上和数量上与本机代码不同,如下所述.因此,本文将JIT代码视为运行特定字节码程序时虚拟机的本机实现.
这些虚拟机(VM)希望提供的一个特征是以防止某些危险编程错误的形式的安全性.例如,本网站论坛的标题stackoverflow的灵感来自本机代码中可能出现的一种此类危险错误.
为了提供安全性和执行安全性,VM在"虚拟机级别"实现类型安全性.需要分配VM内存来存储该内存位置中保存的数据类型.例如,如果将整数推入堆栈,则无法从堆栈中弹出double.禁止使用C式"工会".禁止使用指针和直接访问内存.
如果结果是本机二进制文件(如EXE文件),则通过在开发人员上强制使用面向对象的语言框架,我们无法获得相同的好处.在这种情况下,我们将无法区分使用框架生成的本机二进制文件和使用除框架之外的源的恶意用户生成的EXE.
在VM的情况下,类型安全性在允许程序员访问的"最低级别"强制执行.(暂时忽略了可以编写托管本机代码,即.)因此,没有用户会遇到执行需要直接访问内存位置和指针的危险操作之一的应用程序.
实际上,.net CLR实现了一种编写本机代码的方法,可以通过.net"托管"代码调用.在这种情况下,本机代码作者的负担是不要犯任何指针和内存错误.
由于JVM和.net CLR都执行JIT编译,因此VM实际上是从提供的字节码创建本机编译的二进制文件.这个"JIT代码"比VM的解释器执行执行得更快,因为即使JIT生成的机器语言代码也包含VM将执行的所有VM所需的安全检查.因此,JIT输出代码不如通常不包含大量运行时检查的本机代码快.然而,这种速度性能缺陷被用于改进包括安全性在内的可靠性; 特别是,防止使用未初始化的存储,强制执行分配的类型安全,执行范围检查(因此防止基于堆栈和堆的缓冲区溢出),通过垃圾收集管理对象生存期,动态分配是类型安全的.执行此类运行时行为检查的环境正在实现虚拟机的规范,并且仅仅是虚拟机的机器语言实现.
"虚拟机"部分指的是.NET代码被编译为EXE和DLL作为"中间"汇编语言(IL)以在虚拟机上运行,而不是真正的CPU汇编语言.然后,在运行时,ILM将转换为实际CPU程序集以供执行(称为实时,或JIT编译).
当然,您可以编写.NET编译器,以便将其编译为CPU汇编语言而不是IL.但是,这不能移植到所有CPU - 您必须为每个OS/CPU对编译不同的版本.但是通过编译成ILM,您可以让"虚拟机"处理CPU和操作系统特定的内容.