第2回 RHGの逆襲(at 新橋某所)

  • 発表候補者枠で参加は無謀だった
    • ぜんぜん理解できてなかったので、発表が当たったら大惨事になるところだった。そのときは開き直ってわかんないところを聞きまくるつもりだったけど
    • 無理やり予習できたという意味ではよかった。でもそれでみんなに迷惑かけるってのはなあ
  • ハッシュオブジェクトはst_tableのラッパーとのこと
  • do_hashはマクロなのに小文字なのはなぜ?
  • st_table構造体
    • *typeはC++でいうところの仮想関数テーブル
    • entries_packedは値埋め込みかどうかを判断するフラグ
    • ST_INDEX_BITS-1の値は31
    • *headは、要素を追加した順序を保持するために新たに追加された
  • st_table_entry構造体
    • *foreと*backで、要素を追加した順序を保持する双方向リンクリストを実現
  • 初期化コンストラク
    • C++で書けば楽なのに(yuguiさん)
  • 実際の処理はst_init_table_with_size
    • new_sizeは必ず素数を返す。約数があると使うスロットが偏るから
    • キーが数字でかつあるサイズ以下ならentries_packedのビットが立つ
  • FIND_ENTRYマクロ
    • PTR_NOT_EQUALという名前はおかしくね?(yuguiさん)
  • st_lookup
    • 値埋め込み(packed)のときはkeyとvalueが交互に直接格納されている
    • 値が見つかったときは1、見つからなかったときは0を返す
    • 埋め込みを行う理由を吉岡さんが推測。CPUのキャッシュにヒットさせたかったからでは? 今のCPUはキャッシュヒット時に2クロックの処理がヒットしないと400クロックくらいかかる。値を埋め込むと、最初の値がヒットするかどうかは半々だけど、次の値からは必ずヒットする
    • packedのベンチマークを中田さんが行っていたとのこと。要素が三つまでだとpackedでメモリ効率も速度も向上する
  • ADD_DIRECTマクロ
    • 最初はheadのforeもbackもhead(自分自身)
    • headが0でなければ、entryのforeがhead、entryのbackがhead、headのforeがentry、headのbackがentryに
  • st_insertは値がすでにあったときに1、新規に値を入れたときに0を返す
  • strcasehashはASCIIコードをハードコーディングしてる
  • 1.9のrb_intern()はマルチリンガライゼーションの処理がごちゃごちゃしていてよくわからないらしい
  • 拡張ライブラリが(rb_hashではなく)stを使う場合の話(artonさん)
    • Ruby側からはフリーズしてライブラリ側からは自由にいじれるようにするとか
    • Cのインタフェースとしては覚えておいたほうがよいとのこと
    • ハッシュの実装をいくつも覚えてもしょうがないし
  • yuguiさんの三つの疑問
    • M17N
    • intのなぞ。strhashの実態はunsigned、numhashの実態はunsigned longなのになぜintにしてるのか
    • strhashに素数をかけているのはなぜ?
  • 第4章の全体を概観(yuguiさん)
  • オブジェクト/クラスの階層図
    • 図4.10
    • 1.9のobject.cの2300行あたり
  • Object、Class、Moduleの三つは最初からないと困るのでブートストラップ
  • コードを読むときは、そのコードの意図を知っているのと知ってないのとでは難易度がぜんぜん違ってくることを実感した