JVMで動作するプログラミング言語を作るにはどうしたらよいのだろう?(7)

演算子順位を持ったパーサも飽きてきたので、
またJVMをいじってみます。
pop,pop2,dupを使ってみます。

popはスタックの内容を捨てる命令です。以下の例では5と1をスタックに積んだ後
popで1を削除し2をスタックに積んでスタック中の5と2をiaddで足してます。

.source                  a.java
.class                   a
.super                   java/lang/Object


.method                  <init>()V
   .limit stack          1
   .limit locals         1
   .line                 1
   aload_0
   invokespecial         java/lang/Object/<init>()V
   return
.end method

.method                  n()I
   .limit stack          2
   .limit locals         1
   .line                 3
   iconst_5
   iconst_1
   pop
   iconst_2
   iadd                  ; 5 + 2 = 7
   ireturn               ; 7が返る。
.end method

pop2はintだと2つのデータを削除する命令です。
以下の例だと5と1をスタックに積んで、pop2で5,1を削除、2を積んでます。

.source                  a.java
.class                   a
.super                   java/lang/Object


.method                  <init>()V
   .limit stack          1
   .limit locals         1
   .line                 1
   aload_0
   invokespecial         java/lang/Object/<init>()V
   return
.end method

.method                  n()I
   .limit stack          2
   .limit locals         1
   .line                 3
   iconst_5
   iconst_1
   pop2
   iconst_2
   ireturn               ; 2が返る。
.end method

dupはスタックtopをコピーしてスタックに積みます。
iconst_5で5を積んで、dupで5をコピー。iaddで5と5を足して10が返ります。

.source                  a.java
.class                   a
.super                   java/lang/Object


.method                  <init>()V
   .limit stack          1
   .limit locals         1
   .line                 1
   aload_0
   invokespecial         java/lang/Object/<init>()V
   return
.end method

.method                  n()I
   .limit stack          2
   .limit locals         1
   .line                 3
   iconst_5
   dup
   iadd
   ireturn
.end method