Array<Object>問題
[1, "a"] のような配列(Array<Object>)があったとき、メモリ上にどのように持つのか
整数のみならi32*でよい
オブジェクトのみなら%Object*でよい
混在してると困る
案1
CRubyやGaucheのようにポインタに整数を埋め込む
cons: 性能低下?
shiikaではRubyのようにシームレスなBignumを入れたいので、どのみち変換は必要
案2
必要なときだけボクシングする
Crystalはこの方式に近い
[1, "a"]は Array(Object)ではなく、Union Typeで %"Array(Int32 | String)" = type { i32, i32, i32, %"(Int32 | String)"* } になるため
cons: 必要な箇所が多いかも?
Array以外のどこで必要になるかよくわからん
即値とオブジェクトが混在する箇所で必ずボクシングが要る
案3
常にボクシングする
pros: 実装が簡単
CRubyは64bit CPUのときだけfloatをポインタに埋め込む
このとき仮数部が1bit犠牲になるが、absが大きいfloatはヒープに確保することで表現力を犠牲にしないようにしている