int main() { return 1/0; }
命令の代わりに変数の割り当てを使用する場合、このコードから数バイトを削除できます。
int main() { i=1/0; }
コードは変数
i
データ型を指定しません。 C89の仕様では、この場合は整数が暗示されることが示唆されています。 C99およびその他のCのバリアントでは、これは間違いです。 C89で記述したとします。この場合、
int main()
を
main()
短縮することさえできます。
i; main() { i=1/0; }
余分なスペースを除いて、16文字しか残っていません。最適化する場所はありません。 しかし実際には、さらに短い失敗したプログラムを書くことができます。 実際のところ、プログラムのコンパイル中に、コンパイラーは、ライブラリーおよび静的変数と関数へのシンボリックリンクを持つ1つ以上のオブジェクトモジュールを作成します。
シンボリックリンクには、変数の名前のみが含まれます。 その後、オブジェクトモジュールはリンカによって処理され、シンボリックリンクがアドレスに置き換えられ、既製の実行可能モジュールが作成されます。
コンパイラは、エントリポイント(プログラムが開始するRAMのアドレス)を設定し、オブジェクトモジュールの1つで
main
をそれにバインドします。
main
の呼び出しは、
main
が参照するアドレスで命令を実行しようとしていることを意味します。
興味深いことに、リンカは異なるオブジェクトのデータ型について何も知りません。 したがって、
main
を静的変数に置き換えると、コンパイラはオブジェクトモジュールを作成し、リンカはメモリ内のアドレスへのシンボリックリンクを置き換えます。
Jesper Equistは、このようなプログラムをCで提供しています。
int main=0;
このようなプログラムは、
main
を関数として実行しようとするためにクラッシュしますが、コンパイラーは
main
をデータを含む実行不可能なセグメントに配置しました。
さらなる最適化は明らかです。 略語
int
上記のトリックを使用できます。
main=0;
とにかく、Cの静的変数はデフォルトでゼロに初期化されるため、コードをさらに簡潔にすることができます。
main;
ここに、Cで最小の失敗したプログラムがあります。