コンピューター理論、チョットデキルようになりたい

コンピュータサイエンスの学び直しです

学び直し37日目:7章 バーチャルマシン#1:VM仕様②

記録

VMの仕様を学び中。VMサンプルプログラムを眺めながら仕様の深堀り。ポイントは、「いちいちスタックを介する」ということ。

算術操作

上位言語で x や i という変数や定数をたとしても、VM にとってはそんな文字関係ない。VM は、関数の引数であればスタックを使って算術のための引数や算術結果を argment segment に push や pop を行うし、定数であれば local segment に push や pop する。

コンパイラが行っていることは、演算命令の対応付け(x == i は Eq に変換など)と、引数や定数を segment に対応付けること(segment 0 は x として扱い, local 0 は i として扱うだけ。x や i という表記に意味はなく、その振る舞いだけ対応付けされるイメージ)。

処理を開始する際にスタックを空にすることも忘れずに。これが初期化。

配列操作

たとえば、bar[0..9] みたいな要素数 10 の配列があったとして、「bar[2] = 19」 とする操作を行う場合、VM では「ベースアドレス bar から2個先のアドレスを19にする」という処理をするらしい。C 言語で言うところの、「*(bar + 2) - 19」に似ているらしい。詳しくはあとの章で出てくる様子。

オブジェクト操作

オブジェクトのデータ(パラメータやメソッド)は、配列のようにまとめてメモリ上に確保されるので操作が似ているとのこと。pointer segment と this segment を利用することで、pointer の位置をベースとする相対的な位置指定操作が可能となる。ポインタの意味がちょっと分かった気がする。

実際の VM コードへの変換方法や、相対位置をどのように把握するかは先の章で取り扱うとのこと。

今日の筋トレ

リングフィットアドベンチャー