IRIS/IRIS++ | ゲーム開発プログラミング言語


トップ トップ | 前 | 次


仮想マシン



概要

この項では、仮想マシンがどのようにバイト コードを解析するのかを簡単に説明します。


実行フロー

基本的な実行手順は以下の通りです。


  1. 仮想マシン (VM) がコンパイルされた IRIS スクリプトを開きます
  2. VM はコードの種類、コード、コードの種類、コード ... の連続したコードを含むスクリプトをロードします
  3. それぞれのコードで、VM はコードの種類を決定およびそれに応じて実行します
  4. すべてのコードの実行が完了 (または停止の指示が出されたら) したら、実行が終了します

仮想マシンは (ulyvm.exe) コマンド ライン引数を必要としません。bin/data/script ディレクトリ内の init.bin を自動的に実行します。


バイト コードの内容

ロードされたバイト コードは以下を含みます。


コードの種類: 0=指示セット、1=オブジェクト、2=コマンド、3=レジスタ、4=文字、5=数値


  • 指示セット : IRIS 指示セットを表します
  • オブジェクト : 基本的な IRIS 言語に含まれない外部オブジェクトを表します
  • コマンド : 外部オブジェクトのコマンドを表します
  • レジスタ : レジスタ番号を表します
  • 文字 : 上位および下位バイトを含む Unicode でエンコードされた文字を表します
  • 数値 : バイト サイズ (0 → 255) の数値を表します

コードは以下の指示セットまたはバイトで表された値になります。


NOP = 0x00
CLR = 0x01
ATR = 0x02
HLT = 0x03
PTX = 0x04
ATB = 0x05
JMP = 0x06
JMS = 0x07
RET = 0x08
SUM = 0x09
SBT = 0x0A
MLT = 0x0B
DIV = 0x0C
SKZ = 0x0D
SKL = 0x0E
SKG = 0x0F
SKE = 0x10
SKN = 0x11
RUN = 0x12
IMP = 0x13
REG = 0x14
CLB = 0x15
PTB = 0x16
ENG = 0x17

例 :

コードの種類コード何を表すか
0x000x00指示セット: NOP
0x030x02レジスタ 0x02: $2
0x040x03文字 'A' の上位バイト
0x040x91文字 'A' の下位バイト


コード レイアウト:

コードは値が最初に読み込まれ、その後に指示セットが呼び出されるように編成されています。


例えば:

[スクリプト]

REG $0
ATR "Hello"
PTX $0


[バイト コード]

$0
REG
H
e
l
l
o
ATR
$0
PTX

レジスタの内容:

レジスタはその値の情報を以下のように保持します。


  • 数値: そのまま。32 ビットの整数値以上を超えることはできません (-2147483647 ~ 2147483647)
  • レジスタ: レジスタ番号を表す各バイト (0 → 255)
  • 文字列: バイト位置 (以下の例を参照してください)

[メモリ ダンプ]

[0] H
[1] e
[2] l
[3] l
[4] o <-- レジスタはバイト位置 4 (文字列 "Hello" の終わり) を格納します
[5] PTX

文字列を扱う場合、プログラム カウンタがメモリ位置 [5] に到達すると、仮想マシンはコードの一番上に到達するか、別な指示セットが見つかるまで後ろ方向にトレース バックします。そして、文字列を表示します。


PHP 上の仮想マシン

これは仮想マシンを PHP で実装した一つの例です。MBCS の非サポートおよび拡張機能は実装されていないことに注意してください。

UlyVM PHP をダウンロード