史上最悪の読みにくいコードを書く技術
ソースコードファイルを開いたとき、通常のループや条件分岐の代わりに、電車や世界地図の形をしたASCIIアートが表示される景象を想像してみてください。コンパイルを実行すると、この「絵」が突然、動作する電卓やチェスエンジンに変身します。これは魔法ではなく、IOCCCです。C言語で最も難解なコードを書くためのインターネット最古のコンテストです。
winnerリポジトリは、1984年以降の国際難解Cコードコンテスト(International Obfuscated C Code Contest)で受賞した全作品の巨大なアーカイブです。これは奇妙なファイルの寄せ集めではなく、C言語標準の暗い角落と人間の創意工夫の真の百科事典です。
コードをいじり倒すというアイデアはどこから来たのか
すべては1984年3月に始まりました。Landon Curt NollとLarry BasselはNational Semiconductorに勤めており、古いBourneシェルのコードとfingerユーティリティのバグを修正しようとしていました。コードはあまりにも酷く、マクロの使いすぎと構造の欠如により、Landonは思いました:もし人々が意図的に悪いコードを書き始めたらどうなるだろうか?
こうしてコンテストが生まれ、2つの目標が設定されました。第一に、対比によってコードのクリーンさがなぜ重要かを示すこと。第二に、コンパイラの限界と言語のニュアンスへの知識テストすること。作者たちはこれを「風刺的プログラミング」と呼んでいます。
このアーカイブで見つけられるもの
リポジトリ内ではフォルダは年別に整理されています。各フォルダには、プログラムのソースファイル、ビルド用のMakefile、審判による説明ファイルが含まれています。
パズルプログラム
多くの作品は文字のランダムな集合のように見えます。コードを見ても、コンパイルするまでは何をするのかわかりません。例えば、プログラムは円周率を計算するかもしれませんが、ソーステキスト自体が視覚的に円の形をしていることがあります。
マクロの極限的な使用方法
参加者はCプリプロセッサを、まるでコンパイル前にプログラムロジックを完全に書き換えてしまうような方法で使います。これは、#defineが実際にはどのように動作し、どのように悪用できるかを学ぶ素晴らしい方法です。
自明でないCルールの悪用
このアーカイブにはほとんどの開発者が知らない演算子の優先順位を使用した例であふれています。これにより、言語標準を掘り下げ、a[i]がi[a]と同じ理由や、この知識がロジックを隠すのにどう役立つかを理解する必要があります。
これらの名作を学ぶ方法
VS Codeでファイルを開いて読もうとするのは悪い考えです。ほとんどの場合、一文字変数の乱雑さと奇妙な定数が見えるでしょう。コンテストの審判は独自の調査アルゴリズムを提案しています。
まず、コードをプリプロセッサに通す必要があります。gcc -E prog.cのようなコマンドで、すべてのコメントが削除され、マクロが展開されます。少しは明確になりますが、大した変わりはありません。
次のステップはフォーマットのユーティリティ(ビューティファイア)の使用です。しかし注意してください:一部のプログラムは、マクロがブロック構造を定義しているために、フォーマッタがクラッシュしたりロジックを壊したりするように、非常に巧妙に書かれています。
最も確実な方法は、コードを実行することです。各フォルダには、どの引数を渡すかとどのような出力を期待するかの説明があります sometimes、プログラムはMakefileで指定されている特定のコンパイラフラグを必要とします。
通常の開発者にとっての実用的な利点
なぜすべての良識のルールを破るコードを見る必要があるのか、不思議に思うかもしれません。実際には、素晴らしいトレーニング場です。
- 言語の深い理解。IOCCC受賞作を分析することで、教科書の何倍も副作用、型昇格ルール、メモリ管理について学べます。
- デバッグとリファクタリング。Linuxロゴ形式で書かれた512バイトのプログラムを理解できれば、仕事での通常の「レガシー」コードは子供の童話のように感じるでしょう。
- コンパイラの動作理解。現代のコンパイラがどのような最適化を行うか、そしてどの構造で躓くかが見えます。
このリポジトリを覗くべきか
パズルが好きで、C言語の知識を限界まで試したいなら—答えは絶対的にYESです。展示品が(そしてそうすべきですが)実行できるデジタルアートの美術館のようなものです。
ただ、仕事のプロジェクトで、このスタイルを真似しようとしないでください。プロジェクト作者自身が警告しています:「このスタイルでコードを書かないでください!」。このリポジトリの存在理由は、極端な例を示すことであり、 реальной жизниでは決してそれに近づかないことです。
学習は初期の年から始めるのが最好です。例えば、1984年や1985年です。そこにあるプログラムはまだ比較的短く、頭の中で逆コンパイルしやすいです。現代に近づくほど、難読化技術は高度になります。
関連プロジェクト