Quine-relay Advent calendar 反省会
企画について
当初は「1 日 1 言語を紹介しながら追加していく」という企画を目論んでいました。しかし Quine リレーに追加する過程では、Hello, world 程度の知識(+重箱の隅をつつくような知識)しか身につかないので、紹介できるほどのネタはなく、淡々と追加報告していくだけという結果になりました。企画倒れ。
まあ、100 言語版を一気に作るのはモチベーションの点で難しかった気がするので、1 日 1 言語ずつ地道に進められたのは良かったのかもしれない。
難しさについて
50 言語版 Quine リレーのスポイラーでも書きましたが、Quine リレーに言語を追加するのは実務的には簡単で、パッケージ名やビルド方法やコード断片を書いたクラスを 1 つ定義するだけです(わかりやすい例:haXe)。というか、そうなるように基底クラスやコード生成コアを書いてます。
ただ、言語間に暗黙的な依存関係が数多くあって、実際に追加してみるといろいろはまります。例えば今の Shell や Verilog のプログラムではバックティックを出力できない*1ので、それより先のプログラムでバックティックを使ったらいけないとか。コードが大きくなると Java の圧縮展開アルゴリズムのバッファサイズを広げないといけないとか。他にも思い出せない制約やノウハウがいろいろあったはずです。
そのうち整理しないとなあ、とずっと思ってましたが、目標地点まで到達してしまったのでやらない。そして後のメンテの時に泣くのでしょう。
Travis CI について
Quine リレーの動作デモとして、Travis CI を利用してみました。100 言語動いた様子。
Travis CI は Ubuntu のバージョンが 12.04 LTS と古いですが、適当に PPA を入れることで対処しています。メモリ不足でプロセスが死ぬ問題にも悩まされましたが、数回に一度はパスするので、リトライを繰り返すことで強引に解決しました。
Travis CI の中の人(@hiro_asari さんなど)には、いろいろ情報頂いたり、デバッグ用の一時 VM を提供頂いたり、支援いただきました。ありがとうございました。
まあ、Travis CI は 100 のプログラミング言語の対応実績がある、と唄えばいいでしょう。(なぜか上から目線)
(そういえば Dockerfile も作りたいなあと思ってましたがやらなかったなあ。)
追加を断念した言語たち
最後に、追加しなかった・できなかった言語たちを並べて追悼しておきます。なお、言語の選定基準はマイナス 25 日目に書いてあります。
QCL
量子計算のためのプログラミング言語。今の Quine リレーには A から Z のうち Q で始まる言語だけが欠けているので、それが埋まるという意味でも、さらに量子計算というネタ的にも、ぜひ入れたい言語でした。しかし、出力の先頭に ": " というプロンプトが強制的につくという致命的な仕様があり、直後の R でどうやっても構文エラーになるので、導入を断念しました。
Qalb
アラビア語で記述するプログラミング言語。これも、ネタ的にも Q 的にも大変魅力的だったのですが、ブラウザで動く処理系しかないっぽいのが致命的で断念しました。
QuakeC
Quake というゲームを拡張するための言語らしい。これはなんと Ubuntu にパッケージがあるようです (fteqcc) 。しかし、「progs.src という名前のファイルを含んだディレクトリ」をソースコードとみなす仕様らしいのがどうしても気に入らず、導入しませんでした。
Agda
依存型関数プログラミング言語。主に定理証明で使われます。Hello, world も書けるらしいのですが、ubuntu の Agda パッケージは ffi が含まれていない?のか、とにかくコンパイルできないので断念しました。
malbolge
最凶と名高い難解プログラミング言語。shinh さんが頑張って頑張って Hello, world を 70 バイト強を達成するという感じの言語です。
Quine リレーに追加することは、まあ考えるまでもなく無理なんですが、プログラムサイズ上限が 3^10 = 59049 バイト(しかも 1 バイトには 8 種類の文字しか書けない) ので 177147 ビットの情報しか持てません。一方で Malbolge 直後の Maxima のソースサイズが約 25kB つまり約 200000 ビットの情報を持たせなければならないので、原理的に書けません。え、圧縮?
Oz (Mozart)
よく知りませんが、昔はしばしば名前を聞いたプログラミング言語です。論理型が入ってるようなやつ。Ubuntu にパッケージがあるのですが、依存している Emacs パッケージのせいで (?) インストールできないので断念。
Shakespeare
有名な難解プログラミング言語。シェイクスピアの脚本風にプログラムを書きます。
Quine リレーに追加することは別に難しくはないと思いますが、プログラムサイズがかなりでかくなるので、やめておきました。
Chuck
音楽関係のプログラミング言語。Ubuntu にパッケージあるし入れたかったのですが、標準出力の stdout/chout が一時的に止められているということで断念。
日本語プログラミング言語
G-Portugol の時にも書きましたが、ほとんどの日本語プログラミング言語は Windows オンリーなようで、たいへん遺憾です。Mind だけは Unix 版がありましたが、Debian/Ubuntu パッケージにはなってないようなので断念。
Ezhil
タミル語で記述するプログラミング言語。見た目がたまりません。ただ、やっぱり Ubuntu パッケージがないので追加しませんでした*2。わりとアクティブに開発されてる気がするので、そのうちパッケージ化されないかな。