单说执行效率,不说开发效率。
首先,很明显,汇编是最高的,不需要解码,没有任何限制。
然后是C/C++等等直接静态编译到汇编的语言,它们的效率等同汇编,之所以是第二等是因为编译器本身产生的结果可能和【你自己】想要的结果有细微差异,从而降低效率——当然,虽然编译器越来越先进,这种事情越来越少了。
关于C++的编译期计算等等的问题,我们等会儿来说。
下一级别,估计有点超出你的想象了,是Java、JavaScript和LuaJIT/PyPy这些,也就是运行时编译到汇编的语言,它们的效率大概只比C/C++之类低50%的样子——也就是说,C做事需要1s,它们估计也就需要2s,问题是,现代的程序,大部分都是碎片化执行的,真正在CPU上面耗费的时间不多,因此,实际的包含大量IO的程序而言,其实效率上差多。
再下一个级别就是Lua、Python(这里是CPython)这种了,字节码执行,自带虚拟机,效率上大概比C慢出50倍这个数量级。但是某些操作如果语言直接内置(比如Python的列表合成),那效率就和C的相同,有些操作你手动搞,效率就比C慢50倍,因此语言的设计极其重要,要保证需要手动搞的东西都是对效率影响不大的。
再下一个级别就是内存里面直接放解析树,没有字节码的。比如Ruby,大概比C慢200倍左右,恩,不详细说了。
最后一个级别是连解析树都没有,直接一行一行分析完了就执行,比如VimL,大概比C慢1000倍(三个数量级)的样子。
执行效率上,就是这么个等级了。
再说说C和C++,很多人有误解,模板提高效率啊,constexpr提高效率啊什么的。其实,这些C编译器也可以做优化,只是难度会很高——没有语言级别的直接提示。比如说,gcc有一个优化已经出现很久了,就是自动内联函数指针——如果发现几次调用的时候,给出的函数指针都一样,那么直接把这个函数指针固化到函数里面,做成一个特殊的static函数给你调。这多么像C++的模板!我的意思是,不要迷信语言特性,C和C++的基本原理都是完全把一种概念模型上的表述换成另外一种表述,这种转换中的效率提升往往并没有那么明显,但的确是有的。它们的确是效率相差不大的两门语言。
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |