Python、Ruby、JavaScript などの動的型付け言語の多くでは、オブジェクトは属性名から値への対応表のように見えます。この柔軟性から、ランタイムの実装者は属性をハッシュテーブルでモデル化しがちです。ハッシュテーブルは名前と値の対応付けに優れているため、これは自然に思えます。
しかし、ハッシュテーブルによる方式には欠点があります。ハッシュ計算と探査は、非常に頻繁に行われる操作にとっては遅すぎます。また、ハッシュテーブルは間接参照を一段増やし、オブジェクトから別のストレージ構造へ移動することを強いります。その結果、a.b のような単純な属性アクセスでも、複数の依存するメモリロードを含む数百から数千の CPU 命令が必要になることがあります。属性は頻繁にアクセスされるため、属性をオブジェクト内にインラインで格納するほうがはるかに効率的です。
この問題に対処するため、ランタイムはマップ、レイアウト、シェイプ、隠しクラスなどと呼ばれるさまざまな構造を使います。これらは属性の読み取り、書き込み、格納を最適化します。多くの実運用のランタイムには、複雑でドメイン固有のエッジケースが含まれていますが、多くのブログ記事は実装の詳細を省いた高レベルの概要にとどまっています。
本記事の著者は、Python を妥当な忠実度でモデル化した CF Bolz-Tereick の「A Simple Object Model」を基にしています。著者はクラスとメソッドの仕組みには触れず、インスタンス属性とマップの部分に焦点を当てています。そして、読者が一度に頭の中に保持できる、500 行未満の簡潔で明快なマップシステムを抽出しています。
出典: Hacker News · 要約:HeadlinesBriefing