3 ポイント 投稿者 GN⁺ 2023-12-24 | 1件のコメント | WhatsAppで共有

xmas.c のコード解析

  • 1988年に作られた xmas.c というCコードは、国際難読化Cコードコンテストで優勝した。
  • このコードは出力物よりも小さなサイズで、テキスト圧縮の標準に新たな方向性を示した。
  • コードをコンパイルして実行すると、引数なしで動作し、面白いことにタイプライターのキーを無作為に打ちつけたように見える。

コードの出力

  • コードを実行すると「The Twelve Days of Christmas」の歌詞が出力される。
  • 出力内容は、クリスマスの第1日目から第12日目までの贈り物を列挙した歌詞である。

解析

  • コードを理解するためには、より読みやすい形に書き直す必要がある。
  • 書き直しの過程で、特定の文字列を使って換字暗号を解読する仕組みが明らかになる。
  • 変数 t は再帰の方向を制御するうえで重要な役割を果たす。
  • コードは再帰によって換字暗号を解読し、クリスマスソングの歌詞を出力する。

簡略化

  • プログラムを理解した後は、一部のループとC文字列ライブラリ関数を使ってコードを簡略化できる。
  • 最終的にコードを簡略化すると、単に歌詞を出力するだけのものにまで縮小できる。

GN⁺の見解

  • 創造性の極致: xmas.c のコードは、換字暗号と再帰を使って難読化コードを書いた優れた実例である。これは、プログラミングにおいて創造性がどのように表現されうるかを示している。
  • 教育的価値: コードを解析して理解する過程は、初級ソフトウェアエンジニアにとってプログラミング技能を向上させる良い練習になりうる。
  • 面白さと興味深さ: このコードは、プログラミングの面白さを発見し、複雑な問題を解決する楽しさを体験できる機会を与えてくれる。

1件のコメント

 
GN⁺ 2023-12-24
Hacker Newsのコメント
  • TeX の世界における似た例として xii.tex がある:

    • TeX 文書に複雑そうなコードを入れて pdftex を実行すると、予想とは異なる結果が得られる。shreevatsa.net で確認できる。
  • このコードはコルモゴロフ複雑性を思い起こさせる:

    • 理解しにくいコードが望んだ結果を生み出すのを見ると、もっと短くて同じ結果を出すプログラムがあるのではないか、それをどう見つけるのかという好奇心が刺激される。
  • 元の公開当時にこのコードを受け取ったが、ファイル名が違っていた:

    • carol.c という名前で保存されており、最新のシステムでコンパイルして実行してみると、コンパイラが警告メッセージを出力した。
  • IOCCC (International Obfuscated C Code Contest) は 2023 年でもなお活発だ:

    • IOCCC の説明が素晴らしく、www.ioccc.org で確認できる。
  • 警告を無効にすると、最新のコードリポジトリ (trunk) でも動作する:

  • Rosetta Code にも似た作業がある:

    • 「Old Lady Swallowed a Fly」という、だんだん長くなる歌を繰り返し生成するプログラムの例がある。rosettacode.org で確認できる。
  • 大学の最終学期に、教授が講義の冒頭でこのコード片を見せてくれた良い思い出がある:

    • 2022 年当時、教授の講義でこのコードに初めて触れた体験を振り返っている。
  • 大学時代、C 言語の印刷された学習資料にこのコードが載っていて、一度自分でタイプした記憶がある:

    • C 言語を学ぶ際に実際にこのコードを自分で入力したことが、印象に残る経験になった。
  • このコードは非常に古いバージョンの C 言語を使っている:

    • main 関数のシグネチャが古い K&R スタイルを使っているので、現在ではコンパイルできないだろうという意見を述べている。
  • IOCCC でラリー・ウォールが 2 度も優勝したことと、彼が Perl を設計したことの関連は興味深い点の 1 つだ:

    • Perl の設計者が IOCCC で受賞した経歴は、Perl 言語の特徴を説明しているような印象を与える。