15

开发某些语言有什么问题,例如 python 用于一些 LLVM / Parrot 的一些优化技术。

PyPy、LLVM、Parrot是常用平台开发的主要技术。
我看到这样的:

  • PyPy - 用于构建 VM 的框架,其中包含针对 python 的优化 VM
    所以它是非常通用的解决方案。该过程如下所列:
    1. 动态语言代码->
    2. PyPy 前端 ->
    3. PyPy 内部代码 - 字节码 ->
    4. PyPy 优化 ->
    5. 留下 PyPy 代码和
      :某些 VM(如 jvm)的 PyPy 后端
      b. som Kit 制作自己的虚拟机
      c. 处理/运行 PyPy 内部代码

我对这个过程是正确的吗?对于 python 有优化的 VM?特别是默认情况下,VM 中内置了优化的 PyPy 代码(步骤 5.c)——它适用于 python,并且每种语言处理都可以在那里停止并由它运行?

  • Parrot - 很像 PyPy,但没有 5.a 和 5.b ?动态处理的一些内部改进(Parrot Magic Cookies)。

ParrotPyPy都旨在创建一个创建通用动态语言运行时的平台,但 PyPy 想要更多——也需要创建更多 VM。
PyPy 的意义在哪里?为了什么我们需要创建更多的虚拟机?不应该更好地专注于一个虚拟机(比如在鹦鹉中)——因为有一个共同的代码级别——PyPy 内部字节码或 Parrot 字节码。我认为我们无法将 PyPy 字节码转换为新创建的 PyPy VM。

  • LLVM - 我认为这与 PyPy 非常相似,但没有 VM 生成器。
    它是成熟的、精心设计的环境,具有与 PyPy 相似的目标(但没有 VM 生成器),但使用的是低级结构和出色的优化/JIT 技术

将其视为:LLVM是通用的,但Parrot和 **PyPy* 是为动态语言设计的。在 PyPy / Parrot 中更容易引入一些复杂的技术——因为它比 LLVM 更高级——比如复杂的编译器,它可以更好地理解高级代码并产生更好的汇编代码(人类无法在合理的时间内编写),然后LLVM 之一?

问题:

  1. 我对吗?是否有任何理由将某些动态语言移植到 llvm 比移植到 Parrot 更好?

  2. 我还没有看到 Parrot 上开发 python 的活动。是因为使用 python C 扩展对 parrot 不起作用吗?PyPy 也有同样的问题

  3. 为什么其他 VM 不想迁移到 LLVM / parrot。例如 ruby​​ -> parrot,CLR/ JVM -> LLVM。他们转向更复杂的解决方案不是更好吗?LLVM 正处于高速发展过程中,并有大公司投资。

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

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

  6. 如果我在某个地方错了,你能纠正我吗

一些补充:

==============

澄清

我想弄清楚所有这些软件是如何组成的——将一个软件移植到另一个软件有什么问题。

4

3 回答 3

25

这不是任何人都可以在 stackoverflow 问题中回答的问题,但我给它一个最小的镜头。

首先这3个项目解决了什么问题?

  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 仍然不知道您的语言的语义。据我了解,鹦鹉对于用户代码仍然很慢。( http://confreaks.net/videos/118-elcamp2010-parrot )

你的问题的答案:

我对吗?是否有任何理由将某些动态语言移植到 llvm 比移植到 Parrot 更好?

那是努力的问题。建立你自己的一切并为你专门化最终会更快,但它需要更多的努力。

我还没有看到 Parrot 上开发 python 的活动。是因为使用 python C 扩展对 parrot 不起作用吗?PyPy 中也存在同样的问题。

以 parrot 为目标(此时)不太可能比 pypy 更有优势。为什么没有其他人这样做我不知道。

为什么其他 VM 不想迁移到 LLVM / parrot。例如 ruby​​ -> parrot,CLR/ JVM -> LLVM。他们转向更复杂的解决方案不是更好吗?LLVM 正处于高速发展过程中,并有大公司投资。

好的,这个问题有很多东西。

  • 就像我说的那样,LLVM 很难迁移,鹦鹉也没有那么快(如果我错了,请纠正我)。
  • Ruby 让 Rubinius 女巫尝试在 ruby​​ 和 llvm 中做很多事情(http://llvm.org/devmtg/2009-10/ --> 使用 LLVM 加速 Ruby)。
  • 在 LLVM 上有一个 CLR/JVM 的实现,但它们都已经有了非常成熟的实现,并且有很大的投资。
  • LLVM 不是高级别的。

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

我不知道问题是什么。

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

观看我在上面链接的 VMKit 视频,该视频显示了他们走了多远以及问题是什么(以及他们如何解决它)。

如果我在某个地方错了,你能纠正我吗

你写的很多东西都是错误的,或者我只是不明白你的意思,但我链接的东西应该让很多东西更清楚。


一些例子:

Clojure

创建者不想要实现他自己的虚拟机和所有库的所有工作。那么去哪里呢?由于 Clojure 是一种新语言,因此您可以通过限制诸如 python 或 ruby​​ 之类的语言所具有的许多动态内容,以一种在 JVM 等平台上运行良好的方式构建它。

Python

该语言无法(实际上)更改为在 JVM/CLR 上运行良好。因此,在这些上实现 python 不会带来巨大的加速。静态编译器也不能很好地工作,因为没有很多静态保证。用 C 编写 JIT 会很快但很难更改(请参阅 psyco 项目)。Unladen Swallow 项目(再次http://llvm.org/devmtg/2009-10/ --> Unladen Swallow:LLVM 上的 Python)对使用 llvm jit 进行了探索。有些人想在 python 中使用 python,所以他们开始使用 pypy,并且他们的想法接缝工作得非常好(见上文)。Parrot 也可以,但我还没有看到有人尝试过(随意)。


关于一切:

我想你很困惑,我能理解。花点时间阅读,聆听,观看你能得到的一切。不要给自己压力。这有很多部分,最终你会看到什么是如何组合在一起的,什么是有意义的,即使你知道很多,仍然有很多讨论可以做。问题是在哪里实施新语言或如何加速旧语言有很多答案,如果你问 3 个人,你可能会得到三个不同的答案。

于 2011-05-02T22:11:58.213 回答
11

你想实现什么?您的问题措辞非常混乱(我意识到英语可能不是您的第一语言)。

LLVM 和 PyPy 都是成熟、有用的项目,但在这一点上实际上并没有太多重叠。(在某一时刻,PyPy 可以生成 LLVM 字节码——它被静态编译为解释器——与 C 代码相反,但它没有提供太多的性能优势并且不再受支持。)

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

顺便提一下,两个 Java 实现是基于 LLVM 构建的——<a href="http://vmkit.llvm.org/" rel="noreferrer">J3/VMKit 和Shark

你可以考虑观看上周斯坦福的PyPy 演讲;它对 PyPy 的工作原理提供了相当不错的概述。Carl Friedrich Bolz 的演示文稿还很好地概述了 VM 实施的状态。

于 2011-03-16T20:59:19.820 回答
7

主要原因?因为虚拟机设计不是一种固定的技术,拥有多种不同目标和目的的虚拟机允许并行尝试各种机制,而不是必须串联尝试所有机制。

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 开发人员当然会密切关注其他人在做什么,但即使他们提出了好的想法,他们也会在整合它们之前对它们进行自己的调整。

于 2011-03-16T20:25:34.973 回答