JIT是不是将IL的二进制代码转换为二进制机器码?

Posted

技术标签:

【中文标题】JIT是不是将IL的二进制代码转换为二进制机器码?【英文标题】:Does JIT convert the binary code of IL into binary machine code?JIT是否将IL的二进制代码转换为二进制机器码? 【发布时间】:2014-07-25 07:07:50 【问题描述】:

这是关于 .NET 的。

    代码(高级:c#,vb.net - 人类可以理解)在 VS 中编译并生成 dll/exe 这称为 IL(这也或多或少是人类可以理解的)。

    当我们第一次在机器上运行这个 dll/exe 时,CLR/JIT 将 IL 转换为机器代码(二进制格式:0 和 1 - 这是人类无法理解的)。该机器码保存在内存中,除非重启系统,否则下次不需要转换。

    ILASM.exe 可用于将 dll/exe(IL 代码)转换为机器码,而 ILDASM.exe 则相反。

如果编译器生成二进制格式的 exe/dll (IL),那么 JIT 的目的是什么?既然代码已经是二进制格式了……是不是说IL的二进制代码是通过JIT转成二进制机器码的?

请纠正我的上述说法。

【问题讨论】:

【参考方案1】:

代码(高级:c#,vb.net - 人类可以理解)在 VS 中编译并生成 dll/exe 这称为 IL(这也或多或少是人类可以理解的)。

您需要区分 IL 的 binary 形式和 IL 的 textual 形式 - 如果打开已编译的 EXE 或 DLL 文件,则不会看文本,所以 that 不是人类可读的......但文本表示是一种“面向对象的汇编语言”。二进制表示是“CLI 的机器代码”——但这不是您正在运行的计算机的本机机器代码。

此机器码保存在内存中,下次不需要转换。

不,据我所知,它只保留在流程中,在大多数情况下。因此,如果您启动另一个进程,它将再次 JIT 代码。

ILASM.exe 可用于将 dll/exe(IL 代码)转换为机器码,而 ILDASM.exe 则相反。这也保存在内存中吗?什么是文件格式?

不,那不是真的。 ILASM 采用 source IL(文本)并将其组装成 binary IL...它不会将其转换为机器代码。 ILDASM 则相反 - 它会将 DLL 或 EXE 转换为可以读取的文本 IL。

什么时候会使用 ILASM 之类的工具?

我有时使用 ILDASM 来查看特定编译二进制文件的 IL(尽管我通常使用 Reflector)。我很少使用 ILASM - 通常在使用 ILDASM 获取文本 IL 之后,然后我以一些有趣的方式对其进行了调整。您可以查看我的 Unconstrained Melody 项目中的一个示例,其中我调整了 IL 以表示无法在 C# 中表示的通用约束。

【讨论】:

我们在 Visual Studio 中编写 C#.NET 代码并编译它。这会生成 EXE/DLL。 EXE/DLL 不是 IL 代码吗? @variable:是的,但它是 IL 的 二进制 表示。我已经扩展了我的答案。 好的,你能告诉我如何生成文本表示吗? @variable:从什么生成?正如我在回答中所说,从二进制文件中,您使用 ILDASM。 JIT 只是 CLR 的一部分。它根据需要将二进制 IL 转换为机器本机代码。据我所知,它不会将其存储在内存中以外的任何地方(尽管您可以使用 ngen 提前编译它,并且 确实 存储结果)。跨度>

以上是关于JIT是不是将IL的二进制代码转换为二进制机器码?的主要内容,如果未能解决你的问题,请参考以下文章

clr的执行模型(中)

深入浅出 JIT 编译器

C#编译过程

请教QT中怎么实现10进制数转换为16进制数 最好有代码

将十进制转换为二进制的此错误是不是有解决方案

IL指令列表