クリスマスを前にしてBFを先に作られてしまった話2012年11月11日 23:11

思うに、多少の欠点があっても目をつぶることって、ときにすごく大事なんだなって思います。 なんだそりゃって話なのですが、作ったBFの紹介で先を越されてしまって、大変くやしい思いをしてます。 この記事を読む大部分であろう異性愛者の男性の方々におかれましては、そんなにホイホイとBFをつくってしまっていいのか、あるいは果てしない苦労の先に手にいれるのがBFでいいのか、ちょっと落ち着いて考えるべきだと思います。

……ええと、おわかりだと思いますが、BFはもちろんbrainf*ckのことです。彼氏などいない!

キーボードマクロでbrainf*ckデバッガつくったよ

Vimで brainf*ck を作る試みは過去に thincaさんのものや mattnさんのものなど、いくつかあるようです。

しかし未だにVimScriptのよくわからない私がもっとも衝撃を受けたのは、つい先日 匿名の方がマクロで作った恐ろしいものです。

うわーん、今年の Vim Advent Calendar に使おうと思ってたネタだったのに!

……というのはさておき、 発表者は私ではないかと想像された方が何人かいらっしゃったようですが、残念ながら違います。 私はあんなに頭おかしくありませんし、マクロ漁船に乗船できる自信あんまりありません(ぉ

というわけで、もはや保存しておく意義が特にない「キーボードマクロで実装するbrainf*ckに対する私なりの解」をさっさと紹介してしまうことにします。

いろいろ欠点あるのですが「これはデバッガだ!」と言い張ればそれっぽく見えないこともない気がしているのでそのように主張しつつ紹介することにします。

マクロ漁船の匿名の方の発表と重なってしまう部分もあるかと思いますがご容赦ください。

特徴

  • @b でステップ実行できます。10@b など、ステップ数を指定して実行することもできます。
  • PCとポインタとメモリ空間をすべて可視化します。編集も可能です。
  • 名前付きのレジスタを2つだけ使います。(@b@x)

実行準備

まずは、お手元のVimを起動して、[CTRL-W]n を 2回ほど実行しましょう。あと、おまじないで、ステータスラインを2〜4行ほど上に持ちあげておきます(やらないとうまく動かないことがあります)。

ここまでできたら、一番上のウィンドウにこれを書いてください。

  • yl^Wk"xY^Wj@=(@0=='>'?'^V^Wk+^V^Wj':@0=='<'?'^V^Wk-^V^Wj':@0=='+'?'^V^Wk^V^A^V^Wj':@0=='-'?'^V^Wk^V^X^V^Wj':@0=='.'?'^V^Wj"=nr2char(@x)^V^Mp^V^Wk':@0=='['?@x?'':'%':@0==']'?@x?'%':'':'').' '

なお、ここに限り「^V」のように書いてあるのは[CTRL-V]と同じ意味です。

書けましたら、"bdd します。あと 30000O0[Esc] です。

最後に、真ん中のウィンドウにbrainf*ckソースコードを貼り付けます。

…と、ここまでの操作をきちんとこなすのは結構骨なので、お手軽実行ファイルを用意しておきました。

bfdebug.vi をダウンロードして、vim -s bfdebug.vi hello.bf のようにしてVimを起動するか、起動後のVimで:so! bfdebug.viしましょう。

これで準備完了です。

実行

プログラムの実行開始したい部分、つまり先頭行1カラム目にカーソルをもってきて、1000@b などとしてみましょう。 私の手元の環境で実行してみた様子を、以下に貼っておきます。

hello.bf

無事Hello, world!が出力されましたね。

たった218バイトでbrainf*ckデバッガができちゃうなんて、Vimはほんとにすごい!

え、デバッグしてない、ですか?すいませんbrainf*ck書いたことないんです……

備考

制限がいろいろあるので、gdgdと書き並べてみます。

  • ステップ実行しかできません。一度に走らせるには9999ステップ実行とかで代用してください。
  • コメントに使える文字が限られているかもしれません。変な文字(特に括弧やバックスラッシュ)は使わないでください。試してないだけなので、意外と大丈夫かもしれませんが……
  • メモリがバイト列でないため、オーバーフロー時および負になったときの挙動に依存したbrainf*ckプログラムは正しく動作しません。
  • メモリ空間は、ひとまず30000です。増やすことはできますが、マクロ実行前に決めておく必要があります。
  • 負のアドレスにアクセスできません。
  • 出力命令「.」は標準出力ではなく、バッファへ書き出します。マルチバイト文字はおそらく正しく出力できません。
  • 入力命令「,」は未実装です。単に無視されます。
  • ブレークポイント(独自拡張)を実装するつもりだったのですが、たかだか十数バイトを書き加える気力が捻出できないため、ありません。
  • Vimでしか動きません。nvi非対応です。

ともあれ、キーボードマクロの認知度が上がって世の中に受け入れられつつあるようで、この傾向が今後も維持されることを願ってやみません。

あと、Vim Advent Calendar 2011電子書籍、無事公開されましたようで、おめでとうございます。 前回は変なこと書いてすみませんでした。