msumimz's diary

RubyにJITコンパイラを実装する個人プロジェクトの情報発信ブログです。

開発方針について

JITコンパイルの生成元を、ASTからYARVインストラクションへ変更した話です。

JITコンパイルを行う元となる情報として、プログラムをパースした結果の構文木(AST)と、それをさらにコード化したYARVインストラクションがあります。今まではASTに基づいてCFGを生成していました。

ASTを使うことには、以下の利点があります。

  • 安定している。文法が変わらない限り、ASTが変わることはあまりありません。YARVインストラクションは最適化の対象なので、いつ変更されるかわかりません。

  • 生成されるCFGを最適化しやすい。YARVインストラクションはMRIの実行エンジンで効率的に実行できるように設計されており、JITコンパイラにとって最適とは限りません。ASTを直接変換した方が効率的なCFGを生成しやすいといえます。

  • 疎結合。ASTは文法の表現であるという意味でYARVインストラクションより抽象的であり、特定実装との結合が弱まります。将来、YARVエンジンを取り除く選択肢も生まれます。

が、ASTからですと、やはり実装がめんどくさかったです。具体的には多重代入やメソッド引数の取り扱いで、これらのCFGをASTから生成するのは大変で、また互換性が維持できているのか確信を持てませんでした。

というわけで妥協しまして、YARVインストラクションからCFGを生成することにします。YARVインストラクションは、多重代入などの難しいところを単純な命令列に解決してくれていますので、実装が楽になります。インストラクションの種類は100弱ありますが、最適化のため細分化されており、同種の命令が多数あるので、見た目ほど多くはありません。

これで作業量が相当減りますので、現在の遅々としたペースでも完成までこぎつけられるのではないかと期待しています。