即时编译器是否(JIT)
真的将程序中的每个通用中间语言(CIL)
指令映射到底层处理器的opcodes
?
如果是这样,我们可以称 CIL 为汇编语言而 JIT 为汇编器
注意:维基百科在其汇编语言列表中没有将 CIL 列为汇编语言
这个问题都是关于定义的,所以让我们正确定义这些术语。一、汇编语言:
汇编语言是用于计算机、微处理器、微控制器和其他可编程设备的低级编程语言,其中每条语句对应于单个机器语言指令。与大多数高级编程语言相比,汇编语言特定于特定的计算机体系结构,后者通常可移植到多个系统。
现在,CIL:
通用中间语言是由通用语言基础结构 (CLI) 规范定义的最低级别的人类可读编程语言,由 .NET Framework 和 Mono 使用。以 CLI 兼容的运行时环境为目标的语言编译为 CIL,CIL 被组装成具有字节码样式格式的目标代码。
好吧,这部分在技术上是不正确的:例如 C# 编译器直接编译为字节码,它不通过 CIL(人类可读语言),但理论上,我们可以想象这是正在发生的事情。
有了这两个定义,CIL就是一种汇编语言,因为其中的每条语句都被编译成一条字节码指令。没有可以直接执行该字节码的物理计算机这一事实并不重要。
该定义说,每种汇编语言都是“特定于某种计算机体系结构的”。在这种情况下,体系结构是 CLR 虚拟机。
关于 JIT:不能将 JIT 编译器视为汇编程序:它不会将人类可读形式 1:1 转换为字节码,ilasm
而是这样做的。
JIT 编译器是一个优化编译器,它可以从字节码编译为本机机器码(对于它运行的任何 ISA/CPU),同时进行优化。
汇编由特定处理器的机器代码指令的助记符组成。使核心执行代码的 1 和 0 的直接表示,但以文本形式编写以方便人类使用。这与 CIL 非常不同:
最后一个要点是关键,使 CIL 与字节码截然不同的设计决策是 CIL 指令是无类型的。只有一条 ADD 指令,但处理器有很多版本。采用 byte、short、int、long、float 和 double 操作数的特定操作数。需要,因为处理器内核的不同部分用于执行添加。抖动会根据它从以前的 CIL 指令中推断出的操作数类型来选择正确的。
就像 C# 语言中的 + 运算符一样,它也可以处理不同的操作数类型。这确实使 CIL 中的 L 很重要,它是一种语言。一个简单的,但它只是简单地帮助为它编写一个抖动。
这条线实际上非常模糊......我所看到的反对调用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 甚至可以让您自己在软件中轻松做到这一点!
所以我想,这里有一些标准可以证明将它们分为两个不同的类别:
CIL
字节码的机器都用软件实现是否重要?x86
/指令是否重要?x86-64
x86
/x86-64
处理器的物理单元发出命令,这有关系吗?因此,关于“是CIL
汇编语言”的问题,我能给出的最佳答案是“它取决于”(对于科学家)和“几乎”(对于工程师)。