您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
不同编程语言最终生成的机器码是否一样?
机器码,编译器,不同不同编程语言最终生成的机器码是否一样?
发布时间:2019-02-08加入收藏来源:互联网点击:
不同编程语言最终生成的机器码是否一样?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
这个问题问的很好。同样的程序段在操作系统、CPU位数、编绎设置等一致的情况下,结果是一样的。否则,最终的机器码是不相同的。
VS系列,PYTHON,一般的C语言,再编绎时,都最终生成ASM汇编语言,进而以机器码的形式,让计算机识别并最终执行(以下在32位系统下编绎)。
此处,我们把a,b两个整数相加,送给整数c,在VS运行环境下,我们看一下c=a+b的机器码、汇编、VS编码的结果,如下图:
从上面可以看出,不论a,b赋值如何,a+
b一>c的代码只有三行,而且是一致的,每一个变量占据4个字节。mov eax,dword ptr [edp-4],mov eax,dword ptr [edp-8]等,标准的X86系列宏汇编语言。可以用下表查到相应的机器码。
这就说明,在同样的运行环境下a+b一>c的汇编码、机器码是一致的。
同样是32位的a+b一>c,在8位、16位等单片机机上,结果是不一样的。因为指令系统不一样。
也就是说,在硬件不一致时,机器码是截然不同的。如下图为单片机的编码形式,可以看出MOV A,Rn为11 E8,而MOV A,data 则为21 E5,差异非常大。
总结:在写软件的,首先要考虑运行环境,PC机X86系列还是单片机系列,是在16位、32位还是在64位的操作系统下运行,支持动态还是静态库,支持高速运行还是优化运行等等,在编绎时都要选择好。
只有以上的选项一致了,那么同样的代码,其机器码是绝对一致的。
回答于 2019-09-11 08:43:50
一样,但是又不一样!
这是一个挺有意思的问题!我也有个很有意思的回答。
一样的是大家都是生成的机器码,调用硬件指令,完成最后的计算。
在同一个硬件平台,可用的指令集是相同的。比如X86平台,所有编译器可用的机器码指令集,都是相同的。在ARM平台也是如此。
也就是说不同的编译器,生成的机器码的基本元素,在同平台是相同的。
————————————————————
不同的是最终机器码的排列顺序!
虽然是同一套指令集,但是同一个问题有各种各样的解法。
一千个读者就有一千个哈姆雷特,就像你让多个程序员,都用C语言写一个排序算法,在不抄袭,纯原创的前提下,这些程序员写的算法代码一样的可能性非常小。
不同编译器编译的过程也是不同的。越复杂的程序,最终的机器码差异越大。比如说一个简单的两个数相加,最终都调用同一条硬件指令来完成。可能机器码的差异会比较小。
但是尽管如此简单的程序,不同编译器生成的机器码完全一样的可能性也很低。比如说使用的寄存器可能不同,程序初始化和结束的过程也可能不同等等。
————————————————————
总体来说呢,作为高级语言程序员,一般情况下不需要去关心编译器的机器码细节。只有在一些极端情况下,会根据编译器的一些特性,针对性的编写优化代码,以获得更佳的性能体验。比如jvm调优,针对硬件缓存机制的代码调优等等。
如果你已经到这个级别了,那么恭喜你,你成为大神了!
回答于 2019-09-11 08:43:50
先给出答案,对于同样一段程序,不同编程语言最终生成的机器码是不一样。
而且,即使是同一编程语言的同一段代码,使用不同的编译器编译出的机器码也很有可能是不一样的,这一点可以分成几种情况来分析。
假如我们有这样一段C代码:
int main(void)
{
int a=1;
int b=2;
int c=0;
c=a+b;
return c;
}
代码非常简单,我们按照架构不同、编译器不同来分别看一下生成的机器码有何区别。
1.X86架构下使用GCC编译。
我们用x86架构下的GCC进行编译,然后使用ojbdump反编译二进制文件,可以得到一系列的汇编代码,我们截取最主要的main方法看一下对应的机器码:
这就是X86架构下的机器码,注意指令长度、指令名称和寄存器。
2.鲲鹏架构下使用GCC编译。
同样还是这段代码,我们在华为鲲鹏服务器上编译后再反编译,得到对应的机器码如下:
可以看到,和X86架构下是完全不同的,鲲鹏服务器基于ARM架构,最终机器码的指令长度、指令名称和寄存器和X86架构都不同。
2.鲲鹏架构下使用毕昇编译器编译。
同样还是这段代码,同样在华为鲲鹏服务器上编译后再反编译,但是这次使用的是华为的毕昇编译器,得到对应的机器码如下:
这段机器码和上一个GCC编译的很像,但是在使用的寄存器、指令顺序有很小的区别,两者不是完全一致的。
回答于 2019-09-11 08:43:50
不一样的。
即便是同样的源代码,用不同版本或者同样的版本的编译器,用不同编译选项生成的代码也是不一样的。
商业版本的编译器的代码一般来说质量更高,免费的就不好说了,看开发人员的技术水平啦。
上一篇:如果认真学习肯定会近视吗?
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |