(javascript、java、C言語)、MIPSの再帰表現

この4言語でn階上計算(n!)の再帰表現をする関数を比較してみます。(高級言語は変わりないですがおまけで)
大学院用の勉強でアセンブラをやってるのでMIPSアーキテクチャーでも書いてみます。


function fact(n){
if(n<1) return 1;
else return n*arguments.callee(n-1);
}
arguments.calleeが自分自身をさします。

  • Java(メソッド)


public int fact(int n){
if(n<1) return 1;
else return n*fact(n-1);
}


int fact(int n){
if(n<1) return 1;
else return n*fact(n-1);
}
javaと一緒の表現です。

(レジスタの定義)
$sp:スタックポインタ,$ra:戻りアドレスレジスタ,$v0:戻り値レジスタ,$a:引数レジスタ


fact:
addi $sp,$sp,-8 #2word 分$spを下げる
sw $ra,4($sp) #base address 4から$raを退避
sw $a0,0($sp) #base address 0から$a0を退避
slit $t0,$a0,1 #n<1ならば$t0=1
beq $t0,$zero,L1 #(n>=0)ならばgoto L1
addi $v0,$zero,1 #戻り値は1
addi $sp,$sp,8 #$spを戻す
jr $ra #jal以下に行く
L1: addi $a0,$a0,-1  #n-1
jal fact #goto fact(再帰させる)
lw $a0,0($sp) #base address 0から$a0を取り出す
lw $ra,4($sp) #base address 4から$raを取り出す
addi $sp,$sp,8 #2word 分$spを上げる
mul $v0,$a0,$v0 #n*fact(n-1)
jr $ra #終わり
C言語コンパイルした結果。オペランドが3つなのでこんなにめんどくなります。