【问题标题】:LLVM, Parrot, JVM, PyPy + pythonLLVM、鹦鹉、JVM、PyPy + python
【发布时间】:2011-03-16 16:20:01
【问题描述】:

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

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

  • PyPy - 构建 VM 的框架,内置优化的 Python 虚拟机
    所以它很一般的解决方案。该过程如下所列:
    1. dynamic_language_code ->
    2. PyPy 前端 ->
    3. PyPy 内部代码 - 字节码 ->
    4. PyPy 优化 ->
    5. 离开 PyPy 代码并:
      一种。某些 VM(如 jvm)的 PyPy 后端
      湾。 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. 如果我在某处错了,你能纠正我吗

一些补充:

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

澄清

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

【问题讨论】:

  • 这是一个巨大的问题。把它分开,因为大多数看它的人甚至都不愿意阅读它。
  • 这个问题难以阅读和混淆并没有多大帮助。
  • 为什么这么简单?在问题中添加 Rubinius、Jython 和 JRuby、IronPython、Spur、Unladen Swallow 以及您能想到的任何其他内容。如果您得到答案,请与作者配对出版一本关于它的书。
  • 我不是要为 python 寻找移植机制,而是要找到 VM 技术及其协同作用

标签: python jvm llvm pypy parrot


【解决方案1】:

这不是任何人都可以在 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 的动态语言构建更好的平台:@ 987654323@

  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 更有优势。为什么没有其他人这样做我不知道。

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

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

  • 就像我说的那样,LLVM 很难迁移,而且 parrot 也没有那么快(如果我错了,请纠正我)。
  • 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: Python on LLVM)探索了使用 llvm jit 的工作。有些人想在 python 中使用 python,所以他们开始使用 pypy,并且他们的想法接缝工作得非常好(见上文)。 Parrot 也可以,但我没有看到有人尝试过(随意)。


关于一切:

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

【讨论】:

    【解决方案2】:

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

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

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

    顺便提一下,两个 Java 实现是基于 LLVM 构建的——J3/VMKitShark

    你可以考虑上周观看斯坦福大学的PyPy talk;它对 PyPy 的工作方式提供了相当不错的概述。 Carl Friedrich Bolz 的 presentation 也很好地概述了 VM 实施的状态。

    【讨论】:

      【解决方案3】:

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

      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 数据模型而设计的?
      • 据我所知,后端(VM 本身)可以使用它,但前端编译器遇到了问题。艾莉森在这里描述了问题的要点:mail.python.org/pipermail/python-dev/2011-March/109187.html
      • > Python-on-Parrot 由于 Perl 6 和 Python 之间的语义差异导致前端编译过程出现问题,因此该领域未来的努力可能会使用 PyPy 前端来定位Parrot 虚拟机。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 2022-09-23
      相关资源
      最近更新 更多