Perl6整个项目过去4年的开发过程: Perl6语言的设计:
在perl6 语言的初始设计的时候,首先成立了一个rfc(Request For Comments)项目,就是向所有关心perl6语言的人邀稿,大家将自己想在perl6语言中想实现的功能写成rfc,然后发给larry wall,larry wall就会想办法在perl6中帮你实现。最后larry花了一整年的时间把各种rfc中描述的特性整合到新的perl6语言中(在开发perl5的时候,他们也是用了快一整年的时间将很多其他语言的优点都整合到perl5中来,Perl过去的版本也都是这样,到处偷学,采纳各种语言好的想法)。
Larry wall收集整理完成rfc后,从2001年起就不断的开始写启示录(Apocalypses,希腊文),描述perl6的新功能。启示录的格式与 larry wall过去写的Programming Perl(相当于perl5的圣经)这本书的格式是一样的,例如:在Programming Perl中的第6章描述的是子程序那么在启世录的第六章也是写的子程序。
由于启示录对于perl6的描述并不是十分详细,而且写作的时间已经过去了3年,所以在2004年起larry开始根据自己的启示录编写纲要(Synopsis),来对相应的启示录章节做总结,并且更加专业的。到了2004年12月,perl6语言的大部分设计就都已经写在一系列的纲要中,而且已经稳定到了可以实际运用的程度。
Perl6的编译器的开发:
在2000年的10月YAS在两个星期中筹集了75000美金来雇用Damian Conway(perl核心开发人员)2001年一年的时间,可以让他专门去开发perl6。
在2002年Damian仍然继续专门负责用perl5来开发一个perl6的rules。
在2003年Damian完成了Perl6::Rules模块,这是一个在perl5上做perl6 rules的一个雏形,是整个perl6编译器的关键部分。但是开发出的产品由于perl5自身的原因,很不成熟,无法稳定运行。
所以3年过去了,没有成熟的perl6到parrot的编译器出现。过去开发perl6编译器的路线是错误的。
在2005年初,根据一份perl6的建议书,perl6的开发计划再从新采用 C 语言实作 Rules 引擎(即为 PGE),来开发perl6的编译器。
2005年2月,唐开始了pugs,另一个独立的perl6编译器的开发。
Parrot的开发:
在2001起由Dan Sugalski负责开始开发parrot。
从2001年8月开始放出代码,第一个版本是0.0.2版,到2005年1月已经放出过14个版本,最新的版本是0.1.2版。
现在已经有些语言可以编译成parrot的字节码。你现在也可以用parrot的汇编语言写一些简单的程序在测试解析器上运行,parrot已经支持绝大多数的数学运算,一些基本的字符操作和一些条件运算。
整个parrot开发速度已经超过了预期,而且还在快速进行当中。当然一些parrot子系统的开发还要进一步加快。
Perl6编译器开发过程中出现的问题:
当最初宣布这个perl6的开发计划时,整个perl6的社区非常的高兴,大家都在等待perl6的成功运行。但是2002-2004三年的时间过去了,没有一支perl6的程序跑得起来。现在parrot的程序其实已经很稳定了,但是perl6语言到parrot的编译器一直没有实现(Parrot现在都可以跑python了)。所以到了2004年的年底大家已经绝望了,感觉perl6的实际运行遥遥无期。在这3年期间larry仍然一篇一篇的写启示录, damian一篇篇的给启示录写注疏(对于启示录中的内容实际在日常使用时的语法),可是却完全没有一个真正的perl6语言实现。
就有一个小笑话:有人问写的perl6的程序从哪里跑?damian会说:“在我脑子里跑”。可是把他从澳洲请过来专门跑perl6程序也太贵了,而且他也不可能夜以继日的专门跑perl6程序。:)Parrot本来设计起来是要跑perl6的,但是现在似乎parrot什么都可以跑就是没法跑 perl6。
关键是问题到底出在什么地方呢?
问题就是当初perl6的设计是要实现自足执行(self-hosting)。对于所谓的自足执行举例来说明:c的编译器是由c写的, c++的编译器是由c++写的,java的编译器有一些是由java写的,c#的编译器是由c#写的。以此类推,非常多的编译程序都是用自己来写自己的编译器,用自己来写自己的执行环境,这就是所谓的自足执行。可是我们现在所熟悉的脚本语言python php perl大都是用c来实现的,就不是自足执行,这带来的问题是你要实现任何新功能都要进入另一个语言去改,而且改了以后会影响全部的语言。你不能用自己的语言来写一个新的功能。所以在设计perl6的时候,larry就说perl6要实现自足执行,perl6要自己执行自己。这就产生了激活问题 Bootstrapping(就像一个人想提着自己的鞋带把自己提到空中,通俗说就是鸡生蛋蛋生鸡的问题)。如果一开始什么也没有的话,就无法激活。
Perl5的时候的语法是用的yacc语法,yacc
网址:
http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
是一个用c写的语法解析器。他能帮你把你写的程序解析成程序能够理解的语法树。
但是这种语法的灵活度比较差。所以在开发perl6的时候,就决定使用perl6 rules来解析perl6的语法,也就是所谓的自足执行。
perl6的rules是对perl5中正则表达式的从新改进,而由于决定用perl6 rules来解析perl6的语法,所以rules在perl6中就占有了核心的地位,而问题就是出在了rules的编写上:
最初的计划是利用 Perl 5 来解决自足执行的问题:先扩充 Perl 5,使其执行于 Parrot 虚拟机器上(透过 B::Parrot 或 Ponie),再以 Perl 5 来实际编写 Perl 6 编译器,最后透过 p5-to-p6 转换器将编译器转译成 Perl 6。不过,虽然Damian编写的Perl6::Rules模块确实在 Perl 5上实现了Rules 的雏型,但对于建构编译器而言仍显得不够成熟。
所以过去3年perl6编译器的开发,走了一条错误的道路,整个开发perl6编译器的计划必须从新修正。