Самомодифицирующийся код
Программа, переписывающая собственные инструкции на ходу, — на первых машинах с хранимой программой это была необходимость, а не грязный трюк.
Когда инструкции и данные лежат в одной памяти, программа может рассматривать свои команды как данные и менять их во время работы. На Manchester Baby и EDSAC около 1948 года индексных регистров не было, и чтобы пройти по массиву, программа просто шаг за шагом переписывала поле адреса в собственных командах. Это было обыденностью, а не фокусом.
Индексный регистр Тома Килберна в Manchester Mark 1 (1949) сделал приём ненужным: адрес теперь можно наращивать в отдельном регистре, не трогая код. Самомодифицирующийся код превратился в то, чего стараются избегать, — его трудно читать, невозможно разместить в постоянной памяти и мучительно отлаживать. Но там, где он оправдан, он жив: JIT-компиляторы генерируют машинный код на лету, а вредоносные программы мутируют, чтобы ускользнуть от распознавания.