最初のプログラムを動かす
Jaspera を使って,文字列を出力するプログラムを動かします。ブラウザだけで進められます。
HelloWorld を実行する
Jaspera を開き,初期表示の HelloWorld を選びます。ソースには System.out を取得し,文字列を渡して println を呼ぶ命令が並んでいます。
右上の実行ボタンを押してください。初期サンプルの invokevirtual にはブレークポイントがあるため,出力の直前で停止します。再開すると「コンソール」に文字列が表示されます。
文字列を変える
ldc の後ろの文字列を変更して,再び実行します。
public class HelloWorld (major_version=55, minor_version=0) {
public static main([Ljava/lang/String;)V {
getstatic java/lang/System->out:Ljava/io/PrintStream;
ldc "こんにちは,JAL!"
invokevirtual java/io/PrintStream->println(Ljava/lang/String;)V
return
}
}
サンプルは変更して試せますが,再読み込みすると元に戻ります。編集した内容を残す場合はファイルとして保存してください。
出力の直前でスタックを見る
invokevirtual で停止した時点では,その命令はまだ実行していません。スタックには,下から PrintStream の参照,出力する文字列の順に値が積まれています。
| 命令 | この例での動作 |
|---|---|
getstatic | System.out の参照を積む |
ldc | 出力する文字列を積む |
invokevirtual | 参照と文字列を使って println を呼ぶ |
return | main から戻る |
ステップオーバーで呼び出しを進めると,文字列が出力されます。println は値を返さないため,この例の呼び出し後のスタックは空です。
足し算に変える
次のプログラムを新しい JAL ファイルへ貼り付けます。
public class Add (major_version=55, minor_version=0) {
public static main([Ljava/lang/String;)V {
getstatic java/lang/System->out:Ljava/io/PrintStream;
iconst_2
iconst_3
iadd
invokevirtual java/io/PrintStream->println(I)V
return
}
}
iadd の直前には 2 と 3 が積まれています。iadd は二つを取り出して 5 を積みます。今回は整数を表示するため,println の引数型も文字列から I に変えています。
次は 型記述子 と スタックとローカル変数 を読むと,メソッドの宣言と命令のつながりを確認できます。手元の JVM で実行したい場合は ツール へ進んでください。