LLVM, Parrot, JVM, PyPy + python

15
开发一些语言(例如Python)时,有些优化技术在使用LLVM/Parrot方面存在问题。
PyPy、LLVM和Parrot是通用平台开发的主要技术。我理解为:
- PyPy - 用于构建带有内置Python优化VM的框架,因此是一种相当通用的解决方案。其过程如下:
1. 动态语言代码 -> 2. PyPy前端 -> 3. PyPy内部代码 - 字节码 -> 4. PyPy优化 -> 5. 保留PyPy代码并: a. 为某些VM(如jvm)创建PyPy后端 b. 创建一些Kit以制作自己的VM c. 处理/运行PyPy内部代码
- Parrot - 很像PyPy,但没有5.a和5.b,对动态处理进行了一些内部改进(Parrot Magic Cookies)。
PyPy和Parrot都旨在创建一个平台,创建一个共同的动态语言运行时,但PyPy希望更多-也创建更多VM。那么PyPy的意义在哪里?我们为什么需要创建更多的VM?难道不应该专注于一个VM(就像Parrot一样)-因为存在共同的代码级别,无论是PyPy内部字节码还是Parrot的字节码。我认为我们不可能从将代码转换为PyPy字节码到使用PyPy VMs进行全新的转换获得更好的结果。
- LLVM - 我认为这与PyPy非常相似,但没有VM生成器。它是一个成熟、设计良好的环境,与PyPy具有类似的目标(但没有VM生成器),但是它在低级结构和优化/JIT技术上工作得很好。

我认为:LLVM是通用的,但Parrot和PyPy专为动态语言设计。在PyPy/Parrot中更容易引入一些复杂的技术,因为它比LLVM更高级——例如可以更好地理解高级代码并生成更好的汇编代码的复杂编译器(人类无法在合理的时间内编写),那么LLVM的情况又如何?

问题:

  1. 我是正确的吗?是否有任何理由将一些动态语言移植到LLVM而不是例如Parrot?

  2. 我没有看到Parrot上开发Python的活动。这是因为在Parrot上使用Python C扩展无法正常工作吗?PyPy也存在同样的问题。

  3. 为什么其他虚拟机不想转移到LLVM/Parrot?例如Ruby-> Parrot,CLR/JVM-> LLVM。对于他们来说,移动到更复杂的解决方案不是更好吗?LLVM正在进行高度的开发过程,并且有大公司进行投资。

  4. 我知道问题可能在于重新编译是资源,如果需要更改字节码-但这不是强制性的——因为我们可以尝试将旧字节码移植到新字节码中,并且新编译器生成新字节码(尽管Java仍然需要解释自己的字节码-因此前端可以检查它并将其转换为新字节码)?

  5. 例如,在llvm中链接jvm库时有什么问题(如果我们以某种方式将java/jvm/scala移植到llvm)?

  6. 如果我错了,请纠正我

一些添加:

  • Parrot虚拟机对终端用户有何好处
  • LLVM和Java/JVM有哪些区别
  • =============

    澄清

    我想了解所有这些软件的构成方式,以及将一个软件移植到另一个软件中存在什么问题。


    9
    这是一个*非常重要的问题。把它分开来,大多数人看到它甚至都不会在意阅读它。 - Blender
    1
    问题难以阅读和混淆,这并没有太大帮助。 - porgarmingduod
    3
    为什么这么简单?将Rubinius、Jython和JRuby、IronPython、Spur、Unladen Swallow以及你能想到的任何其他内容添加到问题中。如果你得到了答案,就与作者合作出版一本书。 - TryPyPy
    我不是在寻找Python的移植机制,而是关注虚拟机技术及其一致性。 - Robert Zaremba
    3个回答

    25

    我可以尝试进行翻译,这篇Stack Overflow问题中的内容无法被任何人回答,但我会尽力。

    首先,这三个项目解决了哪些问题?

    1. pypy允许您在高级语言中实现解释器,并且您可以免费获得生成的jit。好处在于语言和平台之间没有依赖不匹配的问题。这就是为什么pypy-clr比IronPython更快的原因。 更多信息请参见:http://codespeak.net/pypy/dist/pypy/doc/extradoc.html --> 面向CLI/.NET的Python高性能实现,具有用于动态编译的JIT编译器生成)

    2. LLVM是编译器的低级基础设施。总体思路是拥有一个“高级汇编语言”。所有优化都在该语言上工作。然后有大量的基础设施可帮助您构建编译器(JIT或AOT)。在llvm上实现动态语言是可能的,但需要比在pypy或parrot上实现更多的工作。例如,您不能免费获得GC(有GC可以与LLVM一起使用,请参见http://llvm.org/devmtg/2009-10/ --> vmkit视频)有尝试构建基于llvm更适合动态语言的平台:http://www.ffconsultancy.com/ocaml/hlvm/

    3. 我对Parrot了解不多,但据我所知,他们想要构建一个专门针对动态语言(perl、php、python等)的标准VM。这里的问题与编译为JVM/CLR相同,存在依赖性不匹配,只是小得多。VM仍然不知道您的语言的语义。据我了解,Parrot对用户代码来说仍然非常慢。(http://confreaks.net/videos/118-elcamp2010-parrot

    你的问题的答案:

    我对吗?把一些动态语言移植到LLVM上比移植到Parrot等其他平台更好,有什么原因吗?

    这是一个努力的问题。自己构建并为自己专门设计最终会更快,但需要付出更多的努力。

    我没有看到在Parrot上开发Python的活动。这是因为在Parrot上使用Python C扩展无法工作吗?PyPy也有同样的问题。

    在此阶段,针对Parrot的目标可能不会比pypy更有优势。为什么没有其他人这么做我不知道。

    为什么其他虚拟机不想转移到LLVM / Parrot。例如Ruby-> Parrot,CLR / JVM-> LLVM。他们不移动到更复杂的解决方案是否更好?LLVM正在进行高开发过程,并有大公司投资。

    好的,这个问题中有很多内容。

    • 像我说的,LLVM很难移动,而parrot并不那么快(如果我错了,请纠正我)。
    • Ruby有Rubinius,它试图在Ruby中完成很多工作,并使用llvm进行jit加速(http://llvm.org/devmtg/2009-10/ ->加速Ruby与LLVM)。
    • 有CLR / JVM的LLVM实现,但它们都已经有非常成熟的实现,并且有大量的投资。
    • LLVM不是高级别的。
    我知道问题可能在重新编译资源时出现,如果需要更改字节码,则有必要 - 但这并非强制性的 - 因为我们可以尝试将旧字节码移植到新字节码上,而新编译器会产生新字节码(不过 Java 仍然需要解释自己的字节码 - 所以前端可以检查它并将其转换为新字节码)?
    我不知道问题是什么。
    例如,在 llvm 中链接 jvm 库存在哪些问题(如果我们以某种方式将 java/jvm/scala 移植到 llvm 中)?
    观看我上面提供的 VMKit 视频,了解他们所取得的进展、问题所在以及如何解决问题。
    你能纠正我某些地方的错误吗?
    你写的很多东西是错误的,或者我只是不理解你的意思,但我提供的信息应该会让许多事情变得更加清晰。
    一些例子:
    Clojure
    

    创作者不想实现自己的虚拟机和所有库。那该去哪里呢?由于Clojure是一种新的语言,您可以通过限制许多像Python或Ruby这样的动态内容,在JVM等平台上构建它。请注意保留"{{"和"}}"和HTML标记。
    Python
    

    这种语言无法在JVM/CLR上实现良好的性能。因此,在这些平台上实现Python不会带来巨大的加速效果。静态编译器也无法很好地工作,因为没有太多的静态保证。用C写一个JIT会很快,但是非常难以更改(请参见psyco项目)。使用LLVM JIT可能会奏效,并已由Unladen Swallow项目探索(再次参见http://llvm.org/devmtg/2009-10/--> Unladen Swallow: Python on LLVM)。有些人想要在Python中使用Python,因此他们开始了pypy,他们的想法似乎非常成功(请参见上文)。Parrot也可以工作,但我没有看到任何人尝试过(请随意尝试)。


    关于这个问题:

    我认为你可能有些困惑,我可以理解。请花时间阅读、听取、观看你能获取到的一切。不要给自己太大压力。这个问题有很多方面,最终你会明白它们如何相互配合,哪些是有意义的。即使你已经了解很多,仍然有很多讨论需要进行。问题在于如何实现一种新语言或者加速旧语言,这个问题有很多答案,如果你问3个人,你可能会得到三个不同的答案。


    11

    你试图实现什么?你的问题用词很令人困惑(我知道英语可能不是你的母语)。

    LLVM和PyPy都是成熟且有用的项目,但目前它们之间没有太多重叠。 (曾经,PyPy可以生成LLVM字节码——作为解释器的静态编译——而不是C代码,但它没有提供太多性能优势,并且不再受支持。)

    PyPy允许您使用RPython编写解释器并将其用作描述来生成本机代码解释器或JIT;LLVM是用于构建编译器工具链的C++框架,也可用于实现JIT。 LLVM的优化器、代码生成和平台支持明显比PyPy更先进,但它不适合构建动态语言运行时(请参见Unladen Swallow回顾录以了解一些原因)。 特别是,它不如PyPy的基于跟踪的JIT那样有效地收集/使用运行时反馈(这对于使动态语言表现良好绝对至关重要)。此外,LLVM的垃圾回收支持仍然有些简单,缺乏PyPy的自动生成JIT的独特能力。

    顺便提一下,两个Java实现都建立在LLVM上——J3/VMKitShark

    您可以考虑观看上周斯坦福的PyPy演讲,它提供了一个相当不错的PyPy工作原理概述。 Carl Friedrich Bolz的演示文稿也提供了有关VM实现状态的良好概述。


    7
    主要原因是什么?因为VM设计并非一项已经确定的技术,拥有各种旨在不同目标和目的的VM使得可以尝试各种机制并行而不必串行地尝试所有机制。
    JVM、CLR、PyPy、Parrot、LLVM等都以不同的方式针对不同类型的问题。这类似于Chrome、Firefox、Safari和IE使用自己的JavaScript引擎的原因。
    Unladen Swallow尝试将LLVM应用于CPython,并花费更多时间修复LLVM中的问题而不是做任何特定于Python的事情。
    Python-on-Parrot由于Perl 6和Python之间的语义差异导致前端编译过程出现问题,因此今后在这个领域的努力可能会使用PyPy前端来针对Parrot VM。
    不同的VM开发人员肯定会关注其他人正在做什么,但即使他们借鉴了好的想法,也会在融合之前加入自己的风格。

    谢谢 - 这正是我在寻找的 Python-on-Parrot 的答复。那么 Parrot 更多或少是设计来支持 Perl 数据模型的吗? - Robert Zaremba
    1
    据我所知,后端(VM本身)没问题,但前端编译器对此有些困难。Allison在这里描述了问题的要点:http://mail.python.org/pipermail/python-dev/2011-March/109187.html - ncoghlan
    Python-on-Parrot受到Perl 6和Python之间语义差异的影响,导致前端编译过程中出现问题,因此未来在这个领域的努力可能会使用PyPy前端来定位Parrot虚拟机。 - tadzik

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接