我知道 Parrot 是一个虚拟机,但我觉得我并没有完全掌握它背后的想法。
据我了解,它是一个用于处理多种语言的虚拟机。这个对吗?
使用虚拟机而不仅仅是解释器有什么好处?
Parrot 到底在做什么让它如此重要?
我知道 Parrot 是一个虚拟机,但我觉得我并没有完全掌握它背后的想法。
据我了解,它是一个用于处理多种语言的虚拟机。这个对吗?
使用虚拟机而不仅仅是解释器有什么好处?
Parrot 到底在做什么让它如此重要?
Parrot是专门设计用于处理多种语言的虚拟机,尤其是动态语言。尽管涉及到一些有趣的技术,但由于它可以处理一种以上的语言,因此它将能够跨越语言边界。例如,一旦它可以编译 Ruby、Perl 和 Python,应该很容易跨越这些界限,让我在 Python 中使用 Ruby 库,Python 中的 Perl 库,所以我喜欢任何组合。
Parrot 起源于 Perl 世界,许多从事此工作的人都是经验丰富的 Perl 人员。Parrot 没有使用显示其时代的当前 Perl 解释器,而是允许 Perl 具有诸如可分发的预编译模块(其他人已经拥有很长时间)和更智能的垃圾收集器等功能。
Chris 介绍了面向用户的差异,所以我将介绍另一面。
Parrot 是基于寄存器而不是基于堆栈的。这意味着编译器开发人员可以更轻松地优化为给定代码段分配寄存器的方式。此外,从 Parrot 字节码到机器码的编译在理论上可以比基于堆栈的代码更快,因为我们运行基于寄存器的系统并且有更多针对它们优化的经验。
Parrot 是一个字节码解释器(未来可能会使用 JIT)。想想 Java 和它的虚拟机,除了 Java(目前)更倾向于静态语言,而 Parrot 从一开始就倾向于动态语言。
另请参阅科迪的出色回答!强烈推荐。
其他人已经给出了很好的答案,所以我剩下的就是解释“动态”语言的实际含义。
在虚拟机的上下文中,这意味着变量的类型在编译时是未知的。在“静态”语言中,类型(或至少它的父类)在编译时是已知的,并且许多优化都建立在该知识之上。
另一方面,在动态语言中,您可能知道变量是否包含容器类型(如数组)或标量(字符串、数字等),但在编译时您拥有的类型信息要少得多。
另一个特点是动态语言通常使类型转换更容易,例如在 perl 和 javascript 中,如果您使用字符串作为数字,它会自动转换为数字。
Parrot 旨在使此类操作变得简单快捷,并允许在编译时不知道类型信息的情况下进行优化。
这是官方鹦鹉维基。
你可以在那里找到很多信息和链接。
Parrot wiki 主页的底部还显示来自Planet Parrot提要聚合器的最新头条新闻。
除了 VM 之外,Parrot 项目正在构建一个非常强大的工具链,以便更轻松地移植现有语言或开发新语言。
Parrot VM 还将为许多强大的 Perl 6 新特性提供其他语言的支持(请参阅官方 Perl 6 Wiki了解更多 Perl 6 信息)。
Parrot 将提供不同语言的模块之间的互操作性,例如,其他语言可以利用将成为巨大的 Perl 6 版本的 CPAN(巨大的 Perl 5 模块存档,Perl 6 将能够通过即将发布的Perl 5.12)。
老实说,我不知道这有什么大不了的。它已经走了很长一段路,但并没有看到太多用处。主要目标语言尚未真正出现,并且在行业专业人士中已经失去了巨大的份额。同时,.Net 等其他解决方案和 Jython 等项目向我们表明,此时此地可以击败任何感知到的炒作。