title: CbCによるMoarVMの改良 author: Takahiro Shimizu profile: lang: Japanese # 研究目的 - Perl5の後継言語として開発されているPerl6はMoarVMと呼ばれるVMを搭載している. - Perl6はMoarVM,JVM,JavaScript上で動くRakudoと呼ばれる実装と,コンパイラ開発者用のサブセットであるNQPが主な実装となっている. - 現在Perl6及びMoarVMは全体的な速度がPerl5と比較し低下しており,実務として利用できるレベルに達していない. - さらにPerl6の実装自体巨大なcase-switch文など見通しが悪くなっている. - この問題を解決するために現在当研究室で開発している継続を中心にしたContinuation based Cを用いて改良を行う - CbCの設計理念からVMの実装と親和性が高い事も推測できる為,実際にCbCを用いてどのようにVMが実装できるかを検証する # 今週の進捗 * 評価用のスクリプトを作成して計測していました # 評価の例題 * 青空文庫のテキストファイルを1つ読み込んで,かなと漢字を正規表現でキャプチャ,総数をカウントする * 例 `蜜蜂《みつばち》` * 今回はPerl5,Perl6,Rubyで実装しベンチマークを計測した # Perl5実装 ```perl #!/usr/bin/env perl use strict; use warnings; use utf8; use feature 'say'; use Encode; my $filename = "./dogura_magura.txt"; open my $fh,'<:encoding(utf-8)',$filename or die qw/can't open/; my @kana; while (my $line = <$fh>) { chomp $line; while( $line =~ m![、。]?(\p{Han}+)《(\p{Hiragana}+)》!g){ push @kana,[$1,$2]; } } print scalar @kana; ``` # Ruby実装 ```ruby #!/usr/bin/env ruby File.open("./dogura_magura.txt",'r') do |f| hoge = f.read.scan(/[、。]?(\p{Han}+)《(\p{Hiragana}+)》/) p hoge.count end ``` # Perl6実装 ``` #!/usr/bin/env perl6 use v6; my $file = "./dogura_magura.txt"; my $fh = open $file, :r; my $hoge; for $fh.lines -> $line { if ($line ~~ m:g/<[、。]>?(<:Han>+)"《"(<:Hiragana>+)"》"/ ) { say $/[0]; $hoge += $/.conj; } } say $hoge; $fh.close; ``` # 測定結果 ``` sh test.sh perl 6726 real 0m0.209s user 0m0.153s sys 0m0.045s ruby 6726 real 0m0.206s user 0m0.147s sys 0m0.048s perl6 6726 real 0m3.052s user 0m3.176s sys 0m0.057s ``` # 測定結果 ``` zsh test.zsh perl 6726 perl test.pl 0.15s user 0.04s system 95% cpu 0.196 total ruby 6726 ruby test.rb 0.17s user 0.06s system 94% cpu 0.235 total perl6 6726 /Users/anatofuz/workspace/cr/Basic/build_perl6/bin/perl6 test.p6 3.21s user 0.07s system 106% cpu 3.090 total ``` * Perl6ではuser timeが圧倒的にかかっているが,systemは他と同レベル * 生成されたprofilerを見た所JITも吐いているらしい