Эта заметка была впервые опубликована в Usenet автором utastro! Вернее, 21 мая 1983 года.
Вполне вероятно, что на момент публикации вы еще даже не родились.
Мы считаем, что эту историю необходимо сохранить хотя бы потому, что теперь от реального «железа» нас отделяет толстый слой абстракций.
Читайте и получайте удовольствие! В одной из недавних статей [относительно 1983 года – прим.
перевод.] В книге, посвящённой так называемому «программированию для крутых мачо», автор без колебаний заявил: «Настоящие программисты пишут на Фортране».
Что ж, вполне возможно, что в эпоху светлого пива, портативных калькуляторов и «удобного» программного обеспечения это действительно так.
Однако в старые добрые времена, когда сам термин «программное обеспечение» казался смешным, а компьютеры были напичканы всевозможными барабанами и электронными лампами, все было совсем по-другому.
Настоящие программисты знали, как писать машинный код. Да-да, вы правильно поняли: они использовали те самые «грубые, непонятные, неотесанные» 16-битные числа.
Напрямую.
Чтобы целое новое поколение программистов не утратило знаний о славном прошлом своих «отцов», я считаю своим долгом как можно подробнее рассказать, как писал код «настоящий» программист. Его будут звать Мэл, потому что именно так было его настоящее имя.
Я встретил Мела, когда устроился на постоянную работу в Royal McBee Computer Corp., ныне несуществующую дочернюю компанию компании по производству пишущих машинок.
Компания Royal McBee разработала LGP-30, небольшой, относительно дешевый (по меркам того времени) компьютер с барабанной памятью, и готовилась начать производство новой машины RPC-4000, существенно модифицированной и улучшенной модели с использованием (бадум тсс!) та же самая барабанная память.
Однако новые модели оказались непомерно дорогими, и рынок их отверг.
Думаю, именно по этой причине вы никогда не слышали ни об этой компании, ни о самой машине.
(На самом деле автор здесь немного лукавит. Машина от компании Royal «засветилась» в романе Стивена Кинга «Мизери».
Однако на Кинге (и паре других фантастов) славная история Royal заканчивается.
- прим.
перевод.) В частности, я писал компилятор FORTRAN для этой чудо-машины, а Мел был моим «проводником» по ее электронным тонкостям.
Итак, Мел не одобрял компиляторов.
«Если программа не может переписать свой собственный код, — спросил он, — какой в этом смыслЭ» Среди заслуг Мела - написание (в шестнадцатеричном машинном коде) самой популярной программы компании - блэкджека.
На компьютерных выставках потенциальные покупатели могли взять на вооружение ЛГП-30. Надо ли говорить, что игра имела оглушительный успех? На каждой выставке стенд LGP-30 был переполнен, а продавцы машин IBM праздно болтали между собой, лишенные публики.
Что касается реальных продаж наших компьютеров, то мы старались не поднимать этот вопрос.
Теперь задачей Мела было переписать блэкджек для RPC-4000. (Портирование? Что это?) Новый компьютер имел схему адресации «один плюс один»: каждая машинная инструкция, помимо кода операции и адреса операнда, имела дополнительный адрес, указывающий, где на вращающемся барабане находится следующая инструкция.
Говоря современным языком, за каждой инструкцией следовала команда GO TO. Каково это, а? Набить трубку Паскаля этой чепухой и затянуться, чтобы ее понять! Мелу понравился RPC-4000. На нем удалось оптимизировать код, разместив инструкции на барабане таким образом, чтобы по завершении одной можно было немедленно выполнить вторую.
Для этой цели у нас была специальная программа — оптимизирующий ассемблер, но Мэл отказался ею пользоваться.
«Никогда не знаешь, куда и что он вставит, — объяснил он, — и тебе придется использовать дополнительные константы».
Прошло много времени, прежде чем я полностью понял это замечание.
Мел знал числовое значение каждого кода операции и мог назначить на барабане свои собственные адреса.
И каждую написанную им инструкцию можно было считать числовой константой.
Например, он мог взять инструкцию сложения (если, конечно, она имела нужное значение) и умножить на нее другое число.
Так что с кодом Мела мог работать только сам Мэл.
Я сравнил программы Мела, оптимизированные вручную, с результатами оптимизации ассемблера на том же исходном коде.
А результаты Мела всегда были лучше.
Я думаю, это потому, что метод разработки «сверху вниз» еще не был изобретен.
А даже если бы и был, Мэл все равно отказался бы им воспользоваться.
Мел сначала написал самые сложные части программных циклов, чтобы сначала разместить их по оптимальным адресам барабанов.
Наш оптимизирующий ассемблер оказался не таким хитрым и дальновидным.
Более того, Мел никогда не использовал циклы для создания задержки выполнения кода — даже несмотря на то, что неуклюжему Flexowriter для корректной работы требовался перерыв между выходными символами.
Печатающее устройство Flexowriter 2201 Programmatic, https://upload.wikimedia.org Мел разместил инструкции на барабане таким образом, чтобы каждая из них проходила мимо считывающей головки точно в нужный момент. Барабану понадобился один полный оборот, чтобы найти следующий – это и есть необходимая задержка.
Я никогда не забуду термин, который он придумал для этой процедуры.
Слово «оптимальный», несмотря на его абсолютный характер, часто употребляется в относительном значении: «субоптимальный» или, например, «совсем не оптимальный».
Мэл пошел еще дальше.
В рамках своего подхода он назвал максимально возможную задержку «абсолютным пессимумом».
Закончив переписывать блэкджек и протестировать его на компьютере («Даже инициализатор оптимизирован», — похвастался Мэл), он ни с того ни с сего получил запрос на доработку от отдела продаж.
В программе использован очень элегантный (оптимизированный) генератор случайных чисел для операций перетасовки карт и раздачи рук из «колоды».
Часть продавцов посчитала «несправедливым», что покупатели периодически теряют. Соответственно, перед Мелом была поставлена задача модифицировать программу так, чтобы при нажатии сенсорной кнопки на консоли компьютера программа «подыгрывала» клиентам.
Мэл возмутился.
Он посчитал, что это нечестный ход (так и было!), реализация которого к тому же нарушила его честность как программиста.
Он наотрез отказался менять программу.
Главный продавец, его начальник и некоторые коллеги по очереди уговаривали Мела изменить код. В конце концов Мел сдался и закончил игру.
Правда, в обратную сторону: когда переключатель был включен, программа жульничала и побеждала, а когда он был выключен, она вела игру честно.
Мэл был доволен своим решением.
Он утверждал, что его подсознание «неконтролируемо этически», и категорически отказывался от дальнейших исправлений.
Пожалуй, это одна из немногих фотографий, на которых изображен Мел (та, что справа на заднем плане).
// Источник: verdantforce.com После того, как Мэл ушел из компании ради более экологичной работы, Большой Босс попросил меня посмотреть код и попытаться удалить из него «совесть» Мела.
Я согласился, но без особого желания.
Работа с программой Мела грозила превратиться в приключение.
Я часто ловлю себя на мысли о программировании как об отдельном виде искусства, реальную ценность которого могут оценить только посвященные.
Код может содержать великолепные жемчужины, блестящие открытия, скрытые от обычных глаз, иногда даже навсегда, в силу особенностей процесса.
Вы можете многое узнать об авторе программы, прочитав его код, даже в шестнадцатеричных числах.
Лично я считаю, что Мэл был невоспетым гением.
Наверное, самым большим потрясением для меня стал один невинный безусловный цикл.
Серьезно, у него не было ни одного пункта о выходе.
Здравый смысл подсказывал мне, что программа будет работать на нем бесконечно долго.
Однако на самом деле компьютер без проблем вошел в цикл и вышел из него.
Мне потребовалось две недели, чтобы понять, как Мел это сделал.
Парадоксально, но факт: компьютер LGP-30 (на фото выше) известен только потому, что некий настоящий программист Мэл написал для него удивительно «оптимальную» программу для блэкджека, https://upload.wikimedia.org В компьютере RPC-4000 был один действительно современный инструмент — индексный регистр.
Это позволяло программисту организовывать циклы с использованием так называемых индексированных инструкций.
Каждый проход добавлял число в индексном регистре к адресу операнда, в результате чего получался адрес следующего элемента данных в массиве.
Оставалось только каждый раз увеличивать содержимое индексного регистра на единицу.
Мэл никогда им не пользовался.
Вместо этого он помещал инструкцию в машинный регистр, добавлял единицу к ее адресу и сохранял ее.
Модифицированная инструкция затем может быть выполнена непосредственно из регистра.
Цикл был организован таким образом, чтобы предоставить дополнительное время для выполнения такой инструкции.
Как только он «кончался», прямо под считывающей головкой барабана появлялся следующий, готовый к чтению и исполнению.
Но этот цикл также не имел условия выхода.
Я заметил, что установлен бит, указывающий на использование индексного регистра (бит, расположенный между адресом и кодом операции в командном слове).
Это была важная подсказка: Мел никогда не использовал индексный регистр, оставляя его значение равным нулю.
Подход Мела буквально ослепил меня изяществом и совершенством.
Он размещал все данные, с которыми работал, по верхним адресам памяти, поэтому после обработки последнего элемента увеличение адреса инструкции приводило к переполнению.
Бит переноса добавил единицу к коду операции, заменив его значение инструкцией перехода.
Разумеется, следующая инструкция программы сохранялась по нулевому адресу, и программа успешно продолжала свой путь.
Я не поддерживаю связь с Мелом, поэтому не знаю, поддался ли он водовороту перемен, охватившему мир программирования в последние годы.
Лично мне нравится думать, что он все еще работает по-старому.
Меня настолько впечатлила работа Мела, что я перестал искать «баг», приводящий к жульничеству в блэкджеке.
Я сказал своему начальнику, что не справлюсь — он кивнул и, похоже, не удивился такому исходу.
Когда я ушел из компании, программа блэкджека все еще жульничала при включении кнопки.
Думаю, я поступил правильно.
Мне было стыдно взломать код настоящего программиста.
Послесловие от 2021 года
К сожалению, история не сохранила для нас других упоминаний о «настоящем программисте» Мелвине Кэе.История Р.
Эдварда Натера (1947-2014) — своего рода памятник программистам, которые видели код не как нагромождение инструкций и функций, а как целостное произведение интеллектуального искусства.
Напоследок напишем несколько слов о самом Натере.
Эд Натерhttps://upload.wikimedia.org В научных кругах он был известен прежде всего как астроном, профессор Техасского университета (Остин) и специалист по астеросейсмологии, белым карликам, наблюдениям за взаимодействием потухших двойных звезд. Кроме того, Натер в течение 10 лет занимал должность директора Телескопа всей Земли.
Популярность в Интернете учёный приобрел благодаря публикации в Usenet рассказа о Мэле.
Что касается программы для игры в блэкджек, то предлагаем вам ознакомиться с инструкции о его использовании Мелом.
Для тех, кому оригинальной статьи недостаточно, вот следующая ссылка: История Мела с объяснением технических подробностей (по-английски).
Теги: #программирование #история ИТ #ИТ-компании #ИТ-компании
-
Важность Интернета
19 Oct, 24 -
Whatsapp Начал Тестировать Видеозвонки
19 Oct, 24 -
Plc100 + Labview + Джойстик V2.0
19 Oct, 24