As Sloth As Possible

可能な限りナマケモノでありたい

タグ:Whitespace

なんでなのかと聞かれても「なんか暇だったから…」としか。

いや元々はこう周期的に来る「なんか仕事と全然関係ないコード書きたい」期だっただけなんだけど、Goとかで遊んでる最中にひょんなことからRustを見付けてしまってへー面白そうとか手を出してみることになり、「慣れない言語を使うときはとりあえずWhitespaceの処理系を作ってみるとなんか慣れたような気分になる」という癖でですね。なんか出来ちゃった。

記事書いてる時点の最新のnightly(v0.12.0-pre)ではコンパイル通るのを確認済み(というか多分0.12.0でしかビルドできない。流石いつβが出るとも分からないα言語、0.10.0と0.11.0と0.12.0で互換性無いし、ドキュメント見に行ったら標準ライブラリを含むほとんどのAPIがexperimentalだった)。rust-albinoの方をcloneしたら最新のrustcと対応するcargoをrustupかなんかで入れて、

cargo build
するとビルドできる。homebrewでも入れられるけどバイナリだと0.11.0、ソースからのビルドだとかなり時間かかるので大人しくnightlyのバイナリ使うがよろし。

Albinoがコマンドラインツールで、こいつがWhitespaceを実行したり逆アセンブルしたりしてくれる。最初は普通にインタプリタ作ってたんだけど、例のごとくWhitespace読めないし書けないからアセンブリ言語でもでっちあげよう、あとその昔書いたDTとかも動かしたいよねー、とかやってたらいつの間にかVMとパーサが分離して副産物として何故かライブラリになっちゃったのがWhitebase

厳密に言うと本体はWhitebaceの方でAlbinoはただのインターフェースだったりするけど細かいことは気にしない。先に名前が決まったのはWhitebaseの方で、Whitespaceの命令セットを持ったVMとパーサのライブラリなので「白地」というのが由来であって決して某19歳に見えない艦長率いる連邦の戦艦ではない。合わせてツールの方はWhitedevilにしようかなーとか一瞬考えたけどコマンド名としては長すぎるしrx78とかエイリアスするはめになるのでアルビノにした。VMとパーサが分離した結果どういうわけかBrainf*ck派生の言語をWhitespaceの命令セットに変換できるようになったので、「本来白くないものまで白くなっている」からアルビノなんです。

得られたもの。Rustがなかなか触っていて楽しいということが分かった。いまどきっぽいサブコマンド型のコマンドどうやって作ってるのかなーってのが分かった。WhitespaceもしくはBrainf*ckのトークンの内部表現を返すイテレータさえ実装できれば簡単にオレオレ言語が作れるライブラリが出来たので、今後さっと言語を作ってドヤリングしたいときは一瞬で出来るようになった。Brainf*ckの任意のプログラムからWhitespaceのコードが生成できるようになった。

失なったもの。時間。結構な無駄な時間。

プログラミング言語DTを作ったところ「いいからソースを晒せコラ」と言われたので、DT処理系のソースコードをgithubに上げてみた。

faultier's esoteric at master - GitHub

正確に言うと、DTの処理系と言うか、似非VMとそれで実行できる中間言語を吐くコンパイラ群のセット。その中にDTコンパイラとサンプルも入ってます。構成整理して無駄にgemspecを作ってあるので、

$ sudo gem install faultier-esoteric --source http://gems.github.com

とかやるとesotericがインストールできる…はず。なにしろgem作るのも初めてだしそれをgithubで自動ビルドさせるのも初めてなので、なんかしくじったかもしれない。てか、初めてのgemがこれか。それでいいのか、俺。まぁいいや。あ、できた。ちゃんとできてた。一応1.8.6-p287、1.8.7-p72、1.9.1-p0では動作確認済み。大したことやってないのでまぁ動くはず。

ちなみに、esotericに含まれてるコンパイラはWhitespaceとDTだけです。HRKは白紙に戻して、Nonowaと改称した上で言語仕様から考え直すため、Decadeはfaultierが某特撮番組を観てないので、ファンの人から怒られそうなため、今バージョンでのリリースは見送りました。今バージョン、てことは、esotericはバージョンアップするものらしい。何のために。誰が得するんだ。多分次のリリースあたりではBrainf*ckとかてってってーとかが取り込まれてて、その次のリリースあたりではNonowaが実装されたりしてるんだと思う。気が向いたら。飽きてなかったら。

あ、で、使い方だけど、インストールするとesm、whitespace、dtの三つのコマンドが使えるようになるので、

$ dt -v
esoteric 0.0.1, dt 0.0.1
$ dt hi.dt
Hi!

などとすると前の記事のコードが実行できたりする。これであなたも今日からDTer。

まさかそんな馬鹿いないとは思うけど、これ一緒にいじりたい、って人がいたら「べ、別にあなたのために手伝ってあげるんじゃないんだから、ただの興味よ、興味」とかメールで送ってください。別になにもしないけど。俺がニヤニヤします。…まぁ、githubにあるものなので好きにいじってください。あ、あとVMのこととか教えてくれる人がいたらすごく喜びます。

最近「Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~」を読んで、ついカッとなって言語処理系を作ってみた。それも、チューリング完全な、本物の(ry まぁ、Whitespaceのトークンを置き換えただけだけど。

一応、上記の本に習って、ソースコードをWhitespaceの命令セットを持つ中間言語にコンパイルしてVMで実行する形にしてみた。あとはパースする部分を適当に置き換えたコンパイラを作ればそれっぽいのが簡単に作れる。んで、いくつかネタ言語を作ってみたんだけど、その中でも一番しょーもないのがDT。DTでは次のようなソースを実行することができます。("Hi!\n"を出力する)

「○○くんて、もしかして童貞?」
「どどど童貞ちゃうわっ!どど童貞ちゃうわっ!どどど…童貞ちゃうわっ!」
「えー。その慌てっぷりが余計怪しなぁw」
「…どどどどど童貞ちゃうわっ!童貞ちゃうわっ!ど童貞ちゃうわっ!どど童貞ちゃうわっ!…童貞ちゃうわっ!」
「はいはい、わ、わかったってば。そんなにムキになんないでよ。」
「…どどどどど童貞ちゃうわっ!どどどど童貞ちゃうわっ!…童貞ちゃうわっ!」
「だから、わかったってば。もう言わないから。」
「…どどどどど童貞ちゃうわっ!ど童貞ちゃうわっ!ど…童貞ちゃうわっ!」
「いやその、なんか、ほんとごめんね。そんなに気にしてると思わなかったから、あの…」
「どど…」
「(ほんとキモいなぁ…)」
「…」

バレンタインだと言うのに一体何をしてるんですかね、僕は。ちなみに「ど」「童貞ちゃうわっ!」「…」以外の文字は全て無視するので、それらの順番と数さえあってればどんなコメントを挟んでも問題ない。コメント記法とかも特にない。ちなみに上記のコードから有効な部分を抜き出すとこんな感じ。一応読みやすくするために改行は入れてある。

どどど童貞ちゃうわっ!どど童貞ちゃうわっ!どどど…
童貞ちゃうわっ!…どど
どどど童貞ちゃうわっ!童貞ちゃうわっ!ど童貞ちゃうわっ!どど童貞ちゃうわっ!…
童貞ちゃうわっ!…どど
どどど童貞ちゃうわっ!どどどど童貞ちゃうわっ!…
童貞ちゃうわっ!…どど
どどど童貞ちゃうわっ!ど童貞ちゃうわっ!ど…
童貞ちゃうわっ!…どど
………

あと他に「アイドルが機嫌良さげに踊るののワ型言語HRK」とか、「9つの世界を巡る変身ヒーロー型言語Decade」とか作ったけど、どれも今のところただのWhitespaceなのでどんなソースになるかは想像つきますね。てことで割愛。もちろんどれも入出力や四則演算やジャンプ命令を備えてますので、フィボナッチ数列を無限に出力するとか余裕だし、その気になればきっとWebアプリぐらい書けますね。やりたかないけど。ていうかどれも書くことを全く考慮してないので、俺もうざくなって似非中間言語書いてそれを置換してソースコードにするっていう本末転倒なことしないと書けない。まぁそんなもん。

そろそろWhitespaceにも飽きたので、次は何しよう。Ruby分は十分補充できたので、Objective-CでVM書くとか、Parrotの上で処理系作るとかしようかな、とか。関数型言語もまだやってないので、それを実装するのもいいし、処理系をHaskelで書いてみるとかもしたい。しょーもない見た目の「まともな」言語仕様を考えるとかもしたいなー。やってみると結構面白い。ハマる。十分脳味噌ほぐれたらちゃんとした言語処理系のソースでも読んでみよう。

と、そんな現実逃避をして過した休日。うーん、充実した土日だった。え?何?何でDTなんか作ったのって?もしかしてfaultierって童…いいいいいやいやいや。どどどどど童貞ちゃうわっ!

注意

上の言語はほんとしょーもないですが、Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~の方はちゃんと面白い本なので誤解のなきよう。変な言語も色々紹介されてるし、Rubyでサクっと言語処理系つくるやりかたも書いてあるので、オススメです。

Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
著者:原 悠
販売元:毎日コミュニケーションズ
発売日:2008-12-20
おすすめ度:4.0
クチコミを見る

追記

これ書いた後にクチコミを見たら弾さんがてってってーとかやってて、その記事のさらに元記事が結構なブクマ数だったりして、今頃それに気付いてなんか負けた気分。ぬぅ…。いいもん、ちゃんとののワさん言語完成させるから。もうなんかiPhoneで動くようにしちゃうから。配布できないけど(インタプリタは規約でAppStoreに登録できなかったはず)。

↑このページのトップヘ