我知道ASM基本上是最快的,但是是什么让HLLs比ASM更慢呢?我所说的抽象是指,例如在C++中,你有一个类,数据需要存储在类中存储的内容,它派生的内容,私有/公共访问器,以及其他东西。在编译这段代码时,是否有实际的汇编代码可以计算出有关类的信息?就像CPython是建立在C之上的,所以在运行时比C有更多的抽象和指令要运行,我所说的是真的吗?我想我已经回答了我自己的问题,但我希望得到一个比我更有经验的人的答案。
编辑:我知道Python是被解释的,但是如果它被编译了,它不是仍然比C慢吗?
发布于 2011-07-08 00:27:20
这是一个宽泛的问题。
从根本上说,编译语言就像ASM一样被翻译成机器指令(操作码) (ASM也是一个抽象层)。一个好的编译器实际上很可能比一个普通的ASM编码器的结果更好,因为它可以检查大量的代码,并应用大多数程序员无法手工完成的优化规则(排序指令以实现最佳执行等)。
在这一点上,所有编译的语言都是“平等的”。然而,有些人比其他人更平等。编译后的代码执行得有多好基本上取决于编译器的好坏,而不是取决于特定的语言。某些特性,如虚方法,会导致性能损失(上次我检查虚方法是使用函数指针表实现的,尽管我的知识在这里可能会过时)。
解释语言在程序执行时从根本上检查人类可读的语言,本质上需要在程序运行时编译和执行阶段的等价物。因此,它们几乎总是比编译后的对应程序慢一些。智能实现将增量地将部分代码解释为已执行(以避免解释从未命中的分支),并缓存结果,以便代码的给定部分只解释一次。
还有一种折衷方法,人类可读的语言被翻译成伪代码(有时称为P-code或字节码)。这样做的目的是为了对代码进行紧凑的表示,既可以快速解释,又可以跨多种操作系统移植(您仍然需要一个程序来解释每个平台上的P-code )。Java就属于这一类。
发布于 2011-07-08 00:20:27
实际上,你的前提不一定是真的。
许多人会说,一个好的优化编译器可以胜过手工编写的汇编。
其他人可能会说,像Java和.Net这样的即时编译器可以利用运行时启发式,因此性能优于任何静态编译的代码。
在编译器和解释器中,我向您保证,语言的级别有多高与运行时效率之间不一定存在任何关联。非常高级的语言可以产生非常高效的代码。
我的..。
发布于 2011-07-08 00:23:12
根据经验,语言越抽象(通常对程序员来说越方便),它就会越慢。C编译器将生成汇编代码,这就是它如此依赖于系统的原因。像Java这样的语言在虚拟机中运行,而虚拟机本身就是一个经过编译的程序。但这种抽象通常会减慢速度。
但这并不是说没有例外。正如paulsm4所说,高级语言最终可能比低级语言更有效,因为它们可以利用各种模式(我不知道细节)。
https://stackoverflow.com/questions/6618611
复制相似问题