Введение

"История Мела" – типичный образец фольклора компьютерного программирования. Её герой, Мелвин Кей, хотя изначально история была написана прозой, была кем-то изменена в форму "свободного стиха", получившую широкое распространение. О Меле Кее известно немного, кроме того, что ему приписывают "основную часть программирования" компилятора ACT 1 1959 года для компьютера Royal McBee LGP 30. В рассказе Натера Кей изображён как человек, предпочитающий избегать оптимизации ассемблера ради создания кода, использующего особенности аппаратного обеспечения, например, вращение барабанной памяти LGP 30 для избежания записи циклов задержки в код. В истории, написанной Натером, речь идёт о работе Кея над переписыванием программы для игры в блэкджек с LGP 30 на более новую систему Royal McBee, RPC 4000. Руководители отдела продаж попросили изменить программу так, чтобы они могли переключить тумблер на передней панели и заставить программу проиграть (а пользователя выиграть). Кей неохотно согласился на просьбу, но к своему удивлению допустил ошибку в тестировании, и переключатель вместо этого приводил к тому, что программа выигрывала каждый раз (а пользователь проигрывал). После ухода Кея Натера попросили исправить ошибку. Изучая код, он был озадачен, обнаружив в нём то, что казалось бесконечным циклом, но управление не оставалось внутри цикла. В конце концов он понял, что Кей использовал самомодифицирующийся код для обработки элементов массива и закодировал цикл таким образом, чтобы использовать переполнение целого числа. Добавление 1 к полю адреса инструкции, ссылающейся на адрес x, обычно просто изменяло адрес на x+1. Но когда x уже был максимальным возможным адресом, адрес не только возвращался к 0, но и 1 переносилась в биты, из которых считывался код операции – в данном случае, изменяя код операции на "перейти к", так что полная инструкция становилась "перейти к адресу 0". Натер был настолько впечатлён этим, что из уважения отказался от задачи и сообщил, что не может найти ошибку. Ранние компьютеры архитектуры IAS не имели регистров индексов. Использование самомодифицирующегося кода было необходимо для работы с массивами. Инструкция LGP 30 действительно "заменяла содержимое адресной части слова в ячейке памяти 2000 содержимым адресной части слова в аккумуляторе", чтобы упростить написание самомодифицирующегося кода.

История

Эссе было первоначально опубликовано в новостной группе Usenet "net.followup" 21 мая 1983 года пользователем utastro!nather (UUCP-адрес электронной почты Эда Натера в то время).