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が実装できるかを検証する # 研究内容 - MoarVMの主にCase文をCbCに書き換える - ちょっと早くしたい # 今週の進捗 - YAPC::EUで発表されたMoarVMの資料を読んでいました - cf. http://www.jnthn.net/papers/2013-yapceu-moarvm.pdf - MoarVMの実装を読み始めました - mercurialにMoarVMをあげました - オープンソースカンファレンスについては何も出来てないです… - 進捗管理君を書いてました # 6model - Perl6のオブジェクトパターン - `Object` - `Stable` - How(Meta-object) - REPR - WHAT - WHO - Method キャッシュ - 型キャッシュ - `Flags,owner` - `GC stuff` - ``からなる # CbCの書き換え - case文の書き換え - なるべく巨大なものを選択 - spesh以下のファイルが比較的巨大なcase文 - `static void optimize_bb_switch` - `spesh/optimize.c` - 最適化のスイッチ部分 - かなり巨大 - 他には - `containers.c` - `serialization.c` - unicodeの文字処理部分 # 書き換えている箇所 ```c static void optimize_bb_switch(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshPlanned *p) { MVMSpeshCallInfo arg_info; /* Look for instructions that are interesting to optimize. */ MVMSpeshIns *ins = bb->first_ins; while (ins) { switch (ins->info->opcode) { case MVM_SSA_PHI: analyze_phi(tc, g, ins); break; case MVM_OP_set: copy_facts(tc, g, ins->operands[0], ins->operands[1]); break; case MVM_OP_isnull: optimize_isnull(tc, g, bb, ins); break; case MVM_OP_istrue: case MVM_OP_isfalse: optimize_istrue_isfalse(tc, g, bb, ins); break; case MVM_OP_if_i: case MVM_OP_unless_i: case MVM_OP_if_n: case MVM_OP_unless_n: optimize_iffy(tc, g, ins, bb); break; case MVM_OP_if_o: case MVM_OP_unless_o: optimize_object_conditional(tc, g, ins, bb); break; case MVM_OP_not_i: optimize_not_i(tc, g, ins, bb); break; case MVM_OP_prepargs: arg_info.cs = g->sf->body.cu->body.callsites[ins->operands[0].callsite_idx]; arg_info.prepargs_ins = ins; arg_info.prepargs_bb = bb; break; case MVM_OP_arg_i: case MVM_OP_arg_n: case MVM_OP_arg_s: case MVM_OP_arg_o: { ``` # 現在 - case文の書き換えの部分をどうするか悩んでいます ```c //XXX TODO 書き換えてる __code optimize_bb_switch_cbc(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshPlanned *p) { MVMSpeshCallInfo arg_info; /* Look for instructions that are interesting to optimize. */ MVMSpeshIns *ins = bb->first_ins; if (ins){ goto optimize_bb_switch_cbc_ins(ins->next); } } __code optimize_bb_switch_cbc_ins(MVMSpeshIns *ins){ if (ins){ goto optimize_bb_switch_cbc_ins(ins->next); } goto optimize_bb_switch_cbc_ins(ins->next); } ``` # 今週のTODO - case文をどうにかして書き換える - 試しにコンパイル