我正在尝试学习计算机程序是如何工作的并且有这个问题。我经常阅读诸如“C/C++ 比 java 更快”或“Java 和 C#:速度比较”之类的文章。在所有情况下,用任何语言编写的程序都会被翻译成汇编语言。那么,这些语言速度差异的原因是什么。这是否意味着,一种语言的编译器会生成更好更快的汇编代码?
1 回答
有点。
编译器/解释器/编程语言之间的速度不同有几个原因,其中一些与编译器有关,而另一些与语言本身有关。
一些编程语言需要更多的开销。
如果您的语言非常高级,那么与非常低级的 C 相比,它将有更多的开销。(垃圾收集就是一个很好的例子)。它成为一种权衡。我想要快速的二进制文件,还是想要能够轻松编写程序?
语言被设计用来做不同的事情。
例如,PHP 设计用于 Web 服务器,没有人会尝试使用它来创建顶级 fps 游戏。不同的语言更适合不同的任务,并且在某些领域会比在其他领域更快。
并非所有语言都编译为汇编。
虽然 C/C++ 可以编译为汇编,但出于互操作性的原因,像 Java 这样的语言会编译为字节码并针对 Java 虚拟机运行。再一次,这是一个折衷——您以开销为代价获得了可移植性。
此外,C/C++ 甚至不必编译为程序集。例如,enscriptem 最终会将 C/C++ 编译为 Javascript,以便它可以在 Web 浏览器上运行。
编译器不是魔术。
它们是程序,并且像所有程序一样,有错误并且会随着时间的推移而改进(或降级)。我可以在周末尝试编写一个 C 编译器,我敢打赌一百万美元,它的性能会比你能想到的最慢语言的编译器/解释器差几个数量级。
编译器/解释器优化是一个正在进行的研究和研究领域。
每年,研究人员都在撰写和发表有关编译和提高程序运行速度的新方法的论文。如果一种语言较新,它可能还没有时间完全应用所有可用的优化。(看上面)。某些优化可能仅适用于一种编译器/解释器。
因此,总而言之,一种语言的速度是语言本身的内在特征的混合,以及所使用的编译器/解释器/平台的成熟度。
编译器和解释器并不是在所有编程语言之间都保持不变的单一魔法过程——它们都是不同的,有不同的优点和缺点,并且一直处于不断变化的状态。