PIR のプログラムは?
中間言語 PIR を使用して、初歩的なシンプソンの数値積分をやってみましょう。C のプログラムを先に示します。
int main() { int loop = 50000000; int i; double sum = 0; double x1 = 0; double x2 = 2*atan(1); double d = (x2 - x1)/(double)loop; for(i=0;i<loop;i+=2) { sum += 2*sin(x1 + (double)i*d); sum += 4*sin(x1 + (double)(i+1)*d); } sum += -sin(x1) + sin(x2); sum *= d/3; printf("%lf\n",sum); return 0; }
これに対する PIR のプログラムは、こうなります。はてな記法はまだ、PIR プログラムに対応していないので、ソースリストに色付けができません。
.sub 'main' :main $I0 = 50000000 $N1 = 0 $N2 = atan 1 $N2 *= 2 $N3 = $N2 - $N1 $N3 /= $I0 $N0 = 0 $I1 = 0 LOOP: $N4 = $N3 * $I1 $N4 += $N1 $N5 = sin $N4 $N5 *= 2 $N0 += $N5 inc $I1 $N4 = $N3 * $I1 $N4 += $N1 $N5 = sin $N4 $N5 *= 4 $N0 += $N5 inc $I1 if $I1 < $I0 goto LOOP FIN: $N5 = sin $N1 $N0 -= $N5 $N5 = sin $N2 $N0 += $N5 $N0 *= $N3 $N0 /= 3 print $N0 print "\n" .end
このプログラムに $NX や $IX (Xは数字)という表記が登場しますが、これは変数ではなく、レジスタを表します。C で言えば、register 変数でしょう。$NX は数値レジスタですが、浮動小数点数に対応します。$IX は整数レジスタです。普通の変数も使用できますが、ここでは使用していません。