title: CbCによるMoarVMの改良 author: Takahiro Shimizu profile: lang: Japanese # 研究目的 - Perl5の後継言語として開発されているPerl6はMoarVMと呼ばれるVMを搭載している. - Perl6はMoarVM,JVM,JavaScript上で動くRakudoと呼ばれる実装と,コンパイラ開発者用のサブセットであるNQPが主な実装となっている. - 現在Perl6及びMoarVMは全体的な速度がPerl5と比較し低下しており,実務として利用できるレベルに達していない. - さらにPerl6の実装自体巨大なswitch-case文など見通しが悪くなっている. - この問題を解決するために現在当研究室で開発している継続を中心にしたContinuation based Cを用いて改良を行う - CbCの設計理念からVMの実装と親和性が高い事も推測できる為,実際にCbCを用いてどのようにVMが実装できるかを検証する # 今週の進捗 * Perl6のnqpで遊んでいました * いくつか記事を発見しました * perl5の `perl-build` モジュールにPull Request送りました * lldbでMoarVMを読んでいました # Perl6の過去の研究 * ある程度高速化はされているらしい * [助成金貰って高速化が検討されていた](http://news.perlfoundation.org/2017/11/perl-6-performance-and-reliabi-4.html) * インライン展開周り * インラインclosureが実装された * dead codeを削除 * ...etc # MoarVMのオペコード * `src/core/ops.h` で定義されている * `add_bb_facts` ではこのオペコードを使いswitch文を生成している * トータル868個ほどのオペコードが設定されている ``` 4 #define MVM_OP_no_op 0 5 #define MVM_OP_const_i8 1 6 #define MVM_OP_const_i16 2 7 #define MVM_OP_const_i32 3 8 #define MVM_OP_const_i64 4 9 #define MVM_OP_const_n32 5 10 #define MVM_OP_const_n64 6 11 #define MVM_OP_const_s 7 12 #define MVM_OP_set 8 13 #define MVM_OP_extend_u8 9 14 #define MVM_OP_extend_u16 10 15 #define MVM_OP_extend_u32 11 ``` # debug用のMoarVM * gccでデバッグしよとすると相変わらず死ぬ ``` ...skipping... from /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Headers/IconsCore.h:23, from /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Headers/LaunchServices.h:22 from /System/Library/Frameworks/CoreServices.framework/Headers/CoreServices.h:39, from /System/Library/Frameworks/ApplicationServices.framework/Headers/ApplicationServices.h:23, from 3rdparty/libuv/src/unix/darwin-proctitle.c:33: /System/Library/Frameworks/Security.framework/Headers/Authorization.h:193:7: error: variably modified 'bytes' at file scope char bytes[kAuthorizationExternalFormLength]; ^~~~~ In file included from /System/Library/Frameworks/Security.framework/Headers/AuthSession.h:32, from /System/Library/Frameworks/Security.framework/Headers/Security.h:43, from /System/Library/Frameworks/CoreServices.framework/Frameworks/OSServices.framework/Headers/CSIdentity.h:43, from /System/Library/Frameworks/CoreServices.framework/Frameworks/OSServices.framework/Headers/OSServices.h:27, from /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Headers/IconsCore.h:23, from /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Headers/LaunchServices.h:22 from /System/Library/Frameworks/CoreServices.framework/Headers/CoreServices.h:39, from 3rdparty/libuv/src/unix/fsevents.c:49: /System/Library/Frameworks/Security.framework/Headers/Authorization.h:193:7: error: variably modified 'bytes' at file scope char bytes[kAuthorizationExternalFormLength]; ^~~~~ In file included from /System/Library/Frameworks/CoreGraphics.framework/Headers/CGContext.h:21, from /System/Library/Frameworks/CoreGraphics.framework/Headers/CGBitmapContext.h:9, from /System/Library/Frameworks/CoreGraphics.framework/Headers/CoreGraphics.h:11, from /System/Library/Frameworks/ApplicationServices.framework/Headers/ApplicationServices.h:35, from 3rdparty/libuv/src/unix/darwin-proctitle.c:33: /System/Library/Frameworks/CoreGraphics.framework/Headers/CGPath.h:391:15: error: expected identifier or '(' before '^' token typedef void (^CGPathApplyBlock)(const CGPathElement * element); ^ /System/Library/Frameworks/CoreGraphics.framework/Headers/CGPath.h:393:53: error: unknown type name 'CGPathApplyBlock' CG_EXTERN void CGPathApplyWithBlock(CGPathRef path, CGPathApplyBlock CF_NOESCAPE block) ^~~~~~~~~~~~~~~~ make: *** [3rdparty/libuv/src/unix/fsevents.o] Error 1 make: *** Waiting for unfinished jobs.... make: *** [3rdparty/libuv/src/unix/darwin-proctitle.o] Error 1 ``` # やるべきこと * 具体的に遅い箇所を計測した方がいい * どうやって計測を図るか * コンパイラ構成論の資料を読んでオブジェクトパターンを理解しておく # perl6の小ネタ * スマートマッチャー演算子 `~~` ``` > 'hoge' ~~ Str True ``` * 継承一覧を取り出すには `.^mro` ``` > 'hoge'.^mro ((Str) (Cool) (Any) (Mu)) > ``` * `^name` か `.WHAT` でクラスを取得できる ``` > 'hoge'.^name Str ``` * `my @env_path = qx/echo $PATH/.split(':'); # Unix-based systems` * `q:x` か `qq:x` でシェルを実行できる ``` my @env_path = qx/echo $PATH/.split(':') [/usr/local/opt/qt/bin /Users/anatofuz/src/google-cloud-sdk/bin /Users/anatofuz/.pyenv/versions/3.6.5/bin /Users/anatofuz/.pyenv/shims /Users/anatofuz/.pyenv/bin /Users/anatofuz/.nodebrew/current/bin /Users/anatofuz/.rbenv/shims /usr/local/opt/gpg-agent/bin /Users/anatofuz/.plenv/shims /Users/anatofuz/.plenv/bin /usr/local/bin /usr/local/sbin /usr/bin /bin /usr/sbin /sbin /Library/TeX/texbin /opt/X11/bin /usr/local/opt/qt/bin /Users/anatofuz/src/google-cloud-sdk/bin /Users/anatofuz/.pyenv/versions/3.6.5/bin /Users/anatofuz/.pyenv/shims /Users/anatofuz/.pyenv/bin /Users/anatofuz/.nodebrew/current/bin /Users/anatofuz/.rbenv/shims /usr/local/opt/gpg-agent/bin /Users/anatofuz/.plenv/shims /Users/anatofuz/.plenv/bin /Users/anatofuz/workspace/go/bin /Users/anatofuz/workspace/go/bin ] ``` # perl-build * plenvで使用しているモジュール * cpanからPerlの最新バージョンを取得する * search.cpanがshut downするのでmeta.cpanに移行したがhttps通信になったのでtarが入手できなくなった * その部分のパッチを書いて送りました # 来週の予定 * 明日から仙台に行ってきます * 日曜日には戻ってきます * OSCのネタとスライドをそろそろ作成していきます * cbc周りの情報がほしい!!