tinycをscalaに移植する。(3)
今日は、コンパイラの移植をしました。
唯の移植作業なので、ゴリゴリ作業してコンパイル通れば、あとはちょいちょいっと Null Pointer Exception を消して完成。
とりあえず、test.cのコンパイルが通ってアセンブラのコードがなんか表示されました。
アセンブルはしてないですけど、きっと動くはず(w
ということで、しばらくこのソースは見たくないので放置して、次のステップに進みたくなったらまたいじります。
あと、使い方とかドキュメントを書かないとな。
main() { var i, s; s = 0; i = 0; while (i < 10) { s = s + i; i = i + 1; } println("s = %d", s); }
こんなコードが
>scala stinyc.Main test.c
こうしてコンパイルすると、以下のコードが出力されます。
.section .rodata .LC2: .string "s = %d" .text .align 4 .globl main .type main,@function main: pushl %ebp movl %esp,%ebp subl $32,%esp movl %ebx,-4(%ebp) movl $0,%eax movl %eax,-28(%ebp) movl $0,%eax movl %eax,-24(%ebp) .L0: movl -24(%ebp),%eax movl $10,%ebx cmpl %ebx,%eax jl .L4 movl $0,%eax jmp .L5 .L4: movl $1,%eax .L5: cmpl $0,%eax je .L1 movl -28(%ebp),%eax movl -24(%ebp),%ebx addl %ebx,%eax movl %eax,-28(%ebp) movl -24(%ebp),%eax movl $1,%ebx addl %ebx,%eax movl %eax,-24(%ebp) jmp .L0 .L1: movl -28(%ebp),%eax pushl %eax pushl $.LC2 call println addl $8,%esp .L3: movl -4(%ebp), %ebx leave ret