怎样为Perl 5打补丁
Submitted by editor on Thu, 06/26/2008 - 13:21.
in
怎样为Perl 5打补丁
by chromatic
作者:chromatic
翻译:17LAMP.NET jianxin
Perl 5 change #33858 从perl 6增加了三个新的特性到Perl 5.12。随着最近在虚拟机上使用动态语言的兴趣的增加,我想讨论一下一个特性是怎样出现的和它是怎样工作的一定会很有趣--即使你是一个快乐的Perl使用者或者是另一种动态语言的使用者并且没有打算过深入你最喜欢的语言,这些细节是很有启发性的。
下面是它是怎样实现的。
Perl 6新的三个特性是共同的“ yada yada yada”运算符,就像 List Prefix Precedence in Perl 6 Synopsis 3 中描述的那样。它们允许你编写简短的编译代码但是它们不会做任何的特别的事情。对于开发和自底向上编程这是很用的。你可以写:
sub main
{
do_this();
do_that();
finish_up();
}
sub do_this { ... }
sub do_that { ... }
sub finish_up { ... }
...这样这个程序就会编译并运行。在Perl 6中这些代码是有效的。(现在在Perl 5中也是有效的了。)当然,当Perl在运行时遇到...时,它将会抛出一个异常告诉你你正在试图执行一个未生效的代码。它公在陈述的级别,所以你可以写:
sub do_this
{
my $arg = shift;
return do_something_fun( $arg ) if defined $arg;
...;
}
...丢弃错误处理,如果你还没有准备好把这个代码做得完全的健壮。那是一个很容易得到的错误处理机制。
在一个虚拟机上给一种语言增加一个新的语法特性大体上需要两个部分。首先,你需要修正剖析器使它可以支持新的特性。如果你够幸运的话,这回很容易并且你将不会碰到剖析器冲突,因为它们很难解决。然后你需要修正生成的字节码或者optree 或者 AST来产生你想要的效果。如果你够幸运的话,你可以执行在虚拟机已经支持的操作。
我是一半的幸运。修正剖析器还算容易,虽然在真正丑陋的Perl 5代码中有潜在的冲突。修正 optree也是相当的容易。
如果你想调到前头阅读一下补丁,尼克忽略任何事情除了 perl/perly.y和 perl/toke.c。 任何其他的事情是生成的剖析器或者文档和练习。这仅仅占用18行代码,包括空格和括号。我会在明天就是它是怎样工作的。
- editor's blog
- Login or register to post comments

