C# CIL是汇编语言,JIT是汇编程序吗

C# CIL是汇编语言,JIT是汇编程序吗,c#,.net,assembly,cil,C#,.net,Assembly,Cil,即时编译器(JIT)是否真的将程序中的每个公共中间语言(CIL)指令映射到底层处理器的操作码 如果是这样的话,我们能称CIL为汇编语言而称JIT为汇编程序吗 注: Wikipedia在其中没有将CIL列为汇编语言。CIL与其说是汇编语言,不如说是汇编语言。特别是,它不是一种文本可读形式,不像汇编语言(可能CIL还定义字节码文件的格式) MSIL JIT是该字节码的一个实现。实现(来自Microsoft或来自Microsoft)如何将CIL转换为机器代码是一个实现细节,这对您来说并不重要(并且考虑

即时编译器
(JIT)
是否真的将程序中的每个公共中间语言
(CIL)
指令映射到底层处理器的
操作码

如果是这样的话,我们能称CIL为汇编语言而称JIT为汇编程序吗

注: Wikipedia在其

中没有将CIL列为汇编语言。CIL与其说是汇编语言,不如说是汇编语言。特别是,它不是一种文本可读形式,不像汇编语言(可能CIL还定义字节码文件的格式)


MSIL JIT是该字节码的一个实现。实现(来自Microsoft或来自Microsoft)如何将CIL转换为机器代码是一个实现细节,这对您来说并不重要(并且考虑到Microsoft VM可能是专有的,所以不会告诉您它是如何完成的)。我认为Mono(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的目标不是特定的处理器,而是抖动
  • CIL采用基于堆栈的执行模型,处理器主要基于寄存器
  • CIL代码从其原始形式优化
  • CIL指令不存在到处理器指令的一对一转换
最后一项是关键的,使CIL与字节码截然不同的设计决策是CIL指令的类型较少。只有一条ADD指令,但处理器有多个版本。采用字节、短、整型、长、浮点和双操作数的特定操作数。必需,因为处理器核心的不同部分用于执行add。抖动根据它从以前的CIL指令推断出的操作数类型选择正确的操作数


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

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

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

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

因此,在某种意义上,两者都不能被视为“汇编语言”。当提到
x86
/
x86-64
处理器时,我们几乎从不提及执行
x86
/
x86-64
而不将其转换为其他内容(即,微码所做的任何操作)的处理器

再加上另一个问题,只要更新微码,
x86
/
x86-64
处理器执行给定指令序列的方式就可以改变。快速搜索显示Linux甚至可以让您自己轻松完成这项工作

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

  • 所有当前运行
    CIL
    字节码的机器都实现了,这有关系吗