ソースコードの流れをチェック!
では、記述されているソースコードの内容についてチェックしてみましょう。
・クラスの宣言
.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
その後には、
2つのメソッドのうち、
・
aload_0――この「aload_番号」というのは、指定した番号のローカル変数からオブジェクト参照を取り出し、スタックに積むものです。
invokespecial――これは、特定のインスタンスメソッドを呼び出すものです。ここでは、スーパークラスであるjava.lang.Objectの
・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をより深く理解することにもきっとつながるはずですよ。