kenjuの日記

About Programming, Mathematics and Security

『Rubyのしくみ -Ruby Under a Microscope』の読書メモ<第10~11章>

Rubyのしくみ -Ruby Under a Microscope-

Rubyのしくみ -Ruby Under a Microscope-

第10章 JRuby:JVM上のRuby

JRubyはJavaプラットフォームに実装されたRubyだ。

JRubyのコード実行

  • MRIがBisonを使うように、JRubyはJayというパーサジェネレータを使って、Rubyコードをパースするコードを生成する
  • Rubyコードが辿る形式
    • MRI: Ruby -> Token -> AST Nodes -> YARV -> (Interpreter) -> C -> 機械語
    • JRuby: Ruby -> Token -> AST Nodes -> Java Byte Codes -> 機械語

JRubyの意義

  • 「RubyプログラムをJVM上で実行できるようにすること」
    • 環境:JVMがインストールされて入れば、Rubyを動かせない環境でもRubyが利用できる
    • 技術:JVMのガベージコレクションやマルチスレッドといった長年にわたる研究と開発の成果物の恩恵を受けることができる(より速く、より信頼性の高い実行環境)
  • JRubyは全ての組み込みクラスをJavaを使って実装している

第11章 Rubinius:Rubyで実装されたRuby

RubiniusはRubyを使ってRubyを実装している。

Rubiniusのコード実行

  • Rubiniusは2つの大きな要素から成り立つ
    • Rubiniusカーネル:Rubyで書かれている部分。言語の多くの部分を実装していて、StringやArrayなどの組み込みクラスの定義などを担当
    • Rubinius仮想マシン:C++で書かれている部分。Rubiniusカーネルから渡されたバイトコード命令を実行し、GCなどの低レベルな作業範囲を担当
  • Rubyコードが辿る形式
    • MRI: Ruby -> Token -> AST Nodes -> YARV -> (Interpreter) -> C -> 機械語
    • Rubinius: Ruby -> Token -> AST Nodes -> Rubinius -> LLVM -> -> 機械語

C++を使う意義

  • オブジェクト指向言語であるC++をRubyから利用することで、仮想マシンはRubyオブジェクトを、対応するC++オブジェクトを使って表現できる
  • Rubiniusでは組み込みメソッドの正確なソースファイルや行番号の情報をバックトレースに含めることができる

Rubyniusの意義

  • CやJavaの知識なしに、Rubyの内部構造を理解できる、価値ある学習リソース

補足

  • Class#source_locationで、ソースの場所を表示できる
    • 例:Array.instance_method(:shift).source_location