RT @http://www.mail-archive.com/[email protected]/msg01462.html
Parrot 是用 C 编写的面向动态类型的语言的虚拟机。在性质上,和 JVM 1 和 CLR 2
属于同一类东西,但后两者面向静态类型的语言(虽然 Python 这样的动态语言也有 JVM
的 port,但无疑是很低效很 ugly的做法),且在字节码级别上是面向栈的。Parrot 中是
和真实世界中的 x86 指令集一样面向寄存器的,当然,Parrot中的寄存器自然也是虚拟的
,数量可以根据需要无限增加,所以编译器的寄存器分配算法和真实的 x86 编译器是很不
同的 3. Parrot项目启动的初衷是运行 Perl 6 程序,但无疑雄心勃勃的 Perl 人希望
Parrot 还能同时运行 Python/Ruby/Tcl/Awk/…等其他动态类型的语言。
Pugs 是 2005 ~ 2008 年间最成熟的 Perl 6 编译器/解释器实现,由唐凤领导,使用
Haskell 语言编写。Perl 6语言的“官方测试集”就是在 Pugs 项目中孕育而生的。Pugs 的
实现并不依赖于 Parrot 虚拟机。
Rakudo 从一开始就被设计为针对 Parrot 虚似机的 Perl 6 编译器实现,它与 Pugs 的关
系是平行的,都属于 Perl 6 语言的实现。它起步的时间远早于 Pugs,但在早期受 Parrot
自身以及 PGE 4 / TGE 5 等编译器开发工具链的限制,进展非常迟缓(它当时只被称
为 Parrot 目录树中的 languages/perl6 而已)。但 Rakudo 在最近两年开始发力,现在
已经实现了非常多的 Perl 6 语言特性。
按照 Larry 的说法,Perl 5 是一种实现定义的语言。我们使用的 Perl5 解释器便定义了
这种语言的全部,没有人能轻易地构造出第二个 Perl5 解释器实现,而大骆驼一书只不过
是一种事后的补充说明而已,远不能作为 Perl 5 的语言规范。所以 Larry 希望在 Perl
6 中纠正这个“错误“,让 Perl 6 成为一种由规范定义的由设计良好的测试集验证的语言
,不再有”官方的实现“。任何人做的东西只要通过了 Perl 6 官方测试集,就承受是合法
的 Perl 6 实现,呵呵。有趣的是,Perl 6 项目的一大副产品是为 Perl5 提供了一个我
们现在看到的比较像样的测试集 6。
Perl 6 是一门全新的语言,Larry 说只保留了 Perl (5) 的精神 ;)
-
Java Virtual Machine (Java 虚拟机) ↩︎
-
Microsoft .NET 平台上使用的 Common Language Runtime ↩︎
-
曾经在 Parrot 的官方文档中鼓吹 Parrot 的这种面向寄存器的设计可以复用几十年来在现代优化编译器研究领域内的寄存器分配算法的成果,这显然是有问题的,所以后来这一论断从文档中删除了。 ↩︎
-
Parrot Grammar Engine, Perl 6 正则引擎的 Parrot 实现。 ↩︎
-
Tree Grammar Engine, 基于树形属性文法的 AST(抽象语法树) 变换引擎,由 Parrot 的 PIR 语言实现,多和 PGE 组成一工具链。 ↩︎
-
当然,Perl 6 语言中不少很酷的特性也被新版的 Perl5 实现所采纳。 ↩︎