cpan

お約束どおり、Language::BF 0.010.02 を Release したのでお知らせします。CPANの更新を待てない人はこちらから。

404 Blog Not Found:brainfu.k - perl と javascript による処理系
CPANに上げられるよう、moduleとして実装してみました。

前の記事からの拡張としては、compilerをつけたことがあります。といってもこんだけ。

sub compile($){
    my $bf  = shift;
    my $src = <<'EOS';
sub { 
my (@data, @out) = ();
my $sp = 0;
EOS
    for my $op ( @{ $bf->{code} } ) {
        $src .= {
            '<' => '$sp--;',
            '>' => '$sp++;',
            '+' => '$data[$sp]++;',
            '-' => '$data[$sp]--;',
            '.' => 'push @out, $data[$sp];',
            ',' => '$data[$sp] = shift @_;',
            '[' => 'while($data[$sp]){',
            ']' => '}',
          }->{$op}
          . "\n";
    }
    $src .= <<'EOS';
return @out
}
EOS
    my $coderef = eval $src;
    return $@ ? $@ : $coderef;
}

実に簡単ですね。そうなのです。compilerの方がtrivialなのです。

ただ、実際にbenchmarkしてみると、速度的にはほとんど変わりません。

use strict;
use warnings;
use Language::BF;
use Benchmark ':all';

my $bf = Language::BF->new(<<EOC);
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<
+++++++++++++++.>.+++.------.--------.>+.>.
EOC

cmpthese(
    timethese(
        0,
        {
            compiler    => sub { $bf->reset->run(0) },
            interpreter => sub { $bf->reset->run(1) },
        }
    )
);
Benchmark: running compiler, interpreter for at least 3 CPU seconds...
   compiler:  4 wallclock secs ( 3.30 usr +  0.01 sys =  3.31 CPU) @ 12035.65/s (n=39838)
interpreter:  3 wallclock secs ( 3.07 usr +  0.01 sys =  3.08 CPU) @ 11820.45/s (n=36407)
               Rate interpreter    compiler
interpreter 11820/s          --         -2%
compiler    12036/s          2%          --

やっぱCに落とす機能も。あまりにtrivialだけど。

Dan the Brainfu.ker

追記:

0.02では、,のbugfixと、Cに落とす機能が加わってます。