(javascript、java、C言語)、MIPSの再帰表現
この4言語でn階上計算(n!)の再帰表現をする関数を比較してみます。(高級言語は変わりないですがおまけで)
大学院用の勉強でアセンブラをやってるのでMIPSアーキテクチャーでも書いてみます。
arguments.calleeが自分自身をさします。
function fact(n){
if(n<1) return 1;
else return n*arguments.callee(n-1);
}
- Java(メソッド)
public int fact(int n){
if(n<1) return 1;
else return n*fact(n-1);
}
javaと一緒の表現です。
int fact(int n){
if(n<1) return 1;
else return n*fact(n-1);
}
(レジスタの定義)
$sp:スタックポインタ,$ra:戻りアドレスレジスタ,$v0:戻り値レジスタ,$a:引数レジスタ
C言語をコンパイルした結果。オペランドが3つなのでこんなにめんどくなります。
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 #終わり