如何用同一种语言实现一种语言比语言更快?

时间:2012-02-21 14:48:24

标签: python performance jvm pypy language-implementation

例如,如果我用Java 创建 JVM,是否可以使我实现的实现更快比我使用的原始实现 构建这个实现,即使我的实现是在原始实现之上构建的,甚至可能依赖于该实现?

(令人困惑......)

看看PyPy。它是用Python制作的Python的JIT编译器。没关系,但是它如何声称​​更快比它正在使用并依赖的Python的原始实现?

5 个答案:

答案 0 :(得分:10)

您对该语言的语言执行设备感到困惑。

PyPy比CPython更快的原因之一是因为PyPy被编译为完全独立的本机可执行文件,并且不依赖于CPython,也不执行CPython。

然而,如果更高级别的解释器使用更有效的执行策略,那么用同一种语言编写的解释器可以超越一种语言的低效实现,并且在低效的解释器中托管。 / p>

答案 1 :(得分:7)

当然,这是可能的。您的JVM实现可以将Java字节码编译为优化的机器代码。如果你的优化器比你运行Java编译器的JVM实现更复杂,那么最终结果可能会更快。

在这种情况下,您可以在自己的源代码上运行Java编译器,并从此获得更快的编译速度。

你说PyPy是Python的JIT编译器(我自己并不熟悉它)。如果是这种情况,那么它会将Python程序转换为机器代码,然后运行机器代码。另一张海报说,PyPy编译器作为独立的可执行文件运行,与CPython分开。但即使它是在CPython上运行,一旦你的程序被JIT加工到机器代码,并且编译的机器代码正在运行,编译器的性能就不再重要了。编译器的速度只对启动时间有影响。

答案 2 :(得分:2)

PyPy不是用Python实现的Python解释器,它是在RPython中实现的Python解释器和编译器,它是Python的一个受限制的静态类型子集:

  

RPython是Python的一个受限制的子集,可以使用静态   分析。虽然有语言和一些东西的补充   可能会令人惊讶地工作,这是一个粗略的限制列表   应该被考虑到。请注意,有大量的特殊套装   你去的时候会遇到的限制。

真正的速度差异来自于这样一个事实:与将整个程序解释为字节码的CPython不同,PyPy使用just-in-time (JIT) compilation(进入机器代码)来获取RPython部分。

答案 3 :(得分:1)

我认为不可能为该语言的语言实现解释器(称为A),然后在该语言的另一个现有解释器(称为B)之上运行它并执行一个程序(调用此方法) P),并且P在运行中(A在B上运行)比在B上运行的P更快。

A的每次操作都必须至少进行一次B的操作。因此,即使B非常糟糕而且A是最佳的,A在B上运行的事实意味着B的不良将会放慢A。

可以为语言本身的语言实现解释器+ JIT编译器,其中JIT编译器在运行时生成一些其他更快的代码,并且P运行(A运行在B上)比P运行更快B.不是JIT编译的P运行时部分会慢一些(通常情况下很多慢)但是如果JIT编译器成功识别P的“热”部分并且比它更快地执行它们B然后整个系统整体运行得更快。

但这并不是很有趣。也可以为该语言(C)中的语言实现编译器,使用现有编译器(D)编译它,并使新的编译器语言生成比原始编译器生成的代码更快的代码。我希望这不会吓到你;应该清楚的是,D发出的代码的速度只会影响C的执行时间,而不会影响用C编译的其他程序的执行时间。

用他们编译的语言编写编译器已经完成了几十年(例如,GCC是用C语言编写的),并且与我认为你提出的真实问题并不相关;也不是JIT使用自己编译语言。在这两种情况下,底层执行都不是您正在考虑的语言;通常是机器代码。

但是,你的问题来源是误解。 PyPy的Python解释器实际上并没有在Python中实现。 PyPy项目有一个用 RPython 编写的Python解释器。 RPython是Python的一个子集,经过精心选择,可以高效地编译成机器代码;作为一种语言,RPython更像是带有类型推断和缩进块而不是大括号的Java。 PyPy项目还有一个用Python编写的RPython编译器,能够(大部分)自动添加一个JIT编译器到它编译的任何解释器。

当您在生产中实际使用PyPy解释器时,您正在使用从RPython源编译的机器代码解释器,就像您使用CPython解释器时使用从C编译的机器代码解释器一样源代码。如果你在另一个Python解释器之上执行PyPy解释器(你可以这样做,因为有效的RPython代码也是有效的Python代码;但是不是反过来),那么它的运行速度比CPython慢​​很多解释

答案 4 :(得分:-1)

pypy翻译过程在CPython上运行,但是输出是一个.c文件列表(我上次检查了19个文件),然后编译成二进制文件:pypy-c。在运行时,pypy-c与CPython没有任何关系,这就是为什么它可以更快。