logo

『深海マリア』

ヒューマンリソシア株式会社はコラム「vol.15 ‐ 『深海マリア』」を公開しました。

###
昨年末に上梓された「Rubyのしくみ」(原題:Ruby Under a Microscope, 顕微鏡の下でのRuby)という本を手にしました。Rubyのしくみを知りたい、Rubyを深く知りたいという欲求からの行為です。

そこで今回はRubyの内部構造 “Ruby Internals” の理解の助けになればという願いを込めて少しでも深層に近づくために潜ってみたいと思います。ちなみに筆者は金槌です。いつも謎に満ちているRubyのオブジェクトとクラスについて、その素顔を垣間見ることができれば嬉しいという試みです。


オープンソースとして公開されているRuby実行環境であるインタープリター(interpreter)の代表は、まつもとゆきひろ氏によって開発された MRI(Matz’ Ruby Implementation)です。MRIはC言語で実装されたRubyの公式処理系であり、すべてのプラットフォームで動作可能として提供されています。MRIは最も広く使われているRubyのインタープリターです(MRI以外にもRubyはオープンソースであるが故に多数の処理系が実装されています)。
先ずは安全第一に救命胴衣を着用して(「Rubyのしくみ」を片手に携えて)、MRIのソースコード(Rubyバージョン2.2.2)をダウンロードしてみました。
ソースコード海の中に浮遊するヘッダーファイルを覗くとその底にはRubyのオブジェクトが、RObjectという構造体で表現されていました。


Vol.15画像1


RObjectがRubyの汎用のオブジェクトとして用意されている構造体です。
unionで共用体として指定されているその内部にある構造体がインスタンスの値を指し示している様子です。
numiv(number of instance variables)がインスタンス変数の「個数」、ivptr(instance variables pointer)には
そのオブジェクトのインスタンス変数の「値」が格納された配列へのポインタが保存される様子です。
そしてiv_index_tbl は、後述するRClassと連動しており、個々のインスタンス変数の「変数名とインデックス」が対応付けられたハッシュテーブルへのポインタとなっているそうです。(因みにデータ型の st_table がC言語でのハッシュテーブル実装であり、Rubyでもハッシュの基礎となっているのでiv_index_tblは本質的にハッシュだそうです)つまり、 RObjectが保持するのはそのオブジェクトが固有に保持するインスタンス変数の値であり、変数名というインスタンス変数そのものの情報はクラスにあることになります。インスタンス変数は、クラスで定義しているのですから納得できる構造です。
ここでRObjectで冒頭に記載されているメンバーが、RBasicとなっています。RBasic構造体を探すと以下のようになっていました。

この続きは以下をご覧ください
リンク

関連情報
http://resocia.jp/
本プレスリリースは発表元企業よりご投稿いただいた情報を掲載しております。
お問い合わせにつきましては発表元企業までお願いいたします。