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が実装できるかを検証する # 今週の進捗 * Perl5のプロファイラを用意 * ついでにPerl5もlldbで追ってみていました * nqpのメソッド一覧を発見しました * nqpでプログラミングの為にテキスト読んでいます # nqp * [Opcode list](https://github.com/perl6/nqp/blob/master/docs/ops.markdown)を見つける * 謎だったメソッド周りが定義 * `nqp::`にメソッドが生えているのでこれを使う # Perl5 ## Profiler * 最近は `Devel::NYTProfile` が良いらしい * `cpanm Devel::NYTProfile` ``` perl -d:NYTProfile hoge.pl nytptofhtml --open ``` ## lldb * git clone git@github.com:Perl/perl5.git * ./Configure -DDEBUGGING=-g -Doptimize=-O0 * 中々難解であまり良くわからなかった… # NQP * moarVMのプロファイラを利用可能 * 他のプロファイラに関しては[Wanted Modules](https://github.com/perl6/perl6-most-wanted/blob/master/most-wanted/modules.md)にも書かれているのでおそらく無い… * `nqp::time_n()`でnqpで時間が計測出来るのでこれを使うのも単純には良さそう * 残りは[スライド](http://edumentab.github.io/rakudo-and-nqp-internals-course/slides-day1.pdf)読み勧めてました # NQPの文法 * Perl6のベースなので制約がわりと多い * 基本束縛で変数を定義していく * `my $hoge := "foo";` * 配列のpop/pushは専用のメソッドを経由して行う ``` my @hoge := ('1','2','3'); nqp::push(@hoge,4); ``` # 今週のTODO * 評価用のプログラムを作成 * 極力モジュールを使わない * NQPで一回書くかどうか * CbCをJITで吐き出したいのでJITの調査 * 確かLuaJitを使っていたような… * [YouTube](https://www.youtube.com/watch?v=N5_drt7TEqE) * [Controlled Stack Hacking for the MoarVM JIT Compiler](http://brrt-to-the-future.blogspot.com/2018/06/controlled-stack-hacking-for-moarvm-jit.html)