MIS.W 公式ブログ

早稲田大学公認、情報系創作サークル「早稲田大学経営情報学会」(MIS.W)の公式ブログです!

素敵な難解言語[AdventCalendar6日目]

みなさんこんにちは。カレンダーのスペルはcalend'e'rではなくcalend'a'rです。 48代の落単担当phoneです。 僕はプログラミングに関して割と広く浅くタイプなので、ならば広く浅くっぽい話をしようと、今日はプログラミングのジャンルの話を・・・する予定でしたが、文量書ける気がしなかったので、好きなことを話すことにしました。 今日の話題はBefungeです。 今日の話題はBefungeです。(再

難解プログラミング言語

さて、このBefungeは難解プログラミング言語の一つです。難解プログラミングと言うと、かのBrainfckが思い浮かぶ人もいるかもしれませんが、まあ実用性的にはそれと似たようなもんです。データ領域がスタックである、文字列や数字をそのまま格納できるなど、brainfckよりは良心的な面もいくらかあります。しかし、Befungeの何よりの魅力は、そのコードが2次元に記述されること、そしてそのコードを自身で動的に書き換えることができることです。

実行環境

実はこの言語、「コンパイルが困難な言語」をコンテンツとして作られているのですが、インタプリタを作ること自体はそう難しくないそうです。俺は作ってないけど。 これとかはjavascriptで書いてる例ですね。 これの上で動かすと、befungeがどうやって動いてるのか目に見えるので、割と楽しいです。というか、これで見ないとなんなんだかよくわからなくなって死にます。 ちなみに、SlowではなくてRunのボタンでループが終わらないコードを動かすと、ブラウザが落ちます。動作確認をしてからRunするか、実行環境を自分で作りましょう。

Hello World!

まずは定番、Hello World!を、と思うのですが、その前に言語仕様の一部をざっくり説明すると、

  • 整数を要素とする空のスタックを一つだけ持つ
  • コードの左上を(0,0)とする
  • コードは左上から右向きに読み始める

って感じです。基本的な命令文は、

image

まあ、おそらく何を言っているのかわからないと思うので、実際にコードを見てもらいましょう。


                 v
>v"Hello World!"0<
,:
^_25*,@

はい。見たところでわかりませんね。さっきのインタプリタとかで動かすと、多少は動きがわかるかと思いますが、一応説明します。 先ほど書いたように、この言語は左上から読み始めます。 ルールにそって右に行くと、まずvに当たり、方向が下になります。そしてそのすぐ下に<があるので、今度は方向が左になります。 数値、文字列は直接スタックに積むことができるので、"Hello World!“と0が後ろから積まれます。 これをこのまま出力すると"Hello World!"になるわけですが、「全部を出力」なんてことは出来ないので、ここで一苦労というか一捻りというか。 "Hello World!"を積んだ先にある、2×3ぐらいの範囲を見てください。ぱっと見ではわからないかもしれませんが、ここにループ的なものがあります。 何をしているかというと、

  • スタックの先頭を複製
  • 先頭にあるデータが0か否かを判定 0だったら終わる
  • 先頭にあるデータを出力

という流れがあります。 0か否かを判定するときも、先頭にあるデータを出力するときも、データをスタックからポップしているので、先頭の数は消えてしまいます。つまり、複製をしなければ、"el ol!"のようなよくわからない文字列が出力されてしまうのです。 この複製するという手順は、Befungeでスタックのデータを一瞬だけ参照したいときにとても大事な技術になってくるので、興味がある人は是非覚えましょう。 え?もう飽きた?

自己変更的な機能

私は最初に言いました。コードを自身で動的に書き換えることができるのがBefungeの魅力の一つだと。 実はさっきいくつかの命令は紹介していないのですが、それがこちら。

image

そして、それっぽいサンプルコードがこちら


2>:3g" "-!v\  g30          <
 |!`"O":+1_:.:03p>03g+:"O"`|
 @               ^  p3\" ":<
2 234567890123456789012345678901234567890123456789012345678901234567890123456789

これはエラトステネスの篩のコードです。らしいです。 ぶっちゃけた話これを僕は書けません。Hello Worldしか書けないような言語は経験言語に入れるんじゃないって毒舌な妹botが言ってました。 これをまたさっきのインタプリタ上で動かしてもらうとわかると思うんですが、下のところの数が列挙してあるところ、ここが空白に置き換わっていきます。 左上の2×10マスで、素数を取り出して出力、右下の2×10マスで素数以外を消してます。 ここで何が言いたかったって、こいつは自身を自身で書き換えるプログラムが書けます。 すごくない??????テンション上がらない?????? あ、上がらない。 そうですかそうですか。 お客さんのノリが悪いので今日はここで終わります。

嘘です。ネタが切れました。どっちにしろこれで終わりです。

まとめ

まあ、なにが言いたかったって、最初にも言ったとおり、こいつは、

  • コードが二次元で記述されている
  • コードがコードを書き換えられる
  • かわいい

っていうことが言いたかったんです。言いたかったんです。 こういう言語もあるよっていうので、興味を持っていただければ幸いです。 というお話でした。おしまい。

おまけ

言うタイミングを失った話。

  • Hello Worldのサンプルコードが公式とかインタプリタのページと違うのは、「二次元で記述されてるよ」ってのを言いたかったから。 載せたやつもどっかのページのサンプルだったはず。
  • この言語、正式には"Befunge-93"っていう名前で、コードの記述できる空間が80桁×45行に制限されているからチューリング完全ではない。 拡張の"Funge-98"は無制限だからチューリング完全。その上stackstackとかあったり二次元どころか三次元に記述できたりする。ヤバい。
  • 書いてみたら思ってたより文量書けなくて焦ってる。
  • タイトルのCalendarはわかってやってます。
  • まるで関係ないけどtomiokaのarqueroってハンネどこ行ったんだ。最近彼に関数型言語を勧められてる。

参考

こんなものに興味をもってしまった人へリンクを