お約束どおり、Language::BF 0.010.02 を Release したのでお知らせします。CPANの更新を待てない人はこちらから。
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に落とす機能が加わってます。
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。