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が実装できるかを検証する # 今週の進捗 * 仙台行ってきました * Perl6のプロファイラと巨大なcase文を発見しました # RubyKaigi * Rubyの言語自体の話が多かったです * 型とJITと処理系のトークが多かったです * ついにRubyもASTを操作出来る用になりました * Ruby3ではGuildという実装でより簡単な並列化もサポートしていくそうです * JITに関してはRubyのJITは一度Cに変換するらしいです * Cコードで拡張を書いてJITするよりRubyをJITした方が現段階では早いらしい * C language is dead * ぱるすさんと宮國さん(gongo)さんとエンカウントしました * Rubyのコードも比較で読んでいます # プロファイラ nqpで実行する際に `--prpfile` を指定するとhtmlでプロファイル結果が生成される - `./nqp --profile examples/hello_world.nqp` - 最適化 - `./nqp --profile-compile examples/hello_world.nqp` - 最適化される # MoarVMの処理 - MVMInstancとかいう構造体に全ての情報が入っている - MoarVMが実際にインタプリタとして走っているのは`MVM_interp_run`という関数らしい. - これはスレッド毎に用意されるらしい - 定義自体は `src/core/interp.c`に書かれている - `MVM_interp_run`の後DISPATCHというマクロで`NEXT_OP`というマクロに応じて処理を行っている - これはオペランドリストとswitch文が同じオーダーで書かれているので最適化しやすいらしい - これがMoarVMのバイトコードを一対一対応しているので5000行のcase文が生成されている - 状態遷移自体はgotoで書かれているがかなりの量を動いており探しづらい # OSC * **特に何もしてない!!**