オリンピックが始まったが、IOC ではなくて、IOCCC の話。
IOC は International Orimpic Comittiee (国際オリンピック委員会)の意味だけど、
IOCCC は the International Obfuscated C Code Contest(国際難読Cコードコンテスト)だ。
IOCCC の話は、昔の日記でちょろっと出したことがある。
「難読」ということになっているけど、この意味は多様だ。
ソースを見ても動作が想像できない、程度に考えておくとよいと思う。
だから、数学的に高度なことを行っていて想像つかないようなものもあれば、C言語の仕様を悪用しているものや、単に読む人に対する「いたずら」をしているものもある。
そしてもちろん、読めなければいいというだけではない。近年は「驚くような動作」が求められるようになっている。
昔、興味を持って入選作のプログラムを読もうとしたことがあったのだけど… いや、全く歯が立たなかった。
特に古いプログラムは、現代の環境では動かないものも多く、動作させながら理解することも難しい。
ところが数日前に、過去に入賞した全作品の解説を、日本語で行っているページが今年に入ってから作られているのを知った。
現代の環境で動かすためのパッチなども示されている。
これがまた、面白い。
解説を読んで感心したり、面白そうなプログラムは自分でも動作させてみたりしながら、何日もかけてゆっくり楽しんでいる。
いったい誰がこんなページを、と思って確認したら、近年の IOCCC で常連の日本人だった。
しかも、その受賞作のいくつかは、IOCCC とは無関係に、その動作のすごさがネットで話題になっていたりしていて、見たことがあった。
ところで、第1回大会は 1984年に開かれている
この時の大賞作品について少し話をしよう。
C言語では、プログラムの制作者は必ず「main」と名付けられたプログラムを作り、それが最初に呼びだされることになっている。
しかし、対象作品には main がない。それどころか、プログラムが1行も書かれていない。
代わりに、main という名前のデータを定義している。このデータも、意味不明の数値が並んでいるだけだ。
じつは、C言語では「名前」にプログラムとデータの区別はない。
だから、main という名前のデータがあれば、言語のシステムはそれがプログラムだと思って最初に呼びだしてしまう。
ところが、内容は数値データだ。実はこの数値データは、当時 UNIX の世界では一般的だったコンピューター、PDP-11 の機械語命令コードなのだ。
そんなわけで、このプログラムは大賞をとってはいるが、PDP-11 がないと動かない。
先に僕が「現代の環境は動かない作品も多い」と書いたが、要求されるマシン環境すら限定されるのだ。
さて、話を戻して、この解説記事を書いてくださっている人の話。
IOCCC の常連と書いたが、2015 年の作品で「1984 年の作品を動かすための PDP-11 エミュレータ」を作っている。
これにより、PDP-11 がないと動かないはずの作品ですら、動作させることに成功している。
とにかくこのコンテストが好きで、過去の作品の動作も見てみたい、という愛にあふれている。
愛のある人が解説をしているのだから、その面白さは保証されていると言ってよいだろう。
最後に自分の想い出語り。
このコンテストの「存在」を知ったのはずいぶん昔…年齢がばれるが、大学生の時に友人から聞いたもので、1992年ごろだったと思う。
その時はまだ WEB も普及していなかったし、話に聞いただけで作品を直接見たわけではない。
でも、 2["abc"] と書くことで c を取り出せるとか、配列に機械語を入れて呼び出すことができるとか、C言語の「低レベルな」仕様の話を聞いて、すごく面白いと思ったものだ。
(僕は当時、PDP-11 を参考に作ったという MC68000 CPU のアセンブラは理解できていて、C言語も初心者ではあったが理解していた。そのため、 [ ] が配列を意味するのではなくアドレス演算にすぎない、という話は素直に理解できたのだ)
当時の理解としては、とにかく仕様の穴を突くようなプログラムテクニックを競う、というようなものだと思っていた。
いや、実際初期の作品はそういうものも多い。
でも、制約の中で複雑な動作をつくる、という側面も大きい。
今だと、C言語以外でも文字数の制約の中でプログラムを作るようなコンテストは行われているのだけど、そういうコンテストのさきがけの一つともいえる。
となると、そこには単に「難読」というのを超えた、素晴らしい工夫がたくさん入っているのだ。
日本語解説ページで取り上げられている作品は非常に多く、まだ全部は読めていないが、そうした工夫を見るのは非常に楽しい。
とりあえず、コンテストの比較的初期の中から気に入った作品を1つ上げておこう。
この作品は、プログラムが「往復書簡」のように読めるように作られている。
もちろん、C言語のプログラムとしての制約があるため、英語そのものではない。でも、「英語っぽく」読めるように工夫されているのだ。
往復書簡の登場人物は、 char*lie と char lotte 。チャーリーとシャルロット、なのだけど、C言語の char 型の変数定義になっている。
英語そのものではないが、英語っぽく読める、というのはそういうこと。
で、この二人がラブレターを送りあっているのだけど、途中から仲たがいして、破局に至るまでがつづられている。
これはプログラムなので、コンパイルして実行できるのだけど、花占いのプログラムになっている。
「好き」「嫌い」って交互に表示するプログラムなのね。
で、これを作った作者のコメントによれば「char*lie と char lotte は非互換」とのこと。
(C言語わかる人ならわかるね)
つまり、英語のラブレターとして読めて、C言語のプログラムとしても読めて、実行すると恋愛占いで、その登場人物の相性が悪いのは最初からわかってるだろ、と、4つも意味を重ね合わせている。
超絶技巧。
これは、ソースコードが英語だ、というわかりやすさがあったので紹介したけど、他にも舌を巻くような作品ばかり。
行単位でランダムにソートしても、必ず動くプログラムになる作品、なんていうのもあったな。
プログラマーなら読んでみると楽しめると思う。
同じテーマの日記(最近の一覧)
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |