xmas.c のコード解析
- 1988年に作られた
xmas.c というCコードは、国際難読化Cコードコンテストで優勝した。
- このコードは出力物よりも小さなサイズで、テキスト圧縮の標準に新たな方向性を示した。
- コードをコンパイルして実行すると、引数なしで動作し、面白いことにタイプライターのキーを無作為に打ちつけたように見える。
コードの出力
- コードを実行すると「The Twelve Days of Christmas」の歌詞が出力される。
- 出力内容は、クリスマスの第1日目から第12日目までの贈り物を列挙した歌詞である。
解析
- コードを理解するためには、より読みやすい形に書き直す必要がある。
- 書き直しの過程で、特定の文字列を使って換字暗号を解読する仕組みが明らかになる。
- 変数
t は再帰の方向を制御するうえで重要な役割を果たす。
- コードは再帰によって換字暗号を解読し、クリスマスソングの歌詞を出力する。
簡略化
- プログラムを理解した後は、一部のループとC文字列ライブラリ関数を使ってコードを簡略化できる。
- 最終的にコードを簡略化すると、単に歌詞を出力するだけのものにまで縮小できる。
GN⁺の見解
- 創造性の極致:
xmas.c のコードは、換字暗号と再帰を使って難読化コードを書いた優れた実例である。これは、プログラミングにおいて創造性がどのように表現されうるかを示している。
- 教育的価値: コードを解析して理解する過程は、初級ソフトウェアエンジニアにとってプログラミング技能を向上させる良い練習になりうる。
- 面白さと興味深さ: このコードは、プログラミングの面白さを発見し、複雑な問題を解決する楽しさを体験できる機会を与えてくれる。
1件のコメント
Hacker Newsのコメント
TeX の世界における似た例として
xii.texがある:pdftexを実行すると、予想とは異なる結果が得られる。shreevatsa.net で確認できる。このコードはコルモゴロフ複雑性を思い起こさせる:
元の公開当時にこのコードを受け取ったが、ファイル名が違っていた:
carol.cという名前で保存されており、最新のシステムでコンパイルして実行してみると、コンパイラが警告メッセージを出力した。IOCCC (International Obfuscated C Code Contest) は 2023 年でもなお活発だ:
警告を無効にすると、最新のコードリポジトリ (trunk) でも動作する:
Rosetta Code にも似た作業がある:
大学の最終学期に、教授が講義の冒頭でこのコード片を見せてくれた良い思い出がある:
大学時代、C 言語の印刷された学習資料にこのコードが載っていて、一度自分でタイプした記憶がある:
このコードは非常に古いバージョンの C 言語を使っている:
main関数のシグネチャが古い K&R スタイルを使っているので、現在ではコンパイルできないだろうという意見を述べている。IOCCC でラリー・ウォールが 2 度も優勝したことと、彼が Perl を設計したことの関連は興味深い点の 1 つだ: