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 が一時的に止められているということで断念。

Z80

ネタ的に入れたかったですが、標準的な入出力プロトコルがない(当たり前だけど)ので断念。

日本語プログラミング言語

G-Portugol の時にも書きましたが、ほとんどの日本語プログラミング言語Windows オンリーなようで、たいへん遺憾です。Mind だけは Unix 版がありましたが、Debian/Ubuntu パッケージにはなってないようなので断念。

Ezhil

タミル語で記述するプログラミング言語。見た目がたまりません。ただ、やっぱり Ubuntu パッケージがないので追加しませんでした*2。わりとアクティブに開発されてる気がするので、そのうちパッケージ化されないかな。

Aribas, Goo, Inform, Euler

この辺は Ubuntu にパッケージがあるのですが、何らかの理由で断念したやつらです。バナーが消せないとか、出力が勝手に整形されるとか、GUI が立ち上がってユーザの操作を待ち受けてしまうとか、そんなんだったと思います。*3

Rust, Fantom, Factor, Nemerle, Swift, Elixir, Dart, Concurrent Clean, Eupohria, Fortress, IO, Dylan, Self

この辺は Ubuntu にパッケージがないので断念。まともなプログラミング言語を名乗るなら、Ubuntu で標準的に入れられるようにしてほしい!

*1:Shell の方は普通にエスケープすればいいんだけど、Verilog ではバックティックはマクロ展開の記号で、どうもエスケープのやり方がわからなかった。

*2:バンドルするのは原則として esolang 限定。

*3:ちゃんと覚えてない。