Dalvik
読み:ダルビック
外語:Dalvik

 Androidランタイムに搭載されている独自の仮想計算機(仮想マシン)。
目次

概要
 Java言語で書かれたAndroid用アプリケーションはコンパイルしてバイトコードになり、これをDalvikで実行する。
 Javaの技術が元になった環境だが、使用する中間言語は専用で、Dalvik Executable(DEX)と呼ばれる。従って、一般的なJavaバイトコードは利用しない。
 DalvikのバイトコードはJavaバイトコードから作成可能なため、通常はJava言語による開発が行なわれているが、理論上はそれ以外の言語での開発も可能である。

特徴

Javaではない
 仮想計算機Dalvikが使うバイトコードがJavaのものと異なる、独自設計である。このため、実際にはJava仮想マシンではない。
 当然ながらJava互換性テストを通っていない(そもそも通らない)ので、ライセンス的にもDalvikをJavaと名乗ることができず、つまりDalvikはJava仮想マシン(JVM)ではない。

レジスター・ベース
 JVMとDalvikは、明確な設計方針の差が存在する。DalvikはJVMのパクリだが、単なるパクリではない。
 JVMは「スタック・ベース」と呼ばれ、命令処理に使用するレジスターがスタック状になっていることを特徴としていたが、Dalvikは一般的なCPUのように任意のレジスターを選択する「レジスター・ベース」となっている。
 仮想マシンの設計コンセプトは全く違ってはいるが、Javaプログラムからその違いを認識することはほぼない。アプリケーションプログラマーから見ると、Javaのノウハウをそのまま開発に活かせる利点があり、これがAndroidが人気を集める理由の一つとされている。

レジスターマシン
 スタックマシンは命令が短い代わりにスタック操作の命令が必要になるため命令数が多くなる。
 レジスターマシンは、スタックマシンと比較して、レジスター番号などを指定する必要がある分、命令が長くなりやすい。
 インタープリターの場合、処理速度は命令数に概ね比例する。したがって命令数が多くなるとパフォーマンス面で不利である。Dalvikの設計者は、命令数が増えることを嫌った可能性がある。

特殊性
 Dalvikは特殊なレジスターマシンである。
 レジスターは32ビット長だが、メソッドごとにスタックに積まれるようにして用意され、そのレジスター数は可変(0〜最大65535個)である。C言語のローカル変数に近い。
 命令はオペコードオペランドからなり、命令長は可変長である。
 オペコードは8ビットで、これに必要な分だけオペランドが付加される。また命令は16ビット単位にアラインメントされる。
 通常、65535個(表現に16ビット必要)ものレジスターを使わないが、単純に考えれば、3オペランド命令なら16ビット×3+8ビットで計56ビット(7バイト)にもなってしまう。このため、多くの命令は256個(表現に8ビット必要)や16個(表現に4ビット必要)に制限し、オペランドを短くしている。

補足

名前
 Dalvikは地名から採られた。
 開発者ダン・ボーンスタイン(Dan Bornstein)の先祖が住んでいたとされる、アイスランドのエイヤフィヨルズル(Eyjafj〓r〓ur)にある漁村の名Dalv〓kにちなんで命名されたとする。

ライセンス
 各携帯電話機メーカーが改変した仮想計算機のソースコードを公開しなくて済むよう、GPLのリンク例外ライセンスのOpenJDKではなく、ApacheライセンスのApache Harmonyベースで開発された。

再検索