○○を読んでみた(Ruby編-1)

まず、ここを読んで欲しい。
第2章 オブジェクト
(たぶん、2〜3時間かかるので注意)
 
以下は私のメモ
 
Rubyのオブジェクトは大半がCの「構造体」であらわされる。
それを、VALUEにポインタを格納して、VALUEにて全て参照する。
 
例外として、小さい整数、シンボル、false、nil、trueに関しては実際の値をVALUEに格納している。
(ポインタじゃなくて)
それは、全部構造体を作ってると遅いから。
 
オブジェクトの構造体には全て、RBasic構造体を持っていて、RBasic構造体には
long型のflagがあり、ビット単位でフラグを立てて構造体の情報を記録している。
用途はいろいろあって、高速化に使われたりするが、主な目的は
構造体の型を保持するというのが目的。
それは、VALUE経由でいろいろな構造体を同等に扱うので、何の構造体なのか
わかんなくなるから。
 
VALUEの値がそれぞれ同値にならない様にうまく工夫されている。
(構造体のポインタ、小さい整数、シンボル、false、true、nil
構造体のポインタはmalloc(動的メモリ確保)で取得されるので、4の倍数のポインタが取得される。(longが32bit:4byteだったら)
小さい整数に関してはビット演算で必ず奇数に変換してから、VALUEに格納している。(i << 1) + 1
シンボルに関しては8ビット左シフト(256倍)して14を足して変換しているので、奇数・4の倍数でも無い値をVALUEに格納している。
falseは0、trueは2、nilは4をVALUEに格納している。(4が在るが、最初すぎてポインタで確保されるはずの無い値)
非常にうまいやり方で計算してるので、これは必見。
 
String、Array型ではインスタンス変数の呼び出し方が違う。
ここも理由含めて非常に面白い所。こういう所が言語処理系のトレードオフという所なんだろう。
 
まだ、読んでいる途中なので引き続き、引っかかった点をメモしていくつもり。