Введение
"История Мела" – типичный образец фольклора компьютерного программирования. Её герой, Мелвин Кей, хотя изначально история была написана прозой, была кем-то изменена в форму "свободного стиха", получившую широкое распространение. О Меле Кее известно немного, кроме того, что ему приписывают "основную часть программирования" компилятора 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 содержимым адресной части слова в аккумуляторе", чтобы упростить написание самомодифицирующегося кода.
The Story of Mel is an archetypical piece of computer programming folklore. Its subject, Melvin Kaye, Although originally written in prose, Nather's story was modified by someone into a "free verse" form which has become widespread. Little is known about Mel Kaye, beyond the fact that he was credited with doing the "bulk of the programming" on the 1959 ACT 1 compiler for the Royal McBee LGP 30 computer. In Nather's story, Kaye is portrayed as being prone to avoiding optimizing assemblers in favor of crafting code to take advantage of hardware quirks, for example taking advantage of the rotation of the LGP 30's drum memory to avoid writing delay loops into the code. The story, as written by Nather, involved Kaye's work on rewriting a blackjack program from the LGP 30 to a newer Royal McBee system, the RPC 4000; company sales executives had requested to modify the program so that they could flip a front panel switch and cause the program to lose (and the user to win). Kaye reluctantly acceded to the request, but to his own delight, he got the test wrong, and the switch would instead cause the program to win every time (and the user to lose). Subsequent to Kaye's departure, Nather was asked to fix the bug. While examining the code, he was puzzled to discover that it contained what appeared to be an infinite loop, yet control did not remain inside the loop. Eventually he realized that Kaye was using self modifying code to process elements of an array, and had coded the loop in such a way as to take advantage of an Integer overflow. Adding 1 to the address field of an instruction that referred to address x normally just changed the address to x+1. But when x was already the highest possible address, not only did the address wrap around to 0, but a 1 was carried into the bits from which the opcode would be read—in this case changing the opcode to "jump to" so that the full instruction became "jump to address 0". This impressed Nather so much that, out of respect, he gave up the task and reported that he could not find the bug. The early computers of IAS machine design had no index register. Using self modifying code was necessary for array operations. The LGP 30 instruction did "replace the contents of the address portion of the word in memory location 2000 with the contents of the address portion of the word in the accumulator" to ease writing self modifying code.
История
Эссе было первоначально опубликовано в новостной группе Usenet "net.followup" 21 мая 1983 года пользователем utastro!nather (UUCP-адрес электронной почты Эда Натера в то время).