言語実装アドベントカレンダー20174日目の記事です。言語実装、特に動的型付け言語の実装においては、実行時に値を扱う際、値本体の他に型などのメタ情報を持たせる必要がある。静的に解析が可能な言語と違って実行時にしか解析ができないからだ。言語の特性を考慮して実装をしないと非効率的なメモリの使い方をしてしまう場合がある。いうメモリの扱い方があるので、どういう部分で有用なのか紹介する。Int;と記述するのが最も簡易的であるし、様々なアーキテクチャ間での互換性を保つことができる。メタ情報も毎回確保しなければならないので非効率になる。pointerの手法が取られたりしている。値のメタ情報の提供を外部テーブルに任せる仕組みである。実行時は決められた領域の先頭アドレスを返すだけでメタ情報がメモリアクセスをすること無く引くことができる。単純な構想では番地ごとにメタ情報が必要なように見えるが、図のようにパターンがある場合は型情報はビット演算で算出することも可能である。して割り当てられている型ごとのページは、それぞれの型の純粋なサイズで確保されるため、unionを使った共通部分の不要なメモリを削減することもできる。メモリ使用量・メモリアクセス共に効率化を図ることができる。サンプル実装sbrk(2)を用いて非常に小さなサンプルを実装した。free_listなどの実装を含んでいないため、メタ情報に使用状況を載せている。出力に用いた部分の実装などは本質ではないため省いている。必要であればリポジトリを参考*2。freepage[3]に意図した通りの値が載ってる。mercariMonthlyスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。