LLVM、鹦鹉、JVM、PyPy+python

2024-04-29 22:57:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

  • PyPy-使用内置优化VM for python构建VM的框架
    所以这是一个非常普遍的解决方案。流程如下所示:
    1. 动态语言代码->;
    2. PyPy前端->
    3. PyPy内部代码-字节码->
    4. PyPy优化->
    5. 离开PyPy代码并:
      a、 某些虚拟机(如jvm)的PyPy后端
      b、 自制虚拟机的som工具包
      c、 处理/运行PyPy内部代码

我说的对吗?对于python,有优化的VM吗?特别是在默认情况下,有一个内置的VM用于优化PyPy代码(步骤5.c)——这是针对python的,每种语言处理都可以停止并运行它?

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

ParrotPyPy都是为了创建一个创建公共动态语言运行时的平台而设计的,但是PyPy希望创建更多的VM。
皮比的感觉在哪里?为了创造更多的虚拟机?专注于一个VM(如parrot中的VM)应该不会更好——因为有一个通用的代码级别——PyPy内部字节码或parrot内部字节码。 我认为,将PyPy字节码转换为使用PyPy VMs创建的新字节码再好不过了。

  • 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. 如果我在某个地方错了,你能纠正我吗

一些附加:

=====

澄清

我想知道所有这些软件是如何组成的,以及将一个软件移植到另一个软件有什么问题。


Tags: 代码gt语言字节软件vm动态jvm
3条回答

这不是任何人都能回答的堆积如山的问题,但我给它一个极小的机会。

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

  1. pypy允许您用高级语言实现一个解释器,您可以免费获得一个生成的jit。好的方面是,langauge和平台之间没有依赖性不匹配。这就是pypy clr比IronPython快的原因。 这里有更多信息:http://codespeak.net/pypy/dist/pypy/doc/extradoc.html-->;Python for CLI/.NET的高性能实现,动态生成JIT编译器)

  2. llvm是编译器的低级基础结构。总的想法是举行一次“高级别大会”。所有的视力减退都是在语言上起作用的。还有大量的基础设施可以帮助您构建编译器(JIT或AOT)。在llvm上实现一种动态语言是可能的,但是需要做更多的工作,然后在pypy或parrot上实现它。例如,您不能免费获得GC(可以与LLVM一起使用GC请参见http://llvm.org/devmtg/2009-10/-->;vmkit视频)有人试图构建一个更好的基于LLVM的动态语言平台:http://www.ffconsultancy.com/ocaml/hlvm/

  3. 我不太了解parrot,但据我所知,他们希望构建一个专门用于动态语言的标准虚拟机(perl、php、python…)。这里的问题与编译到JVM/CLR的问题是一样的,存在依赖项不匹配,只是一个小得多的问题。VM仍然不知道langauge的语义。当我倒立的时候,parrot对于用户代码来说还是很慢的。(http://confreaks.net/videos/118-elcamp2010-parrot

你问题的答案是:

Am I right? Is there any reason that porting some dynamic language would be better to llvm then to for example Parrot?

这是一个努力的问题。建立你自己和你的专业最终会更快,但它是更多的努力。

I haven't see the activity on development python on Parrot. Is it because using python C extensions doesn't work on parrot? The same problem is in PyPy.

瞄准鹦鹉(在这一点上)不太可能比侏儒有好处。我不知道为什么没人会这样做。

Why other VMs don't want to move to LLVM / parrot. Eg ruby -> parrot, CLR/ JVM -> LLVM. Wouldn't be better for them to move to more sophisticated solution? LLVM is in high development process and has big companies investing in.

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

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

I know the problem might be in recompile are resources, if there is need to change bytecode - but it is not obligatory - as we can try to port old bytecode to new one, and new compilers produce new bytecode (never less java still need to interpreted own bytecode - so the frontend can check it and translate it to new bytecode)?

我不知道问题是什么。

What are the problems with linking for example jvm libraries inside llvm (if we port somehow java/jvm/scala to llvm)?

请观看上面链接的VMKit I视频,视频显示他们取得了多大的进步,问题是什么(以及他们是如何解决的)。

Can you correct me if i'm wrong somewhere

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


一些例子:

Clojure

创建者不希望实现自己的vm和所有库的所有工作。那么去哪里呢?由于Clojure是一个新的langauge,您可以通过限制python或ruby这样的语言所拥有的大量动态内容,以一种在JVM这样的平台上运行良好的方式来构建它。

Python

这种语言(实际上)无法在JVM/CLR上很好地工作。因此,在这些平台上实现python不会带来巨大的加速。静态编译器也不会很好地工作,因为没有太多的静态保证。用C编写JIT会很快,但很难更改(参见psyco项目)。使用llvm jit可以工作,并且由Unladen Swallow项目(同样是llvm上的http://llvm.org/devmtg/2009-10/-->;Unladen Swallow:Python)进行探索。有些人想在python中使用python,所以他们开始使用pypy,并且他们的idea seams工作得非常好(见上文)。鹦鹉也可以工作,但我没有看到任何人尝试过(感觉自由)。


关于一切:

我想你很困惑,我能理解。慢慢读,听,看你能得到的一切。不要给自己压力。这里面有很多部分,最终你会明白什么是合二为一的,什么是合理的即使你知道很多事情,仍然有很多讨论可以做。问题是在哪里实现一种新的语言或者如何加快一种旧的语言有很多答案,如果你问三个人,你可能会得到三个不同的答案。

主要原因?因为虚拟机设计不是一种固定的技术,而且有不同的目标和目的的多种虚拟机,使得各种机械装置可以并行试验,而不是全部串联试验。

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。

不同的虚拟机开发人员当然会关注其他人在做什么,但即使他们提出了好的想法,他们也会在合并之前把自己的想法放在上面。

你想实施什么?你的问题措辞很混乱(我知道英语可能不是你的母语)。

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实现状态的良好概述。

相关问题 更多 >