Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

Javaバイトコードがポータビリティを持つ理由

静的なプログラミング言語を作成している過程で、かなりJava VMの仕様書を読んだ。

Javaバイトコードはポータビリティがあって、他の環境に持っていってもそのまま動く。

この事実を知っている人は多いと思うのだけれど、それはいったいなぜなんだろうか?

その答えの一つは

メソッド呼び出しでシンボリックな情報を持っているから

Java VMの仕様書を読むと、メソッド呼び出しをする場合には、「メソッド名を示すシンボリックリファレンスをunsigned 16bitで指定します」と書いてある。

「えっ、シンボリックリファレンスってなんなん? なんなん?」最初はそう思いました。

その答えは「文字列への参照」なのでした。シンボリックというのは、文字列という意味だったのです。

Java言語仕様では、クラス情報として、クラス名やメソッド名、フィールド名といった識別子を表す文字列を持っています。この文字列への参照を、バイトコードオペランドとして指定するんです。

f:id:perlcodesample:20180620215319j:plain

コンスタントプール上に、メソッド名が存在して、その位置を番号で指すようになっている。

文字列は環境依存しないデータ

文字列は、バイナリデータとは異なり、どの環境でも単純なバイト列であって、環境に依存しません。符号付32bit整数は、ある環境では、リトルエンディアン、他の環境ではビッグエンディアンかもしれない。

でも、バイト列は、どこに持ち運んでも、バイト列だ。

外部のクラスファイルに対しては、シンボリックな情報でアクセスする

外部のクラスファイルに対しては、シンボリックな情報でアクセスするので、ポータビリティがある。外部に対して、バイナリデータで参照せずに、シンボリックな情報だけを使う。