虚拟机如何执行指令
本文关键字:执行 指令 何执行 虚拟机 | 更新日期: 2023-09-27 18:12:07
我有很强的c++背景,从来没有真正深入了解过Java或c#。但是,我对虚拟机的内部工作方式很好奇。我用一些windows前系统做过实验,发现实际的虚拟机是jvm和clr动态库。
现在这里是什么困扰我:这些库如何与exe文件中的指令交互?
我唯一的猜测是字节码实际上存储在exe文件的。data段中。它实际上把控制传递给。dll,后者翻译字节码指令。对吗?
我找不到关于这个主题的任何东西,所以任何参考都会很感激。
您对IL存储位置的猜测在这里:
http://en.wikipedia.org/wiki/Portable_Executable .NET.2C_metadata.2C_and_the_PE_format
你的猜想对于c#来说基本上是正确的。可执行文件启动CLR并交出元数据和IL;然后CLR计算出"Main"在哪里,为其获取IL,将其jit编译为x86(或其他)代码,并运行该代码。每个方法在第一次运行之前"及时"编译,因此称为"jit编译器"。
这当然是一个非常简化的概述。如果你想了解更多关于。net如何工作的信息,从
开始:http://msdn.microsoft.com/en-us/library/a4t23ktk.aspx嗯,在最基本的层面上,您是正确的:有一个本机应用程序(运行时,如java.exe
)读取字节码,并通过解释其中包含的指令来"运行"它。
您必须对该图片进行的第一个调整是出于性能原因,大多数VM现在使用jit编译,这意味着字节码不被解释,而是动态编译为本机代码。
我唯一的猜测是字节码实际上存储在exe文件的。data段中。
视情况而定。对于Java,通常只有一个包含字节码的JAR文件,与启动的本机二进制文件分开。但是,是的,您可以将它们组合成一个可执行文件,然后包含本机启动程序代码(但可能不是所有依赖的共享库),以及字节码"作为数据"。
例如Eclipse运行在JVM上,对吗?你仍然可以通过exe启动它。
是的。Eclipse有一个这样的"启动包装器exe"。但是如果你看这个,它是非常小的。它所做的只是显示一个启动屏幕并启动JVM(安装在您的系统上,而不是exe的一部分),并向它抛出一些JAR文件(作为Eclipse的一部分安装,但也不在exe中)。