《操作系统真象还原》——0.16 为什么说汇编语言比C语言快-阿里云开发者社区

开发者社区> 开发与运维> 正文

《操作系统真象还原》——0.16 为什么说汇编语言比C语言快

简介: 不管用什么语言,程序最终都是给CPU运行的,只有CPU才能让程序跑起来。CPU不知道什么是汇编语言、C语言,甚至Java、PHP、Python等,它根本不知道交给它的指令曾经经历过那么多的解释、编译工序。不管什么语言,编译器最终翻译出来的都是机器指令。

本节书摘来自异步社区《操作系统真象还原》一书中的第0章,第0.16节,作者:郑钢著,更多章节内容可以访问云栖社区“异步社区”公众号查看

0.16 为什么说汇编语言比C语言快

首先说这是谬论(有没有想喷我的冲动?大人且慢,请听我慢慢道来)。

不管用什么语言,程序最终都是给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语言被编译成机器指令后,生成的机器指令当然也包括这些额外的部分,相当于多执行了一些“看似没用”的指令,因此会比直接用汇编语言慢。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章