メソッド呼び出しを実装しました
対応したのはMRIの内部でNODE_CALLと呼ばれる、レシーバを指定した形式です。そのうち、引数が単純でブロックを取らないもの限定です。足し算なども内部ではメソッド呼び出しですので、例えば以下のコードが動きます。 def m 1 + 2 …
ローカル変数参照を実装しました
ローカル変数参照を実装しました。以下のコードが実行できます。 def m if true a = 10 else a = 20 end a end precompile Object, :m puts m # => 10 LLVMは優秀なの…
if文を実装しました
ついでにtrue/false/nilリテラルも実装しています。 以下のコードが動くようになりました。 def m if 1 10 else 20 end end precompiled Object, :m puts m # => 10 実…
最初のJITコンパイラを実装しました
JITコンパイラの最初のバージョンが動くようになりました。このバージョンのminirubyには、Object#precompileというメソッドが追加されています。これは precompile <クラス>, <メソッド名(シンボル)> とい…
clangのアセンブリをIntel形式で出力する
clangで-Sオプションをつけてアセンブリを出力する場合、既定でAT&T形式になります。これをIntel形式にするには以下のオプションを使えばよいようです。 clang -S -o - -mllvm -x86-asm-syntax=int…
githubにssh keyを設定
githubにpushしようと思ったところ、なぜかid/password認証に失敗します。githubのヘルプページを見ると、gitはバージョン1.7.10以上を使えと書いてあります。Cygwinのgitはバージョン1.7.9で、このためで…
githubにプロジェクトを作成
今まではwww.ruby-lang.orgからv2.1.0のソース一式をtar.gz形式でダウンロードして手元でいろいろいじっていたのですが、そろそろコードを書き始めています。今後のバージョン追随のためにも、MRIのソースコードとはなるべく…
MRIソースコードを読む その1 メソッド定義の実装(下)
vm_method.c:rb_add_method()ですが、エラーチェックしながらデータを設定しているだけです。せっかくですのでJITコンパイラを実装するために必要そうな知識を整理しておきます。メソッド定義に関係するデータ構造は、rb_m…
MRIソースコードを読む その1 メソッド定義の実装(中)
さて、(上)に続いてメソッド定義の実装を見ていきます。core#define_methodの実体はvm.c:m_core_define_method()です。 #define REWIND_CFP(expr) do { \ rb_threa…
MRIソースコードを読む その1 メソッド定義の実装(上)
自分向けの備忘録として、MRIのソースコードを読んだ結果メモを記録しておきます。以下のソースコードは def m 1 end 次のISeqにコンパイルされます。 == disasm: <RubyVM::InstructionSequence…
Ruby Under a Microscope買いました
他の方のレビューでは、ソースコードと結びつけた記述は少ないそうですが、スタックフレームの取り扱いやブロックの処理などのイメージをつかむのに役立ちそうです。Ruby Under a Microscope: An Illustrated Gui…
RubyでASTやIRを表示する
JITコンパイラを書くには、まずRubyの生成するASTを調べる必要があります。そのためのツールとして、以前に読んだ「Rubyソースコード完全解説」でnodedumpという外部ライブラリを使っていました。 じゃあそれを使おうと思ってググって…
デバッガにブレークするメソッドを定義する
MRIのコードを読む準備として、デバッガにブレークするメソッドをObjectクラスに定義します。 minirubyだけでは外部ライブラリを構築できませんので、object.cに直接書いてしまいます。 まず、以下のコードをobject.cのI…
Visual Studioプロジェクトを作成する
Windows版のRubyをVisual Studioでビルド・デバッグできるようにVisual Studioのプロジェクトを作成します。 ソース配布ではnmakeを使ってビルドするようになっていますので、Makefileを解析して同じビル…
ごあいさつ
このブログは、RubyにJITコンパイラを実装する個人的なプロジェクトの情報を発信するブログです。ちなみにまだコードは1行も書いていません。 プロジェクトの目標は次の通りです。 本家より高速に動作するRubyエンジンを実装する。 本家との1…