为什么解释语言缓慢?
-
18-09-2019 - |
题
我读有关的利弊的解释性语言,一个最常见缺点是缓慢的,但为什么是程序中解释的语言缓慢?
解决方案
机程序使用用于运行它们的处理器的书面说明中运行。
解释型语言只是,“解释”。指令的一些其它形式被读出,并解释,由运行时,这反过来执行本机机器指令。
它认为这种方式。如果你可以在你的母语交谈的人,会比一般具有含到你的语言翻译成其他语言的听者明白的解释工作得更快。
请注意什么,我上面描述的是当语言是在翻译运行。有翻译多国语言,有也为构建本机指令本地连接体。减速(然而的该尺寸可能是)仅适用于解释上下文。
所以,这是不正确稍微说了的语言的速度很慢,而它的上下文中运行它是缓慢的。
C#不是一种解释语言,即使它采用中间语言(IL),这是即时编译为本地指令被执行之前,因此它具有一些相同的速度减少,但不这一切,但我敢打赌,如果你建立了C#或C ++一个完全成熟的解释,它会运行速度较慢以及。
和仅仅是明确的,当我说“慢”,也就是当然的一个相对的术语。
其他提示
所有的答案似乎错过这里真正重要的一点。它的细节如何“解释”代码被实现。
解释的脚本语言是较慢的,因为它们的方法,对象和全局变量空间模型是动态的。在我看来,这是一个脚本语言的真正的定义不在于它被解释的事实。这就要求每个访问变量或方法调用很多额外的哈希表查找。而其最主要的原因,他们在多线程的所有可怕的,使用GIL(全局解释器锁)。这是查找大部分的时间都花在。这是一个痛苦的随机内存查找,当你得到一个L1 / L2高速缓存未命中好痛。
谷歌的JavaScript Core8是如此之快和简单的优化靶向几乎C速度:他们采取对象数据模型为固定,并创建内部代码来访问它像一个本地编译的程序的数据结构。当一个新的变量或方法被添加或去除,然后整个编译的代码被丢弃,并再次进行编译。
该技术是在德语/史基佛曼纸“Smalltalk的-80系统的高效实现”很好的解释。
为什么PHP,Python和Ruby都没有做,这是非常简单的问题回答:该技术是非常复杂的实施
。和只有谷歌有足够的资金用于JavaScript来支付,因为快速的基于浏览器的JavaScript解释是他们自己的数十亿美元的业务模式的基本需求。
想想interpeter作为机器的模拟器你不碰巧有
简单的回答是已编译的语言由机器指令而解释那些由程序(写在编译语言)执行的处理,其读取源或字节码,然后基本上模拟一个假想机器的将如果机器已经存在直接运行该程序。
想想解释运行时为你不碰巧实际上有各地目前机器的模拟器。
这显然是由JIT(准时)编译器的Java,C#等都有复杂。从理论上讲,他们只是为“AOT”(“一次”)编译器为好,但实际上这些语言运行慢和需要有大约使用了内存和时间在程序运行时编译器的阻碍。但是,如果你在这么说任何的是,这里准备吸引狂热的JIT维护者谁坚持有JIT和AOT之间没有理论上的区别。如果你问他们,如果Java和C#都一样快,C和C ++,然后他们开始找借口和那种冷静一下。 : - )
因此,C ++在游戏中的可用计算的最大量总是可以投入使用完全规则。
在桌面和网络,信息化的任务通常是由更抽象的或至少不太汇编语言做,因为电脑是非常快,问题是计算量不大,所以我们可以花一些时间在诸如目标时间到市场,程序员的工作效率,可靠的存储,安全的环境,动态模块,和其他功能强大的工具。
这是一个很好的问题,而是应该制定在我看来有点不同,例如:“为什么?解释语言比编译语言慢”
我认为它是解释语言是慢本身常见的误解。解释型语言的不慢,但,根据使用情况,可能是慢比编译版本。在大多数情况下,解释型语言实际上是足够快!
“快足够”,加上从使用语言像Python过,例如,在生产率的提高,C应是足够的理由考虑的一个解释语言。此外,您还可以随时快速C实现替换您的解释程序的某些部分,如果你真的需要速度。但是,有一次,测量第一和确定速度是真的问题,然后进行优化。
环100倍,内容的循环中解释的100倍到低级别的代码。
没有缓存,不再使用,没有优化。
简单地说,一个编译器解释一旦成低级别的代码
编辑,以后的评论:
- JIT是 编制 代码, 不解释。这只是汇编后不前
- 我指的是经典的定义,没有现代的实际实现中
在除了其他的答案有优化:当你编译程序,你通常不会在意它需要多长时间来编译 - 编译器有大量的时间来优化你的代码。当你解释的代码,它有非常快速地做了一些更聪明的优化可能会无法进行。
一个简单的问题,没有任何真正的简单的答案。底线是所有计算机真的“理解”是二进制指令,这是什么样的C“快”的语言被编译成。
然后有虚拟机,这理解不同的二进制指令(例如Java和.NET),但那些必须由一个刚刚在编译器(JIT)在飞行中为机器指令翻译。也就是说几乎一样快(在某些特定情况下,因为JIT具有比代码是如何被使用的静态编译器的更多信息甚至更快。)
再就是解释型语言,这通常也有自己的中间二进制指令,但翻译的功能很像在它与每一个指令,以及如何执行它的情况下,大的switch语句循环。这在底层机器代码的抽象水平是缓慢的。还有更多的指令参与,在解释这样做,甚至简单的事情函数调用长链,它可以说是内存和缓存都不能有效作为的结果。
但解释型语言通常是足够快的他们用于何种用途。 Web应用程序通过IO(通常是数据库访问),这比任何解释慢的顺序不变地结合。
有作为一种解释语言没有这样的事情。任何语言都通过翻译或编译器来实现。这些天大多数语言具有使用编译器实现。
这表示,口译员通常是比较慢的,因为他们需要处理的语言或东西,而接近它在运行时将其翻译成机器指令。编译器执行此转换为机器指令只有一次,之后它们被直接执行。
解释语言需要读取和执行时解释你的源代码。编译代码很多这种解释是(在编译时)提前完成。
很少有当代脚本语言的是的 “解释” 这些天;他们通常被编译上的苍蝇,或者成机器代码或一些中间字节码的语言,它是(更有效)在虚拟机中执行。
说了这么多,他们是慢,因为你的CPU执行每个“代码行”更多的说明,因为许多指令都花在理解代码,而不是做一切该行的语义提示!
阅读本优点和缺点解释语言
这是在后您的问题相关的想法。
由解释器执行的是 通常要少得多高效然后 定期执行程序。它发生 因为每个指令会 应该通过解释在 运行时或在较新的 实施方式中,代码必须是 编译成中间 表示每次执行之前。
出于同样的原因,它的速度较慢通过翻译交谈比母语。或者,读取与字典。这需要时间来翻译。
更新:不,我没有看到,我的答案是一样的接受一个,在一定程度上; - )
对,解释语言是缓慢...
然而,考虑以下。我不得不解决的一个问题。我花了4分钟解决在Python的问题,该程序把0.15秒运行。然后我试图把它写在C,和我有0.12秒的运行时间,我花了1小时写。这一切都因为解决问题的问题的实际方法是使用哈希表和哈希表反正为主的运行环境。
维基说,
解释代码比运行编译代码,因为在解释者必须每次执行时间分析每个语句在该程序,然后执行所需的操作,而编译的代码只是执行确定的固定范围内的动作速度较慢由编译即可。这个运行时间分析,被称为“解释开销”。访问变量也是较慢以解释,因为标识符存储位置的映射必须在运行时而非在编译时间反复进行。
请参阅此 IBM文档一>,
解释的程序必须在每次执行它时被转换,有一个更高的开销。因此,一种解释语言通常更适合于比预定请求特设请求。
在爪哇虽然它被认为是一种解释语言,它使用 JIT 一>(刚刚在时间)汇编,其利用缓存技术来缓存字节码编译缓解上述问题。
在JIT编译器读取许多区段的字节码(或全部,很少)和动态编译它们成机器代码,从而程序可以运行得更快。这是可以做到每个文件,每个功能或者甚至在任意的代码片段;该代码可以当它是即将执行被编译(因此命名为“刚刚在时间”),然后高速缓存和重新使用之后无需重新编译。