首先说这是谬论(有没有想喷我的冲动?大人且慢,请听我慢慢道来)。
不管用什么语言,程序最终都是给cpu运行的,只有cpu才能让程序跑起来。cpu不知道什么是汇编语言、c语言、甚至java、php、python等,它根本不知道交给它的指令曾经经历过那么多的解释、编译工序。不管什么语言,编译器最终翻译出来的都是机器指令。所以在这一点来说,汇编语言编译器编译出来的机器指令和c编译器编译出来的机器指令无异。
那为什么还说汇编语言更快呢。
我觉得应该说,汇编语言生成的指令数更少,从而“显得”执行的快,并不是汇编语言本身有多少威武霸气,而是因为汇编语言本身就是机器指令的符号化,意思是说,一个汇编语言中的符号对应一个机器指令,它们是一一对应的。所以用汇编语言写程序就相当于直接在写机器指令,汇编语言编译器并不会添加额外的语句,因此汇编语言写的程序会更直接, cpu不会因多执行一些无关的指令而浪费时间,当然会快。
再看看c编译器为咱们做了什么。为了让c程序员更加方便地编程,c编译器在背后做了大量的工作,不仅如此,出于通用性、易用性或者其它方面的考虑,c编译器往往会在背后加入额外的c语言代码来支撑,因此实际的c代码量就变得很大。另外在编译阶段,c代码会率先被编译成汇编代码,然后再由汇编器将汇编代码翻译成机器指令,由于c代码已经变得冗余了,编译出的汇编代码自然也会冗余,自然其机器指令也会多很多。
大多数人愿意用c语言写程序是因为c语言强大且更容易掌握。但这份优势是有代价的。c程序员不用考虑切换栈,不用考虑用哪个段。这些必须要考虑的事情,程序员不考虑,只好由编译器帮着考虑了。而且为了通用性、功能、甚至安全方面的考虑,自然在背后要多写一些代码。就拿打印字符串来说,c语言的printf(),这里面的工作可多了去了,不仅要检查打印的数据类型,还要负责格式,小数点保留位数……而在汇编语言中只要往显存地址处mov一个字符就行了,字符串也就是多几个mov操作而已。您说,c语言为了让开发者用的爽,自己在背后做了多少贡献。
总结:高级语言如c语言为了通用性等等,需要兼顾的东西比较多,往往加入一些额外的代码,因此编译出来的汇编代码比较多,很多部分都是一些周边功能,并不是直接起作用的,不如直接用汇编语言直接写功能相关的部分效果来得更直接,c语言被编译成机器指令后,生成的机器指令当然也包括这些额外的部分,相当于多执行了一些“看似没用”的指令,因此会比直接用汇编语言慢。
举报/反馈

蝙蝠侠联盟

82获赞 24粉丝
我们是来自bat的运维开发
关注
0
0
收藏
分享