今天突然想到 解释型语言(Java python)这些语言是如何 解释执行的呢。
毕竟C语言是直接编译成机器码 直接对应的是 CUP的指令集
cpu架构-指令集-编译器-程序 环环相扣,紧密联系。所以你就会听到说Windows操作系统只能够运行在X86架构的CPU上,不能运行在Power 或 ARM 上,因为指令集不同,又所以就有了“Wintel”联盟。所以你也可以看到有的编译器是有硬件厂家提供的,比如Intel就提供C和C++的编译器,这样编译出来的程序就能更好的利用硬件的性能。那为什么又会听到 linux可以运行在不同架构的CPU上呢?那是因为linux是开源的,因此就可以将它移植到不同的CPU平台上,然后在用相应的编译器编译,就得到了可以在该CPU上运行的二进制代码了。而Windows是封闭的,得不到源代码,而MS自己又没有移植到别的CPU平台上的打算,所以当然就只能在X86上运行了。(BTW,X86也是性能最好的CPU之一,而Windows对性能要求较高,所以MS当然也就不愿意移植了)
回头在看解释型语言 的 解释器功能是把他们的 对应的字节码 翻译成机器码。
那机器码是如何传递给CPU的呢。如下C语言就内嵌了机器码 把机器码存在内存里面就行了,调用一下当成函数地址就OK了
所以反思的到 解释型语言也是这么干的吧。
下面数组的机器码其实就是反汇编之后的找到的一个函数代码
#include <stdio.h>
const unsigned char uBinCode[] = {
0x55,
0x89,0xE5,
0x8B,0x45,0x0C,
0x8B,0x55,0x08,
0x01,0xD0,
0x5D,
0xC3,
};
int main(int argc, char argv[]) {
printf(“1 + 1 = %d\n”,((int ()(int,int))uBinCode)(1,1));
printf(“5 + 5 = %d\n”,((int (*)(int,int))uBinCode)(5,5));
return 0;
}