Prokumaの雑記

限りなく日記帳に近いブログ

Brainfuckのコンパイラを書きました!

Bainfuckのコンパイラを書きました!(ただx86アセンブリコードに置き換えるだけの雑なものですが......)

Brainfuckとは

Brainfuckは酷い名前かもしれないですね.......でも言語仕様もひどいからこの名前でいいでしょう。この言語は、八つの記号でコードを書きます。

記号 機能 記号 機能
+ ポインターが指しているメモリーの値を1だけ増加 . ポインターが指しているメモリーの値をASCIIで出力
- ポインターが指しているメモリーの値を1だけ減少 , 入力を受けてポインターが指しているメモリーに格納
> ポインターを1だけ増加 [ ループの開始
< ポインターを1だけ減少 ] ループの終了(ポインターが指しているメモリが0になるとループから脱出)

上記のような仕様の言語であります。「これってどこに使うの?」と言われるかもしれないけど、この言語は、見てる通りコンパイラが作りやすいです。コンパイラを製作するためには、字句解析、構文解析、意味解析、コード生成のコードを書かないとならないですが、構造が簡単なのでそれをすごく簡単に実装することができます!

アセンブリコンパイル

アセンブリは、機械語をより見やすくしたものです(説明が雑すぎる.....)。GCCなどのコンパイラは、C言語のコードをアセンブリ言語に変換し、それをさらにアセンブラーに通してオブジェクトファイルを生成し、それをリンカーを使って実行ファイルの形にします。最近のコンパイラの製作ではLLVMがよく使われるらしいですが、今回はx86アセンブリコードを生成する仕様にしました。

ソースコード

ここ(https://github.com/Prokuma/bfcompiler)で公開しております。C言語で書いたコードで、Brainfuckのコードをアセンブリ言語に変換するだけのコードです。オブジェクトファイルの生成、実行ファイルの生成はnasm, ldを使用してください。

感想

定義上の「コンパイラ」に名乗れるものを作ったのでいい経験になったと思います!次はLLVMなどを使って実際に使える言語のコンパイラインタープリターを作りたいと思います!