c# - Java Runtime Environment 与.NET Framework 在编译过程方面相比如何?

标签 c# java compiler-construction

我正在学习如何通过 .NETJRE 框架将源代码转换为机器代码。首先,我做了一些研究,比较了这两个过程并创建了 this diagram .我需要一些帮助来批评它的正确性,更重要的是添加我遗漏的任何重要内容以更好地理解编译路径。

enter image description here

最佳答案

.NET 和 Java 都编译成字节码,这是一种包含虚拟机指令的中间语言。它不是机器代码,因为它不能直接在物理机器上运行。相反发生的事情(至少在今天;Java 在这方面有更黑暗的历史)是在运行时运行一个即时编译器,它将 VM 指令转换为 native 代码,然后直接运行。与仅解释它相比,这具有重大的性能优势。

他们在这方面略有不同。 Oracle 的 Java 实现 (Hotspot) 巧妙地结合了解释、测量和 JIT,仅编译频繁使用的部分并解释其他部分。这是为了减少 JIT 编译器的初始影响(否则需要提前运行,从而延长进程启动时间),同时在需要时仍然允许良好的性能。另一方面,.NET 始终对所有使用的代码进行 JIT 编译(不过未使用的代码未编译)。

编辑(2019 年):现在 .NET 也有分层编译,根据运行次数较多的代码,代码将进一步优化。

关于您在评论中提到的一个问题:是的,CLR 和 JVM 是此类程序运行的平台。虚拟机也是一台机器,只是少了硬件。它们都与相应的框架、.NET 的基类库和 Java 的 Java 类库紧密集成。这些是框架。

关于c# - Java Runtime Environment 与.NET Framework 在编译过程方面相比如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11253303/

相关文章:

java - 如何让用户通过 Stripe 而不是我的 Wordpress 网站进行付款?

compiler-construction - 在 Scala 中更好地对匹配进行类型检查

c - GCC 的 __attribute__((__packed__)) 是否保留原始顺序?

c# - 在 C# 中使用 SmtpClient 发送电子邮件时出现问题

c# - 空闲期后关闭表格

c# - 对象收集位置的 Linq 结果

c# - 将日期插入 MySql 表时阻止所有星期三和星期四

java - @PostConstruct 的执行顺序

java - 我无法理解 Merge Sorted Array 的示例测试用例?

Javassist 与。 Java 编译器 API