为何M1芯片能运行X86指令集程序?
要解释这个问题,要先从CPU架构谈起。
CPU架构一般分为精简指令集(RISC)和复杂指令集(CISC),精简指令集通常只支持一些取、存等使用频率很高的基础指令,复杂指令集除了这些基础指令外还支持了很多的复合指令,即一条指令干了很多事情,但复杂指令集性能比精简指令集高得多。所以精简指令集因为简单,造价上也低廉很多。
X86架构的CPU,属于复杂指令集。
Arm架构的CPU,属于精简指令集。
为了更清楚的了解两种架构的区别,这里我们做一个比喻,把两种CPU比作两个厨子。
厨子A年纪比较轻,会做的菜不多,你必须告诉他什么时候倒油,什么时候放盐,最终才能做出菜,优点是工资特别低,很便宜。
厨子B年纪比较大,会做很多菜,你只需要告诉他菜名他就可以做出菜,但是工资很高,很贵。
雇佣了厨师A的饭店,工作流程如下:
餐厅老板告诉厨师A每一个详细的步骤,最终做成了西红柿炒鸡蛋。
再来看看雇佣了厨师B的饭店,工作流程如下:
餐厅老板只需要说出菜名就可以了。
这里厨师A就是精简指令集,只支持一些最基础的指令,厨师B就是复杂指令集,有一些指令看着只有一条,但是CPU做了很多事情。那么两个餐厅的老板就是调度CPU的程序,对于精简指令集的CPU,运算时要用基础指令组合复杂的运算过程。而对于复杂指令集,复杂的运算可以直接使用CPU支持的复杂指令完成。
从去年开始,苹果的电脑开始使用了自研的M1芯片,就好比餐厅的厨子从厨师B换到了厨师A,但是我们之前编写的程序没有变,还是针对厨师B的,那么会出现什么情况呢?
按道理来说,厨师A是完全听不懂经理B的指令的。但是实际情况却是正常运行了。什么原因呢?
这就要说到指令翻译了,经理B发现厨师A听不懂自己的指令,于是请了一位翻译过来,结果如下:
这样,经理B的指令没变,厨师A收到的指令也没变,但是正常出菜了。
这个翻译就是苹果的Rosetta2技术,他是一个跑在苹果系统里的软件系统,x86指令能在M1芯片上运行,就是因为Rosetta2翻译了指令,这才让X86指令的CBrother在M1芯片上正常跑起来。
聊点题外话
为什么叫Rosetta2,因为早期苹果从PowerPC 向x86过渡时候就引入了翻译技术,起名为Rosetta,这次从x86向Arm过渡又旧技重施,直接起名Rosetta2。很佩服苹果的工程师这么随意,感觉就跟我自己写了个测试工程test,创建第二个测试工程时懒得起名字直接叫test2一样,瞬间感觉自己跟国际接轨了。