ソースコードの流れをチェック!


では、記述されているソースコードの内容についてチェックしてみましょう。

・クラスの宣言
.class public Hello
.super java/lang/Object

まず最初に、作成するクラスに関する宣言の記述があります。「.class public クラス名」という形でクラス名を指定し、続いて「.super スーパークラス」という形で継承元となるクラスの指定を書きます。ここではHelloクラスは何もextendsしていませんが、Javaでは「extendsしていないクラスは、暗黙のうちにjava.lang.Objectを形容するものとみなす」ということを思い出してください。

・メソッドの定義
.method public ()V
aload_0
invokespecial java/lang/Object/()V
return
.end method


.method public static main([Ljava/lang/String;)V
.limit stack 2
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Hello Jasmin!!"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method

その後には、とmainという2つのメソッド定義が記述されています。メソッドの定義は、「.method メソッド宣言」で始まり、「.end method」で終わる形で記述されます。メソッド宣言は、Javaの一般的なメソッドの宣言と同じ形で記述されます。

2つのメソッドのうち、は、Javaのソースコードでは記述されないメソッドです。これは、mainの前に実行される初期化処理です。そして、.method public static mainというのが、mainメソッドになるわけですね。

メソッドの処理
aload_0――この「aload_番号」というのは、指定した番号のローカル変数からオブジェクト参照を取り出し、スタックに積むものです。
invokespecial――これは、特定のインスタンスメソッドを呼び出すものです。ここでは、スーパークラスであるjava.lang.Objectのを呼び出しています。最後に「V」とついていますが、これは返値がvoidであることを意味します。

・public static mainメソッドの処理
[Ljava/lang/String――引数にこういう値が指定されていますね。この最初の「[L」は、配列を意味します。つまり、java.lang.String配列が引数指定されているということです。
.limit――スタックの上限を指定します。ここでは2つまでスタック可能であるよう設定しています。
getstatic――staticフィールドから値を取り出します。ここではjava.lang.Systemのoutから、java.io.PrintStreamを取り出しています。
ldc――これは1ワード長の定数を取り出しスタックに積むものです。これにより、"Hello Jasmin!!"というテキストがスタックに積み上げられます。
invokevirtual――インスタンスメソッドを呼び出すためのものです。一般的なインスタンスメソッドは、先のinvokespecialではなくinvokevirtualを使います。基本的な使い方はほぼ同じです。

いかがでしょうか。ざっと流れを説明しましたが、「なんだかずいぶんと面倒くさいことをしているな」と感じたかもしれません。また「スタック」というのがなんだかよくわからない、という人もいたでしょう。

Javaのプログラムは、仮想マシンの中で「スタック」と呼ばれるメモリに必要な情報を保管し、それを消費して実行する、ということを繰り返して動いています。ですから、Jasminを使いこなすためには、Java仮想マシンの仕組みがどうなっているのか、理解しなければなりません。

これは、突き詰めれば「Javaは、何をやっているのか?」ということにもなります。興味ある人は、ぜひ、挑戦してみましょう。「Javaというものの仕組み」がわかれば、Javaをより深く理解することにもきっとつながるはずですよ。

※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。