Сказки дедушки хакера

Рассказал мне один чудак, что пишут настоящие программисты на Фортране. Да, это быть может и так - в эру пива без алкоголя и карманных калькуляторов, но тогда, в Золотую Пору, когда Настоящие компьютеры работали на барабанах и вакуумных лампах, Настоящие Программисты писали в машинном коде. Это не был ни Си, ни Фортран, это не был даже ассемблер. Они просто писали в машиннном коде, шестнадцатиричном, прямо как есть.

Сейчас молодежь не знает, как оно было. Что ж, я скажу вам, не могу не сказать, как программы писал Настоящий Программист. Буду звать его Мелл, потому что таково было его имя.

Устроился я в фирму одну, делали они пишущие машинки. Был у них отдел, где выпускали небольшой такой компьютер LGP-30 с памятью на магнитных барабанах. И вот выпустили они новую, лучшую модель RFC-4000, с памятью на барабанах. Черт возьми, магнитные сердечники были тогда слишком дороги.

Я должен был написан компилятор Фортрана к этой дуре, и Мелл показывал мне это чудо техники. Сам Мелл не уважал компиляторы. "Что хорошего в программе, - говорил он, - если не может она изменять свой собственный код?" Мелл написал в кодах самую популярную программу для LGP-30, которая на выставках играла в очко с покупателями. Не знаю уж, помогало ли это продавать машины, мы это не обсуждали.

Ему поручили переписать программу для RFC-4000. В этой машине была необычная система адресации: каждая команда содержала там и адрес операнда, и адрес следующей команды, где та находится на вертящемся барабане. Можно было делать GOTO после каждой команды, и это потрясающе.

 

Мелл полюбил RFC с первого взгляда, ведь на ней можно было оптимизировать программы - располагать их так, чтобы вращение барабана подносило очередную инструкцию как раз тогда, когда это было нужно. Да, для этого были оптимизирующие ассемблеры, но Мелл говорил:

- Никогда не знаешь, что они куда положат. Приходится заводить отдельные константы.

Много времени прошло, пока я понял эти его слова. Мелл знал значение каждого кода и использовал их как константы - умножал на код предыдущей команды, к примеру. Читать нелегко, но никакие ассемблеры такого не умели. Код Мелла всегда работал быстрее, ведь он всегда начинал с самого вложенного цикла, и эти команды получали самые оптимальные адреса на барабане. Он еще и циклов задержки никогда не писал. Он просто располагал инструкции так, чтобы барабан лишний раз прокрутился, когда нужно было подождать.

И вот, когда даже инициализация была оптимизирована, с Самого Верха пришел приказ. Кому-то показалось, что программа играет слишком честно, потребовалось, чтобы покупатели реже проигрывали. Мелл был потрясен. Он думал, что это нечестно, а так оно и было. Мелл думал, что его личная целостность нарушается (так она и делала). Главный Инженер говорил с ним, убеждал его и Босс, и программистов заставили его убеждать, и он сдался. Он написал этот код, но одна проверка была ошибочной, и программа начинала жульничать и выигрывать, как только поворачивался рычаг. Все было ясно - подсознание победило, и Мелл воспринял это, как знак свыше.

В один прекрасный день Мелл покинул фирму, и мне поручили найти и обезвредить злосчастную проверку. Исследование Меллова кода было настоящим приключением, и я согласился.

О да! Программирование - это искусство, рубины и изумруды скрываются в некоторых программах, скрытые от постороннего взгляда. По ним, по этим изюминкам, душа программиста читается как открытая книга, написанная в шестнадцатиричном коде. Но Мелл - он был настоящим непризнанным гением.

Нашел я в его программе маленький цикл, невинно не содержащий никаких проверок. Такой цикл должен бы был повторяться вечно, ан нет - машина благополучно его миновала и выполняла последующий код. Две недели я разгадывал эту загадку, и вот какое откровение мне открылось.

Был в RFC-4000 индексный регистр - новинка, позволяющая обращаться к таблицам. Меллу не нравилась эта идея, и использовал регистр по-своему, подсчитывая в нем код инструкции. И вот в означенном цикле я заметил, что индексный бит между кодом операции и адресом установлен в единицу. Словно молния ударила в громотвод! Я понял - данные были расположены в последних адресах, и по завершении их обработки происходило переполнение поля адреса команды, к коду операции пробавлялась единица и получалась команда перехода. Перехода на адрес 0! Я был потрясен, уничтожен морально и ментально, пошел к Боссу и сказал, что понять программу Мелла невозможно. Он не был сильно удивлен.

Когда я покинул фирму, машина на выставке так и продолжала дурить игрока, повернувшего оный рычаг. Я думаю, не мне одному было страшно читать ту программу. Ведь ее написал Настоящий Программист.

По материалам древних манускиптов подготовил
Дмитрий БОРОДАЕНКО

Версия для печатиВерсия для печати

Номер: 

32 за 1997 год

Рубрика: 

Компьютерные слоВести
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!