可以通俗详细地解释一下为啥C的效率比Java高
用一块木头,雕刻成一个杯子,那么这个杯子的容量不会超过木头的体积。
■网友
谢邀。
首先说明一个问题:在说“低级语言”时,我们并不是指“这个语言好沙雕/没有有用的功能”,毕竟大多数语言都做到了图灵完备,在表达能力方面是彼此等价的。一般来说低级语言是指面向机器设计的二进制机器码和汇编语言这种基本没有可读性的玩意。考虑到C语言非常贴近机器的一些设计(甚至还支持内嵌汇编代码),可能在非常非常广义的角度上来讲,C也勉强是一种低级语言,但一般来说,我们还是叫它高级语言的。
同时有趣的是,C语言刚好是题主所提问题的反例。C作为高级语言,在编译和优化以后生成的汇编代码基本和专业人员(虽然这种人越来越少了)手写的汇编速度相近,甚至快于一些新手写的代码(优势主要在使用机器特殊的优化指令和进行一些比较难手动完成的优化)。所以说低级语言效率比高级语言高并不一定成立。事实上,只要经过完美的设计和(超级烧脑烧时间)的debug,大多数高级语言编译器应该都能生成接近手写效率的汇编代码。
另外,从题主给的例子来看,题主想问的问题应该是为什么编译型语言比解释性快。我们先打个比方:想象你有一只机械臂,靠给一堆电线通电断电来控制各个关节的运动(实在不懂机械臂原理,就这样瞎BB了,见谅)。现在你要设计一块电路接在外面的电线上,让这个机械臂拿起一只杯子。
其实你有两个选择:
1.仔细研究一下拿起杯子需要哪些操作,然后做一块依次给那些电线通电断电完成“拿杯子”操作的电路。
2.干脆做一块能把人话转化成对应信号的AI电路(比如贾维斯),然后对它吼:“把杯子拿起来!”
方案一对应着编译:把拿杯子的指令先转化(编译)成产生电信号的电路,再把它接在机械臂上(运行)。注意这一方案在拿杯子时工作的只有产生电信号的电路,而转化人话转电信号是事先完成了的。
方案二对应着解释:直接接一块能把人话转化(解释)成电信号的复杂电路,再说出指令(运行)。注意这一方案拿杯子时转化人话的电路是在运行的,而且命令是运行时下的。
所以编译器把一部分工作提前完成了,不像解释器要现场翻译,自然快一些。
【可以通俗详细地解释一下为啥C的效率比Java高】 但是解释器的优点在于你可以临时变卦,喊“把杯子摔在地上!”,但如果是编译器,那么对不起,请重新做一块新电路。
■网友
这个很好回答,底层语言贴近硬件,移植越低。高层语言远离硬件,移植越高。这就决定了效率的问题,因为对于高层语言,需要检查硬件,判断硬件,还要匹配文件系统,不要看c语言没多少行,编译之后就很大,原因在于此。而低级语言本身是贴着硬件写的,按硬件说明写,容量小,所以效率高。
■网友
先吐槽一下,C语言什么时候变成低级语言了……简单地来说,你要和说X语言的人说话(机器码),一般情况下C语言是事先找一个专业的译者把要说的话全翻译成X语言(编译到机器码),而Java是同声传译(解释执行)或者把部分常用的句子记下来用(JIT),所以会有效率上的差别。
推荐阅读
- 用泡沫箱来养多肉老桩?只要我们把细节做好,同样可以养出状态来
- ■养宠物真可以缓解孤独吗?一起来听听“铲屎官”的心声吧!
- 用EagleGet下载时总提示无效URL地址,无法下载,而用迅雷、QQ旋风则可以,咋回事~
- 银行的数据中心可以跳槽去互联网公司吗
- 银行高管的薪酬结构图表最新的,请问在哪里可以收集
- 医院|感染艾滋病毒初期有哪些征兆?可以自行检查吗?共用马桶会传染吗
- 电动车第一线|电动车配多大的电池,可以跑100公里以上?师傅告诉你真实答案!
- 有啥方法,网站,项目可以自己练习计算广告学
- 学图像处理有哪些不错的书推荐
- 宝马7系|可以说,这款数字化高尔夫,让人看到了未来大众所有车型的样子