一応動くが、汚い。

一応出来たものの、設計もコードもすこぶる汚い。最適化もなし。それを弄りまくって超低機能数式コンパイラも作ってみた。それも汚い。でき上がるアセンブラもかなり冗長。例えばソースと、それから生成されるアセンブラは以下のようになる。

文法は簡単だから分かると思うけど、">>"は出力を意味していて、右に続くものを順に評価して出力する。

foreach x (1 .. 3) {
    foreach y (1 .. 2 .. 6) {
        >> "x + y = " (z = (x + y)) ", z = " (z);
    }
}

# 出力は以下の通り
x + y = 2, z = 2
x + y = 4, z = 4
x + y = 6, z = 6
x + y = 3, z = 3
x + y = 5, z = 5
x + y = 7, z = 7
x + y = 4, z = 4
x + y = 6, z = 6
x + y = 8, z = 8
#一部省略
.LC0:
    .string "x + y = "
.LC1:
    .string ", z = "
.LC2:
    .string "?n"
.LC3:
    .string "%d"
    .text
.globl main
    .type   main,@function
main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $12, %esp
    movl    $1, -4(%ebp)
.L0:
    movl    $1, -8(%ebp)
.L1:
    pushl   $.LC0
    call printf
    movl    -4(%ebp), %eax
    movl    -8(%ebp), %ebx
    addl    %ebx, %eax
    movl    %eax, -12(%ebp)
    pushl   %eax
    pushl   $.LC3
    call printf
    pushl   $.LC1
    call printf
    movl    -12(%ebp), %ebx
    pushl   %ebx
    pushl   $.LC3
    call printf
    pushl   $.LC2
    call printf
    addl    $2, -8(%ebp)
    cmpl    $6, -8(%ebp)
    jle .L1
    incl    -4(%ebp)
    cmpl    $3, -4(%ebp)
    jle .L0
    movl    $1, %eax
    leave
    ret
.Lfe1:  .size   main,.Lfe1-main
    .ident  "JKlein: (MathC) 0.0.1 20040718"

アセンブラ読める人は分かるけど、このコードだと変数のスコープが無い。すべてグローバルだから、書き方としては一番楽なんだけど非常に気持ち悪い。それと最適化とかの前に算術コードをもっとうまくやるべきだな。レジスタの使い方が手抜きすぎる。これに関しては、わりと楽に改善できるはず。

これだったら、アセンブラを生成しないで直接Cに変換して、gccに任せた方が良いコードが出来ますな。