【问题标题】:Is CIL an assembly language and JIT an assemblerCIL 是汇编语言而 JIT 是汇编程序吗
【发布时间】:2012-07-28 12:33:30
【问题描述】:

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

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

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

【问题讨论】:

  • 有趣的问题,我试着回答,但并不那么容易。我认为您不能将其视为汇编语言,因为 tehre 不是直接运行它的真正 cpu。
  • @FelicePollano 然后 CIL 可能是部分汇编语言..:)
  • 汇编语言助记符与 CPU 特定机器码指令 1:1 对应。汇编器只是将(某种)人类可读的汇编代码映射到这些指令。 CIL 绝对不是这种情况。这不是部分的,只是不是——汇编语言有一个非常明确的定义。
  • @jamietre 你是对的,但后来人们称它为面向对象的汇编语言
  • 我什至不确定“面向对象”对于 CIL 是否那么重要(尽管 CLI 的架构显然支持 OO 范式)。它的基于堆栈的评估模型更加突出,强调除了字节码之外还提供元数据。您的典型汇编语言根本不关心元数据。

标签: c# .net assembly cil


【解决方案1】:

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

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

现在,CIL

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

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

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

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


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

JIT 编译器是一个优化编译器,它可以从字节码编译为本机机器码(无论它运行在什么 ISA/CPU 上),同时进行优化。

【讨论】:

  • 虚拟机执行 JIT 编译为特定的机器指令(x86、x64、ia64 等)。
  • 部分 OP 问题询问了 JIT。
  • @PeterRitchie 对,谢谢,我添加了一段关于 JIT 的简短段落。
  • @svick ilasm 生成一个包含 MSIL 和所需元数据的可移植可执行文件 (PE)。它怎么可能是一个汇编程序!
  • @Anirudha x86 机器码有何特别之处?汇编器不必生成 x86 代码,例如 ARM 也不这样做。例如,一些 C 编译器确实生成 x86 机器代码,但它们不是汇编程序。作为汇编程序与 x86 机器码没有任何关系。
【解决方案2】:

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

  • 您无法购买执行 CIL 的处理器
  • CIL 不针对特定处理器,但抖动可以
  • CIL 采用基于堆栈的执行模型,处理器主要基于寄存器
  • CIL 代码从其原始形式进行了优化
  • 没有 CIL 指令到处理器指令的一对一转换

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

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

【讨论】:

  • 为什么物理处理器的存在很重要?如果将来有人为 CIL 字节码制作物理处理器,那会不会突然让 CIL 成为一种汇编语言?另外,这是否意味着MIXAL 不是汇编语言?
  • 这样的“假设”游戏效率不高。事实是没有这样的处理器,我回答的最后一部分指出了我们仍然没有处理器的可能原因。即使没有 Java,Jazelle 也不执行所有字节码。我保证,只要我的机器上有一个可以让我发布到 SO 的机器,我就会用它来编辑这个答案。有可能发生,让我们看看 Midori 产生了什么。
  • 我的观点是,依赖于某些特定硬件的存在的定义是愚蠢的。特定的硬件不会产生汇编语言,它的编译机制可以。
  • 嗯,在组装的情况下不会。您的 MIXAL 示例需要一个 emulator,这是一个模拟硬件的软件块。在这种情况下,Knuth 的虚拟处理器。这只是学术兴趣(例如学习 MIPS 的学生),或者对执行旧游戏的 ROM 感兴趣,模拟器太慢而无法用于通用计算。
  • 所以你是说 MIX 汇编语言不是汇编语言,而 Knuth 不知道“汇编语言”是什么意思?
【解决方案3】:

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

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

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

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

另外一个问题是,x86/x86-64 处理器执行给定指令序列的方式可以通过更新微码来改变。快速搜索一下,Linux 甚至可以让自己轻松做到这一点in software

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

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

所以关于“CIL 是一种汇编语言”这个问题,我能给出的最佳答案是“取决于”(对于科学家)和“差不多”(对于工程师)。

【讨论】:

    【解决方案4】:

    CIL 更像是bytecode,而不是汇编语言。特别是,它不是人类可读的文本形式,不像汇编语言(可能 CIL 也定义了字节码文件的格式)。

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

    【讨论】:

    • 字节码是 CIL 的物理表示或“编译”版本。 CIL 不是字节码。
    猜你喜欢
    • 2011-01-01
    • 2014-10-07
    • 2016-09-27
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多