メインコンテンツまでスキップ

最初のプログラムを動かす

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 の参照,出力する文字列の順に値が積まれています。

命令この例での動作
getstaticSystem.out の参照を積む
ldc出力する文字列を積む
invokevirtual参照と文字列を使って println を呼ぶ
returnmain から戻る

ステップオーバーで呼び出しを進めると,文字列が出力されます。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 の直前には 23 が積まれています。iadd は二つを取り出して 5 を積みます。今回は整数を表示するため,println の引数型も文字列から I に変えています。

次は 型記述子スタックとローカル変数 を読むと,メソッドの宣言と命令のつながりを確認できます。手元の JVM で実行したい場合は ツール へ進んでください。