9

即时编译器是否(JIT)真的将程序中的每个通用中间语言(CIL) 指令映射到底层处理器的opcodes

如果是这样,我们可以称 CIL 为汇编语言而 JIT 为汇编器

注意:维基百科在其汇编语言列表中没有将 CIL 列为汇编语言

4

4 回答 4

9

这个问题都是关于定义的,所以让我们正确定义这些术语。一、汇编语言

汇编语言是用于计算机、微处理器、微控制器和其他可编程设备的低级编程语言,其中每条语句对应于单个机器语言指令。与大多数高级编程语言相比,汇编语言特定于特定的计算机体系结构,后者通常可移植到多个系统。

现在,CIL

通用中间语言是由通用语言基础结构 (CLI) 规范定义的最低级别的人类可读编程语言,由 .NET Framework 和 Mono 使用。以 CLI 兼容的运行时环境为目标的语言编译为 CIL,CIL 被组装成具有字节码样式格式的目标代码。

好吧,这部分在技术上是不正确的:例如 C# 编译器直接编译为字节码,它不通过 CIL(人类可读语言),但理论上,我们可以想象这是正在发生的事情。

有了这两个定义,CIL就是一种汇编语言,因为其中的每条语句都被编译成一条字节码指令。没有可以直接执行该字节码的物理计算机这一事实并不重要。

该定义说,每种汇编语言都是“特定于某种计算机体系结构的”。在这种情况下,体系结构是 CLR 虚拟机。


关于 JIT:不能将 JIT 编译器视为汇编程序:它不会将人类可读形式 1:1 转换为字节码,ilasm而是这样做的。

JIT 编译器是一个优化编译器,它可以从字节码编译为本机机器码(对于它运行的任何 ISA/CPU),同时进行优化。

于 2012-07-28T13:43:11.633 回答
4

汇编由特定处理器的机器代码指令的助记符组成。使核心执行代码的 1 和 0 的直接表示,但以文本形式编写以方便人类使用。这与 CIL 非常不同:

  • 你不能购买执行 CIL 的处理器
  • CIL 不针对特定处理器,但抖动会
  • CIL 假定基于堆栈的执行模型,处理器主要基于寄存器
  • CIL 代码从其原始形式进行了优化
  • 没有 CIL 指令到处理器指令的一对一翻译

最后一个要点是关键,使 CIL 与字节码截然不同的设计决策是 CIL 指令是无类型的。只有一条 ADD 指令,但处理器有很多版本。采用 byte、short、int、long、float 和 double 操作数的特定操作数。需要,因为处理器内核的不同部分用于执行添加。抖动会根据它从以前的 CIL 指令中推断出的操作数类型来选择正确的。

就像 C# 语言中的 + 运算符一样,它也可以处理不同的操作数类型。这确实使 CIL 中的 L 很重要,它是一种语言。一个简单的,但它只是简单地帮助为它编写一个抖动。

于 2012-07-28T15:54:16.513 回答
2

这条线实际上非常模糊......我所看到的反对调用CIL“汇编语言”的论点几乎同样适用于x86/x86-64在实践中。

几十年来(如果有的话),英特尔和 AMD 还没有制造出执行汇编指令的处理器,因此即使是所谓的“本机”代码也与在x86/中指定字节码的虚拟机上运行没有太大区别x86-64

x86/x86-64是典型开发人员可以访问的最低级别的东西,所以如果我们不得不放下脚并在我们的生态系统中将某些东西称为“汇编语言”,那将获胜,因为CIL字节码最终需要x86/x86-64指令才能运行在该系列的处理器上,有一个非常有力的理由证明它确实“感觉”不应该算数。

所以从某种意义上说,也许两者都不能被认为是“汇编语言”。当提到x86/x86-64处理器时,我们几乎从不提到执行x86/x86-64而不将其转换为其他东西的处理器(即,无论微码做什么)。

再加上另一个问题,x86处理器x86-64执行给定指令序列的方式可以简单地通过更新微码来改变。快速搜索一下,Linux 甚至可以让您自己在软件中轻松做到这一点!

所以我想,这里有一些标准可以证明将它们分为两个不同的类别:

  1. 当前所有运行CIL字节码的机器都用软件实现是否重要?
  2. 在软件中被指示这样做之后,相同的硬件可以以不同的方式解释相同x86/指令是否重要?x86-64
  3. 我们目前没有办法绕过微码并直接向x86/x86-64处理器的物理单元发出命令,这有关系吗?

因此,关于“是CIL汇编语言”的问题,我能给出的最佳答案是“它取决于”(对于科学家)和“几乎”(对于工程师)。

于 2017-01-27T14:16:16.947 回答
1

CIL与其说是汇编语言,不如说是一种字节码。特别是,它不是人类可读的文本形式,不像汇编语言(可能 CIL 也定义了字节码文件的格式)。

MSIL JIT 是该字节码的虚拟机实现。实现(来自 Microsoft 或Mono)如何将 CIL 转换为机器代码是一个实现细节,这对您来说并不重要(并且鉴于 Microsoft VM 可能是专有的,因此不会告诉您它是如何完成的)。我认为 Mono(CIL 的免费软件实现)正在使用LLVM,因此可能不会一次翻译每个字节码,但可能会翻译整个方法或函数。

于 2012-07-28T12:39:28.943 回答