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