我正在学习通过 .NET
和 JRE
框架将源代码转换为机器码。首先,我进行了一些研究,比较了这两个过程,并创建了这个图表。我需要帮助批评其正确性,更重要的是添加任何我遗漏的严肃内容以更好地理解编译路径。
我正在学习通过 .NET
和 JRE
框架将源代码转换为机器码。首先,我进行了一些研究,比较了这两个过程,并创建了这个图表。我需要帮助批评其正确性,更重要的是添加任何我遗漏的严肃内容以更好地理解编译路径。
.NET和Java都会编译成字节码,这是一种中间语言,其中包含虚拟机的指令。它不是机器码,因为无法直接在物理机器上运行。相反,现在运行时会启动即时编译器将VM指令转换为本地代码,然后直接运行。这比仅解释有很大的性能优势。
在这方面,它们略有不同。Oracle的Java实现(Hotspot)使用巧妙的解释、测量和JIT编译,只编译那些经常使用的部分,其余部分则进行解释。这是为了减少JIT编译器的初始影响(否则需要提前运行,从而延长进程启动时间),同时仍然允许在需要的地方获得良好的性能。另一方面,.NET总是JIT编译所有被使用的代码(未使用的代码不会被编译)。
编辑(2019):到目前为止,.NET也有分层编译,根据运行的代码来进一步优化代码。
至于您在评论中提到的问题:是的,CLR和JVM就是这些程序运行的平台。虚拟机也是一种机器,但不太像硬件。它们都与相应的框架紧密集成,.NET为基础类库,Java为Java类库。这些都是框架。
.exe
或 .dll
文件,也就是编译后的程序集。编译单元指的是最小的可编译单元,如果要进行部分重新编译就会变得很重要。例如,在Java中,您只需要重新编译已更改的类,在.NET中,您需要重新编译整个项目。请注意,对于大多数情况来说,这种差异微不足道--两个平台的编译器都非常快,特别是与C++相比。 - Joey