Skip to content

Memory Representation

skyrabbit edited this page May 12, 2020 · 9 revisions

エンディアンの違いは注意すべきである。TODO buildスクリプトで識別しておく
表現は2つ用意する(未実装)

  • inline: 空間的な制限あり 高速
  • unlimited: 空間的な制限なし 低速

命令

32 bitを上位から順に8 bitずつopcode, operand0, operand1, operand2として扱う

/* C++  */ struct { uint8_t, int8_t, int8_t, int8_t };
/* Rust */ (u8, i8, i8, i8)

上のようにbyteごとに分割して宣言することでエンディアンの違いを吸収できる(はずである)。

整数

特記事項はない clang++と同様の扱いである

真偽値

  • true: 1
  • false: 0

浮動小数点数

IEEE 754に基づいたメモリ表現である s eeeeeeee fffffffffffffffffffffff

  • s: sign
  • e: exponent
  • f: fraction

文字列

0を表すバイトで終わる連続する文字で表す

  • 静的: data
  • 動的: heap

関数(要検証)

呼び出し規約

引数、ローカル変数はスタックに格納される

スタックトップ
戻りアドレス
..
ローカル変数2
ローカル変数1
古いベースポインタ
引数1
引数2
..

新しいベースポインタは古いベースポインタを指すので

  • n番目の引数: ベースポインタ-n
  • n番目のローカル変数: ベースポインタ+n

でアクセスできる。
戻り値は実装されていないが、戻りアドレスより1つ上に「戻り値を代入するレジスタ」の添字をpushするか、予約されたレジスタに戻り値を代入する、という実装になるだろう。

Box(ポインタ/参照)

ヒープ領域の先頭からのオフセットを整数と同様に表す

nil

いくつかの方法を提案しておく。適切に使い分けてほしい

  • メモリを割り当てない
  • 0または-1で表す
  • bit flag法を用いてnil flagを立てる

オブジェクト

連続するヒープ領域を用いて表す

  • フィールド: ABIに基づいたデータ表現で表す
  • メソッド: コンパイラが静的ディスパッチする

配列

連続するヒープ領域を用いて表す

  • 静的: data
  • 動的: heap

64 bit

NaN Boxing