如果我理解正确的话:
AMD和英特尔等目前的CPU开发公司都拥有自己的API代码(汇编语言),就像他们在机器代码(1G语言)上看到的2G语言一样
是否可能或希望(性能或其他方面)拥有一个可以在其核心而不是当前API调用上执行IL处理的CPU?
类似的技术确实存在于Java中 - ARM做了一系列可以做到这一点的CPU,他们称之为"Jazelle"技术.
但是,.net IL操作码表示的操作只能与堆栈中保存的类型信息结合使用,而不能单独定义.这是与Java字节码的主要区别,并且会使创建合理硬件以执行IL变得更加困难.
此外,IL旨在编译成最终目标.吐出IL的大多数后端都做了很少的优化,而是在最终的编译步骤中保留语义内容以进行验证和优化.即使可以克服硬件问题,结果几乎肯定会比一个体面的优化JIT慢.
总而言之:虽然并非不可能,但与其他架构相比,这将是不成比例的难度,而且收效甚微.
你似乎对CPU的工作方式感到有些困惑.程序集不是与机器代码不同的语言.它只是一个不同的(文本)表示.
汇编代码只是要执行的指令的顺序列表.和机器代码完全一样.CPU支持的每条指令都有一定的位模式导致它被执行,并且它还有一个可以在汇编代码中使用的文本名称.
如果我add $10, $9, $8
通过汇编程序编写并运行它,我会获取add指令的机器代码,获取寄存器9和8中的值,添加它们并将结果存储在寄存器10中.
汇编程序和机器代码之间存在1到1的映射.
也没有"API调用".CPU只是从地址X读取,并将后续位与它理解的所有指令进行匹配.一旦找到与该位模式匹配的指令,它就会执行该指令,然后继续读取下一个指令.
你所要求的是某种意义上的不可能或矛盾.IL代表Intermediate Language,即编译器发出的一种伪代码,但尚未转换为机器代码.但是如果CPU可以直接执行,那么它将不再是中间的,它将是机器代码.
所以问题变成"你的IL代码是一个更好,更有效的程序表示,而不是CPU现在支持的机器代码吗?"
而答案很可能是否定的.MSIL(我认为这是IL的意思,这是一个更通用的术语)旨在便携,简单和一致.每种.NET语言都编译成MSIL,每个MSIL程序必须能够在任何地方转换成任何CPU的机器代码.这意味着MSIL必须是通用的和抽象的,而不是对CPU做出假设.出于这个原因,据我所知,它是一个纯粹的基于堆栈的架构.每条指令不是将数据保存在寄存器中,而是处理堆栈顶部的数据.这是一个很好的干净和通用的系统,但它不是非常有效,并且不能很好地转换为CPU的刚性结构.(在你精彩的小高级世界中,你可以假装堆栈可以自由增长.为了让CPU能够快速访问它,它必须存储在一些有限大小的小型快速片上存储器中.那么如果你的程序在堆栈上推送太多数据会怎样?)
是的,您可以让CPU直接执行MSIL,但您会获得什么?在执行之前你不再需要JIT代码,因此第一次启动程序时,它会更快地启动.除此之外呢?一旦你的MSIL程序已经JIT'ed,它已被翻译成机器代码,就好像它被写在机器代码最初是作为高效运行.MSIL字节码不再存在,只是CPU理解的一系列指令.
事实上,你会回到.NET之前的位置.非托管语言直接编译为机器代码,就像你的建议一样.唯一的区别是非托管代码的目标是由CPU设计人员设计的适合在CPU上执行的机器代码,而在您的情况下,它的目标机器代码是由软件设计人员设计的,易于转换为和从.
这并不是一个新的想法-同样的事情被预测为Java和Lisp的机器甚至被实际执行.
但随着这些节目,它不是真正有用的经验 - 通过设计专用的CPU,你不能从"传统"的CPU的发展中受益,而你很可能不能在自己的游戏中打败英特尔.维基百科文章的一句话很好地说明了这一点:
便宜的台式机很快就能够运行Lisp程序的Lisp比机器还要快,无需使用专用硬件的.
从一种机器代码到另一个在飞行翻译是一个很好理解的问题等共同(现代CISC CPU的甚至做这样的事情,因为在内部他们真的RISC),我相信我们可以假定它正在做的足够有效,避免它不会产生显著的好处 - 而不是当它意味着你必须从领域中传统CPU的状态脱钩自己.
我会说不.
需要在计算机上运行的实际机器语言指令的级别低于IL.例如,IL并没有真正描述应该如何调用方法,如何管理寄存器,如何访问堆栈,或者机器代码级别所需的任何其他细节.
因此,让机器直接识别IL将简单地将所有JIT编译逻辑从软件移动到硬件中.
这将使整个过程非常僵化和不可改变.
通过使机器语言基于机器的功能,以及基于捕获程序员意图的中间语言,您可以获得更好的系统.定义机器的人可以专注于定义有效的计算机体系结构,定义IL系统的人可以专注于表达性和安全性.
如果工具供应商和硬件供应商都必须对所有内容使用完全相同的表示,那么硬件空间或工具空间的创新将受到阻碍.所以,我说他们应该彼此分开.