「10日くらいでできる!プログラミング言語自作入門」の続編#1-6b
(1) HL-16b
- HL-16aまでで、JITコンパイラの作り方の説明は一通りできたと思っています。だから次は、JITではない普通のコンパイラの作り方をやりたいと思います。
- 普通のコンパイラなら、JITコンパイルした機械語を出力すればいいわけなのですが、世間的にコンパイラとして期待されるのは、機械語の出力ではなくてアセンブラ用のソースコードを出力することのようです。ただ機械語を出すだけでよければ、「codedump 1」でほぼできたようなものだったのですが、しょうがないのでもうちょっと作りこむことにします。
- さてアセンブラを出力するといっても、アセンブラごとに多少の方言があるので、どれにするか決めなければいけません。今回は私の趣味で、 NASM を選ぶことにしました。ということで、 NASM のインストール方法を紹介します。
- 次に考えたのは開発方針です。普通に考えれば、putIcX86()を改造してputIcNasm86()を作るのがよさそうなのですが、それは今から作るにはちょっと面倒そうです。それで、まあ、すごく変わっているのですが、putIcX86()はそのままにして、生成した機械語を逆アセンブラでアセンブラソースコードに変換するという方法で、目的を達成しようと思います。
- 普通のコンパイラの世界では、コンパイラがアセンブラのソースコード生成してそれをアセンブルして機械語に変換するものですが、HL-16bでは、機械語を生成してからアセンブラのソースコードを作り直すというわけです。
- まあ結局、こんな変わった作り方をする人は少ないと思うので、これはやってみたら面白いかも?って思ったから、これにしただけです。たぶん素直にputIcNasm86()を作って全体を再構成するほうが総行数は少なくなるはずです。
- この変な作り方のおかげで、HL-16bは普通のコンパイラとして使えますが、HL-16aまでのJITコンパイラとしても使えるようになっています。
- ということで、「codedump 2」にしたらアセンブラ用のソースコードが出力されます。変数codedumpの初期値を2にしておけば、
prompt>hl16b mandel.c
とするだけでいきなりソースコードが出てくるようになるので、すごく普通のコンパイラっぽくなります。コマンドライン引数を指定しないで起動すれば、従来通りプロンプトが出るので、そこで「codedump 0」を実行すれば、HL-16aと同じになります。
次回に続く
こめんと欄