RPython以外的选项用于编写带JIT的解释器?

时间:2012-08-25 22:56:24

标签: pypy brainfuck rpython

我对PyPy项目非常感兴趣,但对于下面列出的第一个(但不太知名)的目的:

  • 一套用于为解释语言实现解释器的工具
  • 使用此工具链的Python实现

在以下博客文章http://morepypy.blogspot.com/2011/04/tutorial-writing-interpreter-with-pypy.htmlhttp://morepypy.blogspot.com/2011/04/tutorial-part-2-adding-jit.html中,有一个关于如何使用RPython实现脑力劳动解释器的详细教程,并添加了一个JIT。

但是我在其他地方读过RPython可能很麻烦 - 为动态类型创建的语法突然限制为推断静态类型导致难以理解的编译错误。

所以我的问题是,是否有任何其他项目可以让你像上面的教程一样编写一个脑力翻译解释器/ JIT?或者PyPy是这样做的唯一选择吗?

(旁白):如果存在,一般来说RPython有什么意义?是否只是为了表明Python的子集可以是类型安全的,并且在该子集中实现了Python?在现有的翻译创建工具中做“PyPy”会更有意义吗?

1 个答案:

答案 0 :(得分:10)

  

但是我在其他地方读过RPython可能很麻烦 - 为动态类型创建的语法突然限制为推断静态类型导致难以理解的编译错误。

它不是语法(Python语法与键入的唯一关系是它没有类型注释的位置,而且可以 - 并且在3.0中更改),以及更多关于:

  1. 好的错误消息严重很难,并且随着编译器的其余部分发生变化,它们的代码几乎不可避免地会发生变化。因此,当您处理由少数专家(通常是编写翻译的人)而不是普通公众编写的高度复杂的代码编写代码时,需要付出很多努力。翻译人员与通常的编译器完全不同的事实也无济于事。
  2. 推断所有的事实意味着对类型(对于您作为读者)的唯一洞察来自理解和精神应用翻译者推断类型的过程。这与通常的编译器技术完全不同,并不完全是微不足道的。
  3.   

    所以我的问题是,是否有任何其他项目可以让你像上面的教程一样编写一个脑力翻译解释器/ JIT?或者PyPy是这样做的唯一选择吗?

    我不知道有任何其他尝试从解释器创建JIT编译器的项目。我很自信这个想法是新的,当PyPy的人做到了,所以像这样的其他东西(如果它存在)比RPython更成熟的可能性很小。 有许多项目有助于个人方面。还有一些解决了许多或“所有”这些方面的问题,例如Parrot。但AFAIK没有一个像PyPy那样引人注目的成功故事。

    Parrot是一个用于动态语言的虚拟机,具有多个后端(自我刚刚学习v1.7以来没有JIT,但该架构允许透明地重新引入),并且显然为语言实现者开发了一套丰富的工具。 CLR和JVM为静态面向对象语言提供类似的服务,但我不知道像Parrot那样复杂的工具。

    但是,不是你编写一个解释器,而是定义了IR(实际上是几个),你的工作是将语言编译为IR(并根据VM可以理解的方式定义内置功能)。在这方面,它与RPython编写解释器的方法不同。此外,与其他虚拟机一样,如果您的语言的某些方面严重影响到IR,则会被搞砸。需要与VM的服务完全不同的东西吗?玩得开心(并且遭受可怕的表现)。需要特定于语言的优化(对任意IR无效,不能提前完成)?告别那些性能改进。 除了玩具语言,我不知道Parrot上有完整的语言实现。由于他们并不经常吹嘘表现,我担心他们目前在这方面很弱。

    LLVM(其他人提到)以及许多其他代码生成器/后端只是一个因素。您必须编写一个完整的静态编译器,将您的语言降低到机器代码的抽象级别,而不是解释器。这可能是可行的,但肯定是完全不同的。

      

    如果存在,一般来说RPython有什么意义?

    “编写JIT编译器很难,让去购物编写口译员。”好吧,它可能最初是“我们想在Python中使用Python,但它太慢了,我们不想从头开始编写语言”。但是现在,RPython本身就是一种非常有趣的编程语言,因为它是世界上第一个将JIT编译器作为一流的编程语言(不是真正意义上的第一类函数,但足够接近)语言构造

      

    在现有的翻译创建工具中做“PyPy”会更有意义吗?

    为了成为元,进行研究并展示它的作用,我赞成当前的方法。直到JIT生成器工作的那一刻,你可以在任何语言中使用静态编译,C-ish性能潜力和宏(或者添加他们称之为“翻译方面”的其他方式) - 尽管这些是罕见的。但是,为整个 Python语言编写性能良好的(JIT或非编译器)编译器已经多次证明对人类来说太难了。我会说编写一个解释器更难以理解,然后在单独的JIT编译器代码库中再次再次,并且仍然优化任何东西。