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

add,sub,mul,div,rem,neg


今日は演算処理命令を使ってみます。negはスタックに1つの値が必要です。
それ以外は2つの値が必要です。
addが足し算、subが引き算、mulが掛け算、divが割り算、remが剰余、negがマイナスの値を取得する命令です。


まずは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          1
   .limit locals         2
   .line                 3
   iconst_1
   iconst_2
   iadd
   ireturn
.end method

結果 3 になります。

iaddの部分をisubにすると1-2で-1に。

.method                  n()I
   .limit stack          1
   .limit locals         2
   .line                 3
   iconst_1
   iconst_2
   isub
   ireturn
.end method

結果 -1


imulにして3*2=6

   iconst_3
   iconst_2
   imul

結果 6

idivで4/2=2

   iconst_4
   iconst_2
   idiv

結果 2

irem 5 % 2 = 1

   iconst_5
   iconst_2
   irem

結果 1

ineg -(2)は-2

   iconst_2
   ineg

結果 -2

です。何も難しいことはないですね。
JRuby等は四則演算のメソッドを書き換えることが出来ます。
そういう場合は全部とりあえず、メソッド呼び出ししておいて、組み込み関数だけがこの命令
を呼び出すとかなってるのかなぁと思います。
実はそういうところを考えるほうがすごい難しいんだろうなぁという感じです。