自己書き換えコード
自己書き換えコードは1980年代のMS-DOS上のゲームで、コピープロテクションを隠すのに使われた。 フロッピーディスクドライブアクセス命令「int 0x13」は、実行プログラムのイメージには存在しないのだが、実行プログラムがメモリにロードされると自己書き換えを実施し、コピープロテクションのためのフロッピーディスクアクセス命令が書き込まれるようになっていた。
自己書き換えコードは自身の存在を隠したいプログラムにも使われることがある。 すなわち、コンピュータウイルスなどである。 自己書き換えコードを使用するウイルスの多くは、同時にポリモルフィックコードを使っている。 ポリモルフィック(多様)なウイルスは、ある意味で自分を突然変異させるプログラムとも言える。 動作中のコードを書き換えることはある種の攻撃(たとえばバッファオーバーラン)にも使われる。
他にも有効な選択肢がある場合は自己書き換えコードはお勧めできないという人もいる。 というのは、自己書き換えコードは理解しにくいし、後でメンテナンスが困難になるからである。
また他の人は、自己書き換えコードは単にコーディング時にやっていることを実行時にやるだけじゃないかと言う。
自己書き換えコードは初期のコンピュータで限りあるメモリ空間を節約するために使われていた。 また、単純な分岐しかないシステムでサブルーチンを実装するために自己書き換えコードを使用する場合もあった。ドナルド・クヌースのMIXアーキテクチャでもサブルーチン呼び出しを実現するために自己書き換えコードを使用していた。
また、未来の高度に進化した人工知能は本質的に自己書き換えを行うはずだと主張する者もいる。未来のソフトウェアがユーザーとのやり取りから学習し、ほとんど無限のパーソナライゼーションを提供するだろうという見方もある。
機械学習システムは一般に学習アルゴリズムは事前に用意され固定であり、パラメータを変化させることで学習を行う。しかし、Jürgen Schmidhuber は1980年代から自己書き換え式の学習アルゴリズムを自ら変更できるシステムをいくつか発表している。機能不全に陥るような自己書き換えに陥らないように、ユーザー指定のフィットネス関数などを使って、有効な書き換えのみが生き残るようにしている。
メモリやディスク容量が限られている環境で、コードを圧縮しておき、実行時に解凍してから実行する。
命令セットが非常に小さい場合、自己書き換えコードを使う以外に機能を実現できない場合がある。例えば、「減算し、その結果が負であれば分岐する」 (subtract-and-branch-if-negative) という命令しかないコンピュータも原理的には可能だが、この場合C言語での "*a = **b" に相当するような間接コピーは自己書き換えコードを使わないと実行できない。
2と3はLISPのような高級言語でもよく使われる。
Linuxカーネルは起動時に環境に応じた自己書き換えを行ったり (alternative.c)、デバッグ用のコードを自己書き換えで挿入するようにしたり (jump labels) して、コードの最適化を図っている。また、自己書き換えによって任意の位置の性能解析をすることができる (perf events)。