Javaバイトコード
読み:ジャバ-バイトコード
外語:Java byte code

 Java用のバイトコードであり、つまりJava仮想マシン(JVM)で使われている機械語である。
目次

概要
 jarファイル中に含まれるclassファイルが、Javaバイトコードを含むファイルである。
 JVM用の機械語コードは、1バイト=1オクテット=8ビットであり、オペコードが1バイトで設計されている1バイト単位の可変長コードである。ゆえにバイトコードと呼ばれている。
 JVMはスタック指向という特徴的な設計であるが、RISCにありがちな16ビット長固定長のような構造ではなく、CISCにありがちな8ビット長可変長とすることを選択した。

特徴

命令語
 オペコードが8ビットあるので、最大で28=256種類の命令を表現できることになる。
 実際にはその全ては使われておらず、空き領域は未使用のまま予約されている。また、引数を要求する命令についてはバイト単位の可変長となる。

プログラミング言語
 JVMやJavaバイトコードはJava言語用に設計されてはいるが、Java専用というわけでもない。
 従って理論上は、Java以外のプログラミング言語をJavaコードにコンパイルするコンパイラーも開発可能である。
 実際に、いくつかのスクリプトや、あるいはCをJavaコードにコンパイルするコンパイラーが第三者によって開発されたことが知られる。

特性や弱点

把握の必要性
 Javaのソースコードをコンパイルすると、最終的に出力されるのがこのJavaバイトコードということになる。
 最近はそうでもないが、本来Javaは「Write once, run anywhere」という理想のためにJVMで動作するコードを作ることが目的なので、Javaバイトコードはその真髄であるとも言うことができる。しかし現実問題としてJavaプログラマーがJavaバイトコードについて詳細を把握する必要性は必ずしもない。
 Javaバイトコードは手段であって目的ではない。Javaプログラマーは、Java言語を知っているだけで充分である。これは、C/C++プログラマーが、コンパイルの結果出力されるアセンブリ言語や機械語コードを通常は意識する必要がないのと同様である。

逆コンパイル
 C/C++と比較して、Javaは比較にならないほどの数の逆コンパイラーが提供されており、JavaバイトコードからJavaのソースを容易に得ることができる。ここから、Javaは、C/C++と比較して逆コンパイルしやすい言語であることが分かる。
 しかしこれは、Javaバイトコードや、それを含むclassファイル自体に主たる原因があるわけではなく、まして、Javaバイトコードやclassファイル内に逆コンパイル用の情報が含まれていたりするわけでもない。
 Javaは、C/C++の否定として複雑な機能やポインター演算などが削除されており、このため言語仕様的にシンプルであり逆コンパイルしやすい性質を持っていることが、一つの理由である。
 また、Javaバイトコードが中間言語だからという説もあるが、正しくもあり、間違いでもある。中間言語であっても、その仕様は一般の機械語とそう変わらない。逆コンパイルの難易度はそう大きくは違わない。
 Javaバイトコードを含むclassファイル自体には、クラスの名称や型などの定義情報(メタ情報)が含まれている。これはJavaに限らず、ガベージコレクション機能を持った言語全てに言えること(.NET Frameworkで使われる言語も同様)で、こういったメタ情報はカベージコレクターを機能させるために不可欠である。従って、classファイル全体を見ればメタ情報が逆コンパイルの手助けをすることは事実である。
 こういった様々な特徴から、他の言語と比して逆コンパイルがしやすいということになる。

再検索