【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

Brainf*ck

Gtk#でBrainf*ckのGUIシミュレータ

MonoDevelopの練習の一環としてBrainf*ckのGUIシミュレータの作成手順をまとめました。Gtk#とBrainf*ckの両方が一度に勉強できる内容となっています。 mdev-bf.docx

Brainf*ckの分岐をJIT

x86の分岐命令は相対アドレス指定のため、分岐元と分岐先のアドレスが決まらなければ相対アドレスを求められません。Brainf*ckではループの先頭と末尾で分岐が出てきます。相互に分岐しているので少し複雑です。 ループの先頭 loop_begin: cmp byte ptr[esi]…

Brainf*ckでループ展開

第3回 コンパイラ実装会で@uho_iiotokoさんがBrainf*ckのトランスレータを実装されているとき、ちょっと面白いことが起きました。元はC言語で実装されたBrainf*ckからアセンブラへのトランスレータです。トランスレート対象がC言語でも同じ結果となるため、P…

Brainf*ckトランスレータ (5) 位置独立コード

前回に引き続きBrainf*ckのトランスレータを見ていきます。 まとめ: 実装例: https://github.com/mason-/cmpimpl/blob/master/python/bftran.py Mac OS Xではデフォルトで位置独立コード(PIC)が要求されます。プログラムがどのアドレスにロードされるか決…

Brainf*ckトランスレータ (4) ループ

前回に引き続きBrainf*ckのトランスレータを見ていきます。 まとめ: 実装例: https://github.com/mason-/cmpimpl/blob/master/python/bftran.py Brainf*ckでは変数の指すメモリの中身が0以外の間だけ回るループがあります。 # while (*(char *)esi) { ... } …

Brainf*ckトランスレータ (3) 変数とメモリ

前回に引き続きBrainf*ckのトランスレータを見ていきます。 まとめ: 実装例: https://github.com/mason-/cmpimpl/blob/master/python/bftran.py Brainf*ckには変数が1つあります。トランスレータではこれをレジスタに割り当てます。ABIにより関数呼び出しで…

Brainf*ckトランスレータ (2) 呼び出し規約

前回に引き続きBrainf*ckのトランスレータを見ていきます。 まとめ: 実装例: https://github.com/mason-/cmpimpl/blob/master/python/bftran.py 今回のトランスレータでは、OSごとの差異を吸収するためシステムコールを直接呼ばずにlibcを呼びます。以下に呼…

Brainf*ckトランスレータ (1) はじめに

第3回 コンパイラ実装会でざっくりとx86アセンブリのトランスレータについて説明しました。資料は特に用意せずに即席で説明したため、いくつか不備な点がありました。 64bit シンボル名のプレフィックス 記法 具体的なコードについて取り上げる前に、これら…