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などを使って実際に使える言語のコンパイラやインタープリターを作りたいと思います!