ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
Java用のバイトコードであり、つまりJava仮想マシン(JVM)で使われている機械語である。
オペコードが8ビットあるので、最大で28=256種類の命令を表現できることになる。
実際にはその全ては使われておらず、空き領域は未使用のまま予約されている。また、引数を要求する命令についてはバイト単位の可変長となる。
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ファイル全体を見ればメタ情報が逆コンパイルの手助けをすることは事実である。
こういった様々な特徴から、他の言語と比して逆コンパイルがしやすいということになる。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます