实时编译器(JIT)是否真的将程序中的每个公共中间语言(CIL)指令映射到底层处理器的opcodes
如果是这样的话,可以将CIL称为汇编语言,JIT称为汇编程序吗?
注意:维基百科没有在其汇编语言列表中将CIL列为汇编语言
发布于 2012-07-28 15:54:16
程序集由用于特定处理器的机器代码指令的助记符组成。1和0的直接表示,使核心执行代码,但写成文字,使人容易。这与CIL非常不同:
最后一个问题是关键问题,一个使CIL与字节码有很大区别的设计决策是CIL指令是无类型的。只有一个ADD指令,但是处理器有很多版本。采用字节、短、int、长、浮点和双操作数的特定操作数。之所以需要,是因为处理器核心的不同部分用于执行add。抖动根据它从以前的CIL指令推断的操作数的类型来选择正确的操作数。
就像C#语言中的+操作符一样,它也可以处理不同的操作数类型。这真的使L在CIL中很重要,它是一种语言。一个简单的例子,但它只是简单的帮助它轻松地为它写一个抖动。
发布于 2012-07-28 13:43:11
这个问题都是关于定义的,所以让我们正确地定义术语。首先,汇编语言
汇编语言是一种用于计算机、微处理器、微控制器和其他可编程设备的低级编程语言,其中每条语句对应于一台机器语言指令。汇编语言是特定于某种计算机体系结构的,与大多数高级编程语言不同,后者通常可移植到多个系统。
现在,CIL
公共中间语言是由公共语言基础结构(CLI)规范定义的最低级别的人类可读的编程语言,由.NET框架和Mono使用。将CLI兼容的运行时环境编译为CIL的语言,CIL被组装成具有字节码样式格式的对象代码。
好的,这个部分在技术上是不正确的:例如,C#编译器直接编译到字节码,它不通过CIL (人类可读的语言),但理论上,我们可以想象这就是正在发生的事情。
使用这两个定义,CIL是一种汇编语言,因为其中的每条语句都被编译成一个字节码指令。没有物理计算机可以直接执行字节码这一事实并不重要。
定义说,每种汇编语言都是“特定于某一计算机体系结构的”。在这种情况下,体系结构是CLR虚拟机。
关于JIT: JIT编译器不能被认为是汇编程序:它不执行从人类可读的形式到字节码的1:1转换,ilasm这样做。
JIT编译器是一个优化编译器,它从字节码编译为本机代码(对于运行在任何ISA / CPU上的代码),同时进行优化。
发布于 2017-01-27 14:16:16
实际上这条线很模糊..。我所看到的反对将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是一个汇编语言的问题”,我能给出的最好的答案是“这取决于”(对于科学家)和“几乎大部分”(对于工程师)。
https://stackoverflow.com/questions/11701063
复制相似问题