Rubyソースコードの仮定事項¶
Rubyのソースコードは次のことを仮定して書かれている。これを満たさない環境への移植は極めて困難であると考えられる。
言語¶
- コンパイラの実行時文字集合がASCII である。(EBCDICとかでない)
- コンパイラは、C89を原則的に満たしている。
- コンパイラは、C89標準ライブラリと同一の識別子の使用を原則として制限していない。
- (YARVでオペランド融合している場合) caseの枝が256本以上ある場合に対応していなくてはならない。
- 文字列定数の文字数は少なくとも7000文字程度までは書けなければならない。
型¶
- charはsigned charまたはunsigned charと同じ動作をする。
- charは8bitでなければならない。8とマジックナンバーで書かれている箇所多数。
- int の幅は 32bit
- long の幅は 32bit または 64bit
- Fixnumはポインタの幅ではなくlongの幅である(VALUEよりlongが小さいと、longの幅しか使わない。符号bitを含む)。
- time_tは整数型(符号付き、符号無しは問わない)。
- 文字を扱うには32bit必要 (GB18030のため、signed 32bitではダメ)
- enumとlongがロスなく変換できる前提で書かれている箇所がある(規格上はenumはsigned intでよい)
sizeof(size_t) == sizeof(void*)
が成立する。sizeof(VALUE) == sizeof(void*)
が成立する。
ポインタ・メモリー¶
- ポインタはlongまたはlong long(_int64)に格納可能である。
- void*型が存在する
- void*型に関数ポインタを代入できる
- 任意の関数ポインタ同士は互いにキャストできるし、キャストしたものを介して呼べる。
- マシンスタックが存在する、すなわち、自動変数はメモリアドレスの上位か下位の特定の一箇所に固まって配置されており、分散されていない。
- ポインタ型の値は下位2bitが立たない。
浮動小数点数¶
- InfinityとNaNがdouble型のどこかに存在する