オブジェクトファイルの設計

ファイル入出力とか可変長配列とかrowlVMのプリミティブが充実してきたので、現在はrowl-core言語で次期rowl1コンパイラの実装をしています。
ところが、メモリマネージャのないスクリプト言語であるrowl-coreは大量にメモリを消費する為ついに限界がきました。
そこで、この段階で分割コンパイルが出来るようにオブジェクトファイルの設計をしてリンカを作ります。ELFがどうなっているかとか全然調べてなくて適当です。
まず、rowlVMは基本的に相対アドレッシングなので全てのアドレスを書き換える必要はありません。以下をリンク時に修正する必要があります。

  1. ファイルをまたぐ関数呼び出し
  2. グローバルboxed変数のインデックス
  3. グローバルunboxed変数のアドレス

というわけでプログラムの先頭にシンボルテーブルを作成します。

シンボルテーブルの1エントリ

exportされるシンボルのテーブル(exportテーブル)

| シンボル長(2バイト) | シンボル | アドレス(4バイト) |

importされるテーブル(import テーブル)

| シンボル長(2バイト) | シンボル | 書き換え場所の数=N(4バイト) | 書き換え場所のアドレス(4バイト) x N |

書き換え場所のアドレスはバイトコードの先頭からの該当オペランドのオフセットです。

シンボルテーブル
| 1のエントリ数(4バイト) | 2のエントリ数(4バイト) | 3のエントリ数(4バイト) | エントリ0 | エントリ1 | ...
オブジェクトファイル

先頭から

  • ファイルの総バイト数(4バイト)
  • exportテーブル
  • importテーブル
  • グローバルboxedオブジェクトの数(4バイト)
  • グローバルunboxedオブジェクトの総バイト数(4バイト)
  • グローバルunboxedオブジェクト領域
  • バイトコード本体