COINS で Brainfuck のコンパイラ (1)

「COINS を使えば簡単にコンパイラが作れるよ」という宣伝文句にのせられて、試しに COINS を利用して Brainfuckコンパイラを作ってみましょう。実用上の意味はありませんけれども、入門編ということで。

参考文献は

あたりです。

JDK、ANT のインストール

COINS のコンパイラ(C、Fortran77)を利用するだけなら JRE だけでもいいですけど、コンパイラを作りたいならば JDK 1.4 以降と Apache Ant が必要。なんかまあ、適当に入れておいてください。
公式には JDK 5 までが動作確認されてるみたいです。一応手元の環境では JDK 6 で動かしてますけど、(たぶん)ちゃんと動いてます。
あと GNU Make も必要なので、無い人はそれも。

COINS のインストール

まずはアンケートなどに答えつつ、Jar アーカイブのダウンロードを。
http://www.coins-project.org/download/dl.cgi
ダウンロードするのはどっちでもいいですけど、まあ日本語のドキュメントなどが付いててお得ってことで日本語版で。

適当なところにインストールしましょう。ここでは「~/lib」あたりにインストールしてみます。

~/lib  % jar xf coins-1.4.2.2-ja.jar
~/lib  % cd ..
~  % cat >hoge.c
#include <stdio.h>
int main(){puts("hogehoge");}
~  % java -classpath lib/coins-1.4.2.2-ja/classes coins.driver.Driver -coins:assembler=as -b x86 hoge.c
~  % ./a.out
hogehoge
~  %

うーん大学で生まれたものなんて「がくじつてき」にはきっとすごいんだけど使いにくいに違いない、という俗な偏見を砕く簡単さ。

COINS の開発環境づくり

そこまでやったら、あとは coins-1.4.2.2-ja/src 以下に 適当なディレクトリを掘って、コンパイラドライバと対象言語(Brainfuck)から HIR(高水準内部表現)への変換のためのコードを書けばいいだけです。

クラスパスの設定

bash 系だったら .profile とかに「 export CLASSPATH=$CLASSPATH:.:~/lib/coins-1.4.2.2-ja/classes 」とか、csh 系だったら setenv とかで、環境変数クラスパスに追加しておくと「java -cp ~/lib/coins-1.4.2.2-ja/classes ...」とかしなくてよくなるので、後々楽だと思います。

COINS で Brainfuck のコンパイラ (2)

とりあえず、コンパイラプログラムのドライバ部分を作ります。コマンドライン引数を読んでファイルを開いたり、オプションを設定したりほげほげほげ……というのは面倒なので、COINS で用意されている coins.driver.Driver クラスを使います。こいつを継承することで、めんどくさいところはだいたいうまいことやってくれます。
Brainfuck のフロントエンドは bffront パッケージとしてまとめて、BFDriver, BFtoHIR という二つのクラスから作ることにします。 BFDriver は coins.driver.Driver を継承した Brainfuck のドライバです。あと一つ、拡張子を設定するファイルも作る必要があります。拡張子指定ファイルは bfsuffix としました。
http://konbu.s13.xrea.com/lib/coins/bffront-070618.jar

% jar xf bffront-070618.jar
% cd bffront
% ls
BFDriver.java  BFtoHIR.java  bfsuffix  build.xml  classes/  hello.bf
% java -cp $CLASSPATH:classes bffront.BFDriver -coins:suffix=bfsuffix -coins:assembler=as -b x86 hello.bf
% ./a.out
% java -cp $CLASSPATH:classes bffront.BFDriver -coins:suffix=bfsuffix -coins:assembler=as -b x86 hello.bf -S
% cat hello.s
 .ident "Coins Compiler version: coins-1.4.2.2 + BackEnd-0.8.1"
/* JavaCG for target:x86 convention:standard */

        .section .text
        .align  4
        .global main
main:
        pushl   %ebp
        movl    %esp,%ebp
.L2:
        leave
        ret

%

見てわかりますが、まだ BFtoHIR が空っぽなので、中身が空っぽのプログラムを吐くだけです。コンパイラの体裁だけ整えたところ。
以下コード。

続きを読む

test