- JVM(Java Virtual Machine)は、コンパイルされたJavaバイトコードを実行するプログラムです。
- 同じバイトコードがWindows、macOS、Linux上で動作するため、modは再コンパイルする必要がありません。
- プレイヤーはJavaランタイム(JRE)を必要としますが、modderはコンパイラ付きのフルJDKが必要です。
- Minecraft Java Editionと、Opalを含むすべてのFabric modは、JVM上で動作します.
JVM、またはJava仮想マシンは、Javaコードを実行するプログラムです。Javaでコードを書くと、コンパイラがそれをバイトコードに変換し、JVMがどのオペレーティングシステム上でもそのバイトコードを実行します。そのため、Minecraft Java版とそれに作られたMODは、Windows、macOS、Linux上で再コンパイルなしに同じように動作します.
JVMが実際に何をしているか
JVMは、ソースコードではなくバイトコードを実行します。Javaプログラムをコンパイルすると、WindowsやMacの実行ファイルが得られるわけではありません。JVMが理解できる、コンパクトな命令セットであるバイトコードでいっぱいのクラスファイルが得られます。JVMはこれらの命令を読み込み、あなたのマシン上で実行します。
その余分なレイヤーがポイントです。同じバイトコードはJVMが存在する場所ならどこでも実行されるため、「一度書けばどこでも実行できる」ということが、Javaが広く普及した理由の短縮版です。JVMは、その約束を叶える部分です。
JVM、JRE、JDK
これらの3つの用語は混同されがちなので、以下に分類を示します。
| 用語 | 概要 | 必要なタイミング |
|---|---|---|
| JVM | バイトコードを実行するエンジン | どんなJavaプログラムを実行するにも必須 |
| JRE | JVMに標準ライブラリを追加したもの | Javaプログラムを実行する際に必要 |
| JDK | JREにコンパイラや開発ツールを追加したもの | Javaプログラムを開発する際に必要 |
ゲームを起動するには、ランタイムだけあれば十分です。Modを開発する開発者は、まずJavaをバイトコードにコンパイルするために、フルJDKが必要になります。
JVMがあなたのコードを高速に実行する方法
JVMはまず、バイトコードを1つ1つの命令ずつ解釈することから始めます。実行中に、どのメソッドが最も頻繁に呼び出されるかを監視します。これらのホットパスはJITコンパイラに渡され、その場でネイティブのマシンコードに変換されます。ウォームアップ後、最も頻繁に実行されるコードは、ネイティブに近い速度で実行されます.
JVMはメモリの管理もあなたのために行います。ガベージコレクタが、あなたが使用しなくなったオブジェクトを回収するため、Cのように手動でメモリを解放する必要はありません。このことが、Javaが書きやすく、モッダーにとって最初の言語として一般的な理由の一つです。
Minecraftにとってなぜそれが重要なのか
Minecraft Java EditionはJVM上で動作し、それをターゲットとするすべてのユーティリティクライアントやMODも同様です。クライアント自身のコードは、Java、Kotlin、または他のJVM言語で記述できます。なぜならそれらはすべてJVMが実行する同じバイトコードにコンパイルされるからです。 FabricのMODは、バイトコードのJARファイルとして配布され、ローダーがゲーム起動時にそれをゲームに組み込み、JVMがそのすべてを1つのプロセスとして実行します。
これが、ランチャーでヒープサイズや使用するJavaのバージョンを調整できる理由でもあります。ゲーム自体ではなく、ゲームをホストするJVMを設定しているのです。
FAQ
いいえ。Javaはプログラミング言語、JVMはコンパイルされたプログラムを実行するためのランタイム環境です。Kotlinなどの他の言語も同様にバイトコードにコンパイルされ、同じJVM上で動作します。
Javaランタイムが必要です。これにはJVMが含まれます。多くのランチャーが同梱されているため、個別にインストールしなくてもすでに持っている可能性があります。
JVMはバイトコードを実行します。JDKは、コンパイラやツールを含む、Javaプログラムを最初に構築するためのフル開発キットです。
最初はバイトコードを解釈し、その後、JITコンパイラがプログラム実行中に最も頻繁に実行されるコードをネイティブマシンコードに変換します。このウォームアップが起動コストであり、高速化はそれ以降に現れます。