亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

TDDで作るbrainfuck処理系(予告編)

プログラミングのお題って、以外に難しいんですよね。

例えばProject Eulerなんかはありますが、これもなかなか固まった機能をプログラミングするのとはちょっと違う感じがします。
あとはどう書くorgってのがあったのですが、どうも現在完全にサービスが亡くなられているようです(これなんでなんでしょ・・・?)

とりあえずTDDでさくっと実装できそうなものを今探していたのですが、ふと思いついたのが「あ、インタプリタ/コンパイラとか面白そうじゃん」というもの。

え?そんなのできるわけ無いじゃんって?いやいや、そりゃモダンな言語ってーか普通の言語はまぁ無理ですとも。

そこでですね奥さん。

でも世の中には難解プログラミング言語という分野があります。こいつらの一般的な特徴は、「機械にはそこそこ処理しやすく、人間には死ぬほど読みにくく、かつチューリング完全」というヒドイ言語です。

代用的な言語にbrainfuck、whitespace、grass、Pxemなどがあります。

その中でもbrainfuckは群を抜いてシンプルな命令系統となっています(もともとの設計思想が”最小のコンパイラを作る”なので当たり前なのですが)

  1. ">" → ポインタを一つすすめる
  2. "<" → ポインタを一つ戻す
  3. ”+” → 現在のポインタが示す値をインクリメント
  4. ”-” → 現在のポインタが示す値をデクリメント
  5. ”.” → 現在のポインタが示す値を出力
  6. ”,” → 現在のポインタが示す値に入力の先頭1byteをセット
  7. "{" → ポインタが指し示す値が0ならば対応する"}"の一つ先までポインタを進める
  8. "}" → 対応する"{"へ戻る

というたった8つの命令語しか持ちません。これくらいなら実装できるかも、と思いますし、しかもこれは文字さえ入れ替えれば様々な言語に派生させることができます。こんなのとか。

おそらく四則計算プログラム並なんじゃねーの?という気も激しくしますが、面白そうだと思ったし、SLにのっけて走らせとけばそれはそれで楽しい気がするので、TDDの勉強・練習がてら作ってみます。

環境

環境はもちろんVS!と言いたいところですが、ちょっとハードに使ったことなかったし、NUnit連携機能とのからみも見ておきたいな、というところなのでSharpDevelopを使ってみようと思います。どうなんでしょうね、SharpDevelop。ユーザー少ない気はしていますが・・・。

それでは、次回よりぼちぼち初めて行きます。