CPU 是一个通用处理器,计算机领域 定义标准,分层抽象出公共功能之后,CPU 再对这些公共功能进行指令集设计。但是因为计算机发展了几十年,分层设计已经很多了,本文主要探讨,一个新的CPU指令集出来之后,要多久才能被上层语言使用到,例如 java,python 等使用。
第一层的生态,肯定就是汇编语言,因为 汇编语言是 机器码的 可读形式,除开一些汇编器自己定义的语法(伪指令),大部分的汇编指令直接对应某条机器指令。所以要想尽快用上最新的指令集,必须用汇编。
然后,C语言是最接近硬件的,gcc 编译器能把 C程序 翻译成 汇编,汇编就是机器码,机器码就是新的CPU指令集,所以第二层就是编译器翻译的时候怎么使用这些新的指令集。
实际上,任何语言,任何编译器,理论上都能把自己的某些语言特性翻译成新的CPU指令集,但是这个取决于 编译器 的实现难度,C语言的语法简单,所以 gcc 编译器要改进来使用新的CPU指令集就会更快,jvm 如果要用新的指令集,难度会高一些,所以 jvm 在新的CPU指令集的应用上会比 gcc 慢。
通常情况,intel 或者 AMD 发布一个新的指令集的时候,他们会出相关文档,他们会贡献代码给 gcc 或者 linux 社区,让C程序能使用上新款的指令集,所以C语言跟新款指令集可以说是同步更新。如下图:
所以,指令集是机器码,新的机器码就需要新的 汇编指令,汇编指令 跟 C语言如何应用这些新的指令,基本上都是 intel 或者 AMD 提供的代码,有时候 gcc 翻译器不太智能,就需要手写汇编。
所以说,当一个新的指令集出来,你升级一下 gcc 版本,就可能用上这些新的指令集,程序性能也就提高了。
接下来就是更上层一点的语言, python , nodejs,go,php,这些语言多多少少,某些部分是用C语言写的,所以升级 gcc 也会令这些语言提高性能,我知道的就是 PHP 完全是用 C语言写的。这就是 计算机 分层设计的好处。不过高级语言的一个问题是,只能借助GCC编译器来使用新的指令集,一旦GCC编译器不太智能,语言的实现代码就需要嵌入一些手写汇编来提供 PHP 的性能,这个过程只能社区来做,也就是等语言的版本升级,intel 或者 amd 不搞这个,他们只提供 gcc 的支持。
整个生态链的流程图如下:
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。