Android携帯ゲームを作って世界に配信してみよう(1) ―― まずは小さなアプリからこつこつ作ってみる
コラム スタック・ベースのVMとレジスタ・ベースのVM
VM(Virtual Machine)とは,仮想マシンの略です.通常はハードウェアのCPUが機械語を解釈して実行しますが,仮想マシンは,CPUを模したソフトウェアが機械語を解釈して実行します.当然,実行速度が遅くなるというデメリットがありますが,ハードウェア・アーキテクチャとは異なるアーキテクチャで書かれたプログラムを実行できるなどのメリットがあります.
VMには,スタック・ベースのVMと,レジスタ・ベースのVMがあります.まず簡単にスタックとレジスタの動作原理を説明します.
スタックとは,FILO(First In Last Out:先入れ後出し)でデータを管理(格納/取り出し)するデータ構造のことです.スタック領域は,一般的にメモリ上に確保されます.
レジスタとは,CPUの内部で一時的に計算結果を保存する領域です.一定のビット数の計算結果を保持することができる複数のレジスタが,用途別に存在します.例えば,Android携帯電話でよく採用されているARM系のCPUには,32ビットのレジスタが16個内蔵されています.極めて容量が限られていますが,メモリとはけた違いに高速にアクセスすることができます.
●スタック・ベースVMの計算処理
スタック・ベースのVMは,スタックへの値の格納命令により,値をスタックの先頭に追加します.演算命令により,スタックの先頭からいくつか値を取り出し計算をして,計算結果をスタックの先頭に追加します(図A).
図A スタック・ベースVMの動作

実際にスタックを使って計算する場合は,以下のような流れになります.
(1)整数"1"をスタックの先頭に格納する.
(2)整数"2"をスタックの先頭に格納する.
(3)スタックの先頭から整数を二つ取り出し,足し算をする.
(4)計算結果を,スタックの先頭に格納する.
スタック・ベースのVMには,以下のようなメリットがあります.
- 移植性が高い
- コード・サイズが小さくなる(常にスタックの先頭に対する操作になり,レジスタの指定などが不要なため,その分コード量が減る)
●レジスタ・ベースVMの計算処理
レジスタ・ベースのVMは,レジスタへの値の格納命令により,値をレジスタに格納し,演算命令によって指定するレジスタの値同士を演算し,計算結果を指定したレジスタに格納します.
実際にレジスタを使って計算する場合は,以下のような流れになります(図B).
(1)整数"1"をレジスタiに格納する.
(2)整数"2"をレジスタjに格納する.
(3)レジスタi と レジスタj を足し算した結果を,レジスタkに格納する.
図B レジスタ・ベースVMの動作

レジスタ・ベースのVMには,以下のようなメリットおよびデメリットがあります.
- 移植性が低い(レジスタが少ない構成のCPUでの実行が困難になる.ただし,実行されるハードウェアのレジスタ構成とVMの構成が一致すれば,処理が最適化される可能性がある)
- コード・サイズが大きくなる
- 実行時に必要なメモリの領域が少ない
●なぜAndroidはレジスタ・ベースのVMを採用したのか?
サーバから携帯電話,家電までさまざまな環境での実行が想定されるJavaには,環境の制約が少ないスタック・ベースのVMが採用されています.一方,携帯電話の世界だけで考えてみると,CPUはARMアーキテクチャがデファクトです.ARMはレジスタ数に32ビット・レジスタを16本内蔵しており,それなりに余裕があります.そのため,Androidは「ARM」系での実行に特化し,レジスタ・ベースのDalvik VMが採用されたと言われています.
やまだ・もとやす
スパイシーソフト(株) 代表取締役