ПЕРВЫЙ СПУТНИК ЗЕМЛИ, ЧАРЛЬЗ МУР И ЯЗЫК FORTH
Машина небесной механики
Часть первая. Пчела
Октябрь 1957 года пах осенними яблоками и расплавленным тефлоном. Чарльз Мур в ту ночь ещё не знал, что история уже постучала в его дверь — просто стук этот был частотой двадцать мегагерц...
Он сидел в машинном зале, похожем на пчелиный улей, перегретый и гудящий. IBM 704 дышала лампами, как спящий кит. Сидел и смотрел на ленту самописца, которая ползла, ползла — и наконец дрогнула.
Сигнал. Пиликание. Чистое, ровное, чужое.
Первый искусственный спутник Земли, ПС-1 шёл по орбите со скоростью семь километров в секунду, а в пультовой стояла такая тишина, что было слышно, как щёлкает реле охлаждения.
Чарльз думал о том, что где-то наверху, в сотне километров над его головой, летит полированный шар весом с человека, собранный руками его ровесников с другого конца планеты, — и что этот шар поёт.
Бип - бип - бип...
Не «красный триумф», не «вызов», как писали газеты. Просто поёт. Однотонно, спокойно, как поёт провод под ветром.
И где-то между двумя оборотами этого сигнала — между двадцать третьим и двадцать четвёртым — в нём что-то замкнулось. Он позже не смог бы объяснить что. Возможно, это было ощущение несоразмерности: шар в высоте летит вокруг планеты, а здесь, на земле, три десятка самых умных людей планеты (как верили в это американцы) тратят недели, чтобы пересчитать его орбиту на машине, которая весит как грузовик и говорит с ними на языке, придуманном бухгалтерами...
— Чарли, ты чего? — спросил сосед.
— Думаю, что мы пишем программы как расшифровываем телеграммы, — ответил он. — Посимвольно. И каждый раз заново.
Сосед усмехнулся и вернулся к осциллографу. А Чарльз остался стоять — худой, в осенней рубашке с катышками, — и смотрел на осциллограмму пиликанья, как на рукопись неизвестной цивилизации.
Часть вторая. Стилус
Задача стояла арифметически скучная и человечески великая: по обрывкам наблюдений — пеленг, время, доплеровский сдвиг — вычислить элементы орбиты. Уточнить, спрогнозировать, когда спутник пройдёт над Кембриджем, над Лондоном, над атоллом в Тихом океане, где стоит человек с антеннами и радиотермосом...
IBM 704 это умела. Но она умела это на своём языке — на языке, где «сложить два числа» занимало перфокарту, а ночь обхода телескопа занимало две недели набивки колод...
Чарльз смотрел на колоды перфокарт — они лежали в шкафах, как гробы с внутриутробным содержимым, — и чувствовал то, что космонавт, наверное, чувствует, глядя на скафандр: это всё между мной и небом.
— Словарь, — сказал он однажды вслух, в пустом зале, когда машины ушли в ночную очередь за расчётами и стены гудели, как улей.
Идея была дикая по меркам времени: не писать программы как связки инструкций, а собирать их как речь. Слова.
Каждое слово — маленький, атомарный, проверенный один раз — и навсегда верный. Слова складываются в предложения, предложения — в текст. А машина не читает текст — машина исполняет его, слово за словом, как синхронный переводчик, идущий за послом страны.
Он назвал это потом «четвёртым» — Fourth — потому что он видел в этом новое, четвертое поколение языков для вычислителей. Но компьютер, где он это собрал, не позволял пяти букв в имени, и слово потеряло «у», став Forth — «вперёд».
Чарльз никогда не считал это ошибкой. Он говорил потом, что это и есть его суть: иди вперёд.
Часть третья. Ночь на паре электронных ламп
Теперь представим киношный кадр — тот самый, с замедленным временем, который так любят в сериалах: звенящая тишина, крупный план.
Ночь. Зал пуст.
Чарльз сидит перед машиной — не IBM, той, другой, поменьше, к которой ему доверили ключи. За окном — лето, кричат цикады. На столе: лист, карандаш, остывающий кофе в кружке с нацарапанной ладьёй.
Он пишет слово. Одно. Функцию, которой ещё не существует — но она ему нужна, и он пишет её так, как будто она уже есть. Это называется «программирование сверху вниз», но Чарльз думал об этом иначе: как о разговоре с Богом, только "богом", по отношению к машине, был он сам.
Сначала — большими словами: «посчитать орбиту». Потом он разбивает это слово на два поменьше. Потом ещё. И когда он спускается на самое дно — туда, где уже нет никого, кроме машины, — там остаются только атомы. Десяток атомов. Тонких, простых, как остов рыбьего скелета.
Он запускает — и орбита сходится за минуты. Не за ночи. За минуты.
Машина пиликает. Точно так же, как спутник.
И в этом пиликанье была правда, которую он потом пронесёт через всю жизнь, не улыбнувшись ни разу: программа — это не то, что ты пишешь. Это то, что ты говоришь.
Часть четвёртая. Медитация
Есть фильм, который позже будут смотреть его внуки, — там космонавты разговаривают с роботом, который учится шутить, и через чёрную дыру видно лицо дочери... И есть что-то общее между той картинкой и этой ночью 1958-го. Не в технологии — в темпе.
Потому что медитация — это не то, что делает монах. Медитация — это то, что делает инженер, когда он три часа не трогает клавиши, а в голове гоняет решение, как камешек по воде: гладко, гладко, гладко.
Чарльз медитировал. Он сидел и думал о том, что человек — существо, которое думает словами, а не гигантскими блоками. Что каждая попытка запрограммировать его «большими блоками» — это попытка заставить музыканта играть не нотами, а абзацами. Что все языки, вокруг, предлагают ему архитектуру собора, когда ему нужна свобода речи.
И однажды — ночью, в тишине, когда компьютер дышал рядом, как животное, — он понял главную вещь. Понял так просто, что на бумаге это заняло всего строчку:
Программа — это стек. Мир — это стек. Ты кладаешь слово — оно ложится. Ты берёшь слово — оно отдаётся. Всё остальное — декорации.
Он не был поэтом. Но в этот момент он был ближе к поэзии, чем весь отдел, в котором он работал.
Часть пятая. Radio telescope
Годы спустя, на другом континенте, на горе, среди радиотелескопов, которые слушали космос, как большие серебряные уши, Чарльз снова писал — но уже с помощницей, Элизабет, и уже не для себя.
Он держал её текст на экране, как ювелир держит камень, — и щурится.
— Слишком много слов, — сказал он.
— Это константа, Чарли.
— Нет, — сказал он. — Это три слова, которые могут быть одним.
Он замолчал. Часы шли. За окном темнело небо, и радиотелескоп медленно поворачивался на восток, ловя сигнал с того места, где когда-то пиликал тот, первый, советский спутник. Уже не существующий: он сгорел в атмосфере в январе 1958-го, четыре месяца спустя, как и было предсказано.
По сути — он умер так же тихо, как родился. Пиликанье оборвалось. Мир не заметил.
— Итак? — спросила Элизабет.
— Одно слово, — сказал Чарльз. — Запомни его. Оно понадобится нам через десять лет.
И это было правдой. Потому что слово Vocabulary, которое тогда родилось в маленьком зале на Kitt Peak, чтобы описать словари в Forth, потом стало фундаментом целого направления в программировании, которое впитало его идею: не строить здание — говорить. Не компилировать — интерпретировать. Не проектировать — разговаривать.
Часть шестая. Свобода
А теперь — финал. Тот самый, где картинка медленно расплывается, а музыка поднимается в верхний регистр, и хочется закрыть глаза, потому что красота через край.
Чарльз Мур уже старик.
Он сидит на веранде в доме, где все розетки в комнате зарастают паутиной, потому что настоящий компьютер у него в голове, а под ногами — пыль и солнце. Он рассказывал внучке племянника — маленькой девочке, которая держит в руках книжку с картинками, — про Forth.
— Это язык, — сказал он. — Он очень простой. Он не пытается тебя контролировать. Он не пытается предугадать. Он просто стоит рядом и говорит: «Ну? Что дальше?»
— И что дальше? — спросила девочка.
Чарльз посмотрел в окно, на небо. Там не было ничего — чистый, пустой, красивый космос. Но он смотрел туда так, будто там всё ещё пиликал тот самый сигнал — с той самой первой октябрьской ночи.
— А дальше, — сказал он, — ты делаешь то, что хочет машина. А она хочет то, что хочешь ты. И в этом всё.
Он еще жив и живет тихо — тихо, как и его спутник.
Не оставив ни одного патента, ни одного фонда, ни одной кафедры имени себя. Но каждый, кто сегодня пишет на Forth, — на Stack-based, на минимальном, на бестелесном, на удивительно живом языке, — сидит в его ночи 1958 года. Пьёт из его кружки. Слушает тот самый пиликающий сигнал...
Потому что свобода, как сказал бы Чарльз, — это не когда можно всё.
Свобода — это когда ничего лишнего.
Спасибо за Ваши дела, Мастер!
С уважением, Bereg Oldmyth
PC Wrapper (open-code)
Всем привет, точнее, доброй ночи :) Никто не просил, но опять было скучно, вот с клодом собрал приложуху для фанатов разной бесполезной шляпы (почему-то в сравнение идёт флаппи бёрд в 10-х годах, вроде идея тупая, но столько людей залипало).
Она отслеживает сколько раз вы нажали на разные клавиши, сколько проехали мышкой и т.д. ( в общем чем вы заняты за пк и время активности )
Также можно выгрузить в excel, и посмотреть свой отчёт на слайдах (ниже)
Сразу отмечу - сервера у меня нет, код открыт, все данные только на вашем личном пк
Исходники и скачивание: https://github.com/Forecastych/pc_wrapped
Буду благодарен всем за фидбек! Пока черновой вариант, но люди любят опен-сорс/опен-код, решил поделится, ничего похожего не нашёл на гитхабе, вроде че-то похожее есть платное, но щас такое время, платить не хочет никто (я тоже), поэтому мой пост существует.
На чём сделано
Tauri 2 + Rust. Всё, что работает в фоне, написано на Rust: счётчики, трей, запись на диск. Electron не используется, поэтому установщик весит 1,5 МБ, а portable-версия 3,9 МБ.
Svelte 5 + TypeScript для окна статистики, мини-окна и слайдов.
Пара подробностей
Не кейлоггер и не тормозит в играх. Нажатия читаются через Raw Input, а не через глобальные хуки. Windows просто присылает программе копию событий, а в цепочку обработки ввода она не встаёт, поэтому задержки нет. Хранится только количество нажатий каждой клавиши, без текста.
Окно не висит в памяти. Интерфейс на WebView создаётся, только когда ты его открываешь, и полностью выгружается при закрытии. Всё остальное время работает один маленький процесс на Rust.
Цифры в трее рисуются своим пиксельным шрифтом 3×5. Обычный шрифт в значке 16×16 превращается в кашу, пришлось нарисовать каждую цифру по точкам.
Сравнения не мигают. Есть справочник от листа А4 до пути до Марса. Фразу «это 2 круга по МКАДу» программа выбирает так, чтобы она не прыгала каждую секунду: меняется, только когда число вырастает примерно на 18%. И да, склонения тоже честные: «1,5 Эйфелевой башни».
Excel-таблица без библиотек. .xlsx — это zip с XML внутри, его программа собирает сама: даты, ширина колонок, закреплённая шапка.
Всё локально. Данные хранятся в JSON-файлах по дням в папке, которую ты выбираешь сам. Сетевых запросов в программе нет вообще, это можно проверить по исходникам.
Простой не считается. Если больше двух минут не трогать мышь и клавиатуру, это время за компом не засчитывается.
А ваще интересно, можно с друзьями сравнивать кто больший геймер, да и понятно чем ты вообще за компом занят, если стату видишь. Кстати ниже слайдов ещё текст, но для тех кому лень читать - надеюсь, хоть пару скриншотов через несколько дней увижу, либо отзывов/багов (надеюсь, багов не будет), мб кто-то оценит.
Ниже пара скриншотов как это выглядит (копировать можно, один заскринил, а второй и третий скопировал)
Кстати, для тех кто досюда дочитал, скоро ещё один ОООЧЕНЬ прикольный проект доделаю, но пока надо доделать диплом и защитить его, поэтому возможны задержки :)
P.S. Для внимательных, сижу на 0.2.1 версии, в новой кнопки CSV нет, переименована в excel :) Последние две версии просто микро-фиксы, так что не критично, потом себе поставлю
Тесты прогнал руками, потыкал, вроде проблем нет, ресурсы не ест и не мешает, но фидбек всё же хотелось бы
Дайджест онлайн-игр: главные события 23–30 октября
Команда ggsel продолжает рассказывать о событиях, произошедших в мире онлайн-игр.
Хэллоуин в Arena Breakout: Infinite
29 октября в Arena Breakout: Infinite стартовало праздничное событие, приуроченное к Хэллоуину.
На карте Камоне появились тематические коллекционные предметы «Праздничная тыква». Если взять такую тыкву в рейд и успешно эвакуироваться, она получает опыт и эволюционирует, повышаясь в цене. Тыквы проходят четыре стадии — от «Неспелой» до «Причудливой», стоимость которой достигает 880 000 коэнов.
Ежедневные задания и челленджи позволяют гарантированно получить тыкву четвертого уровня, а за победу над «Тыквенными посланниками» можно забрать их шлемы и найти тыквы любого уровня в рюкзаках.
Также в игру добавлены новые «Аномальные ценности»: «Исчезающий рассвет» (можно найти в сейфах) и «Аномальные часы» (создаются на личной базе), каждый стоимостью 1 500 000 коэнов. Параллельно стартовал третий сезон «Турнира Марса» с обновленными правилами, системой рейтинга и эксклюзивными наградами за достижение определенных рангов.
Успех DayZ Badlands и планы на будущее
Разработчики DayZ подвели итоги первой недели после релиза расширения DayZ Badlands. Результаты оказались впечатляющими: было продано более 325 500 копий по всем платформам, а пиковый онлайн в период запуска превысил 435 500 одновременных игроков.
В честь успеха дополнение временно доступно со скидкой до 10%. Команда также выпустила первый патч, исправивший ряд проблем, и работает над хотфиксом, ориентированным на вылеты и другие срочные проблемы Badlands. Ожидается, что он появится в экспериментальной ветке в ближайший четверг, а затем выйдет в стабильную версию.
Кроме того, 26 октября на всех платформах стартовало ежегодное хэллоуинское событие, которое продлится до начала ноября, а в конце года запланирована поддержка рождественского ивента.
Новый убийца и карта в публичном тесте Dead by Daylight 10.3.0
В Dead by Daylight стартовал публичный тест обновления 10.3.0, которое добавляет нового убийцу — «Ужасающего». Его сила «Сумка сокровищ» позволяет выбирать случайные игрушки из двух вариантов: кислотную бутылку, цепь, пистолет, огнемет или велосипедный гудок.
Игрушки накладывают на выживших эффект «Мучение», а комбинация двух разных игрушек на раненом выжившем позволяет сбить его с ног и наложить «Ужас». Насмешка над выжившим в состоянии «Ужаса» повышает смертоносность всех игрушек.
Вместе с убийцей добавлена новая выжившая Сиенна Шоу с тремя уникальными навыками, а также новая карта «Торговый центр Хартсхорн» в новом мире «Пригород». Кроме того, в игру добавлена настройка кровавых эффектов, включая упрощенное отображение убийств и зеленый цвет крови для стримеров.
Хэллоуинские гонки и косметика в War Thunder
С 28 октября по 1 ноября в War Thunder проходят традиционные хэллоуинские гонки. Наземное событие «Сквозь темный лес» предлагает гонки на танке M18 «Ведьма», а воздушное «Охота на ведьм» — гонки на самолете Po-2 «Ночная ведьма».
За участие и набор очков игроки получают тематические декали и рамку профиля «Зловещие земли», а за 750 очков в воздушном событии — декаль «Охота на ведьм». Также в игре вновь доступны трофеи «Сундук мертвеца» и «Котел ведьмы», из которых можно получить хэллоуинские декали и декорации прошлых лет.
Если у игрока уже есть все предметы из этих наборов, вместо них выдается компенсационный трофей с бустерами исследований, серебряными львами, универсальными дублерами или днем премиум-аккаунта.
Rust: Хэллоуин 2026 и монстр из частей тела
С 22 октября по 5 ноября в Rust проходит ежегодное хэллоуинское событие. Главная особенность этого года — возможность собрать собственного монстра-компаньона из частей тел, которые можно найти в ходе исследования мира.
Также вернулись «конфетные охоты» с ограниченным по времени сбором сладостей. Для подписчиков Discord Nitro с 22 октября по 5 ноября доступен эксклюзивный предмет «Зомби-вумпус» в магазине Rust.
Тестирование питомцев и правки баланса в Fallout 76
На публичном тестовом сервере Fallout 76 вышло обновление для тестирования системы питомцев. Разработчики ускорили прокачку питомцев на начальных уровнях, добавили в Pip-Boy показатели их урона и здоровья, а также подсказки о новых доступных усилениях — первые два баффа теперь экипируются автоматически.
Исправлено множество ошибок: сброс пользовательских имен питомцев при повторном входе, отсутствие подарков от любимцев, пустое меню продавца в CAMP и ошибочные атаки питомцев на дружелюбных NPC. Медицинское оружие теперь корректно лечит питомцев в режимах «Следуй» и «Оставайся».
Помимо спутников, обновление затронуло баланс: эффекты легендарных модов и уникальных предметов («Последний Бастион», «Месть Фонда») теперь полностью срабатывают при здоровье ниже или равном 20%, а порог протоколов экстренной помощи в силовой броне изменен на «менее или равно 20%».
На этом все. Пишите в комментариях, в какие онлайн игры играете вы. Хотите приобрести игру себе на аккаунт? Переходите на ggsel.net — торговую площадку, где вы найдете игры для ПК и консолей, DLC, сможете пополнить баланс популярных игровых и неигровых сервисов, купить и продать игровой аккаунт. И все это — по низким ценам!
Ядро Linux выучило HTTP
Товарищи из ETH Zurich, NYU и NVIDIA принесли на Linux Plumbers Conference проект Beeper - парсер седьмого уровня сети, живущий прямо в ядре. Пишется на Rust, крутится на eBPF, код открытый.
Механика простая. Обычно запрос топает привычным маршрутом: сетевая карта --> ядро --> системный вызов --> приложение, которое наконец соизволит ответить. Beeper перехватывает HTTP прямо в ядре, умеет кэшировать ответы и отдавать их, вообще не беспокоя приложение. Как швейцар, который не только открывает дверь, но и отвечает посетителям за вас - большинство из них до вас просто не доходит.
Цифры из презентации: до 3.4× роста пропускной способности, а в связке с hyper-fast-path (быстрый путь для Rust-библиотеки Hyper) - до 4.5×. Применений нарисовали больше, чем просто кэш: мониторинг трафика на уровне приложений, редиректы по содержимому запроса.
Пока это исследование, а не готовый продакшен - авторы на это и не претендуют. Но тренд любопытный: eBPF уже следит за сетью, безопасностью и планировщиком, а теперь ещё и подрабатывает веб-сервером.
Если парсинг HTTP уже живёт в ядре - что остановит энтузиастов дальше? Не удивлюсь, если лет через пять find / -name nginx* на боевом сервере ничего не найдёт.
ЛЕГЕНДА О ХАКЕРЕ. МЭЛ КЕЙ
<Usenet> автор: Эдд Нейзер.
Утро. 21 мая 1983 год.
Транслятор: Bereg
В недавней статье, посвященной «мачизму» в программировании, было сделано откровенное заявление: «Настоящие программисты пишут на Фортране».
Может быть, сейчас, в эту декадентскую эпоху светлого пива, ручных калькуляторов и «дружественного к пользователю» программного обеспечения, так оно и есть, но в старые добрые времена, когда термин «программное обеспечение» звучал забавно, а настоящие компьютеры делались из барабанов и электронных ламп, настоящие программисты писали на машинном коде — не на Фортране, не на RATFOR, даже не на языке ассемблера, а на машинном коде, — на чистом, не приукрашенном, непостижимом шестнадцатеричном коде...
Чтобы целое поколение программистов не выросло в неведении об этом славном прошлом, я считаю своим долгом как можно подробнее, несмотря на разницу поколений, рассказать о том, как настоящий программист писал код. Я назову его Мэл, потому что так его звали.
Я впервые встретился с Мелом, когда устроился на работу в Royal McBee Computer Corporation, ныне несуществующую дочернюю компанию производителя пишущих машинок. Фирма выпускала LGP-30, небольшой и дешевый (по меркам того времени) компьютер с барабанной памятью, и только начала производить RPC-4000 — значительно улучшенный, более крупный, совершенный и быстрый компьютер с барабанной памятью. Ядра стоили слишком дорого, да и в любом случае это было временное решение. (Вот почему вы не слышали ни о компании, ни о компьютере.)
Меня наняли для написания компилятора Fortran для этого нового чуда техники, и Мэл был моим проводником в мир его чудес. Мэл не одобрял компиляторы.
«Если программа не может переписать свой собственный код, — спрашивал он, — какой от нее толк?».
Мэл написал в шестнадцатеричной системе счисления самую популярную компьютерную программу в компании. Он работал на LGP-30 и играл в блэкджек с потенциальными клиентами на компьютерных выставках. Эффект всегда был потрясающим. Стенд LGP-30 был забит посетителями на каждой выставке, а продавцы IBM стояли вокруг и разговаривали друг с другом. Вопрос о том, действительно ли это помогало продавать компьютеры, мы никогда не обсуждали.
Задача Мела заключалась в том, чтобы переписать программу для блэкджека для RPC-4000. (Порт? Что это значит?) В новом компьютере использовалась схема адресации «один плюс один», при которой каждая машинная инструкция, помимо кода операции и адреса необходимого операнда, содержала второй адрес, указывающий, где на вращающемся барабане находится следующая инструкция. Говоря современным языком, за каждой инструкцией следовала команда перехода! Засуньте *это* в трубку Паскаля и выкурите.
Мэл любил RPC-4000 за то, что с его помощью можно было оптимизировать код: то есть расположить инструкции на барабане так, чтобы, как только одна из них завершала свою работу, следующая уже подходила к «головке чтения» и была готова к немедленному выполнению. Для этого существовала программа — «оптимизирующий ассемблер», но Мэл отказывался ею пользоваться.
«Никогда не знаешь, куда он что поместит, — объяснил он, — поэтому приходится использовать отдельные константы». Мэл
Прошло много времени, прежде чем я понял это замечание. Поскольку Мел знал числовое значение каждого кода операции и назначал свои собственные адреса барабанов, каждую написанную им инструкцию также можно было считать числовой константой. Он мог взять более раннюю инструкцию "добавить", скажем, и умножить на нее, если у нее было правильное числовое значение. Его код было нелегко модифицировать кому-либо другому.
Я сравнил программы Мэла, оптимизированные вручную, с тем же кодом, обработанным оптимизирующей программой на ассемблере, и у Мэла всегда получалось быстрее. Это произошло потому, что метод разработки программ "сверху вниз" еще не был изобретен, и Мел все равно бы им не воспользовался. Сначала он написал самые внутренние части циклов своей программы, чтобы они могли первыми выбирать оптимальные расположения адресов на барабане. Оптимизирующий ассемблер был недостаточно умен, чтобы сделать это таким образом.
Мэл также никогда не писал циклы с временной задержкой, даже когда неуклюжему Flexowriter требовалась задержка между выводимыми символами для правильной работы. Он просто расположил инструкции на барабане так, чтобы каждая последующая находилась *сразу за* считывающей головкой, когда она была нужна; барабану приходилось совершать еще один полный оборот, чтобы найти следующую инструкцию. Он придумал для этой процедуры незабываемый термин. Хотя слово «оптимальный» является абсолютным, как и слово «уникальный», в разговорной речи его стали использовать в относительном смысле: «не совсем оптимальный», «менее оптимальный» или «не очень оптимальный». Мэл назвал места с максимальной задержкой «самыми пессимистичными».
После того как он закончил работу над программой для блэкджека и запустил ее («Даже инициализатор оптимизирован», — с гордостью сказал он), он получил запрос на внесение изменений от отдела продаж. Программа использовала элегантный (оптимизированный) генератор случайных чисел для перетасовки «карт» и раздачи из «колоды», и некоторые продавцы считали, что она слишком честная, поскольку иногда клиенты проигрывали. Они хотели, чтобы Мэл модифицировал программу таким образом, чтобы при нажатии сенсорной кнопки на консоли можно было изменить коэффициенты и позволить клиенту выиграть.
Мэл воспротивился. Он считал, что это откровенная нечестность, и это действительно было так, и что это подрывает его личную честность как программиста, и это действительно было так, поэтому он отказался это делать. С Мэлом поговорил главный менеджер по продажам, а также Большой Босс и, по настоянию босса, несколько коллег-программистов. В конце концов Мэл сдался и написал код, но он сделал тест наоборот, и, когда включался переключатель, программа жульничала и каждый раз выигрывала. Мэл был в восторге от этого, утверждая, что его подсознание не поддается контролю, и категорически отказывался что-либо исправлять.
После того как Мэл ушел из компании в поисках лучшей жизни, Большой Босс попросил меня взглянуть на код и попытаться найти тест и обратить его. Я нехотя согласился. Поиск кода Мэла оказался настоящим приключением...
Я часто думал о том, что программирование — это вид искусства, истинную ценность которого может оценить только тот, кто сведущ в этом тайном искусстве.
Есть прекрасные жемчужины и блестящие находки, которые скрыты от человеческого взгляда и восхищения, иногда навсегда, самой природой процесса. Можно многое узнать о человеке, просто прочитав его код, даже в шестнадцатеричном формате. Мел, на мой взгляд, был невоспетым гением.
Пожалуй, больше всего я был потрясен, когда обнаружил безобидный цикл без проверки. Без проверки. *Без проверки*. Здравый смысл подсказывал, что это должен быть замкнутый цикл, в котором программа будет ходить по кругу вечно, бесконечно. Однако управление программой проходило прямо через него и благополучно выходило с другой стороны. Мне потребовалось две недели, чтобы это понять.
В компьютере RPC-4000 была очень современная функция — индексный регистр. Это позволяло программисту написать цикл программы, в котором использовалась индексированная инструкция: при каждом проходе число в индексном регистре прибавлялось к адресу этой инструкции, чтобы она ссылалась на следующий элемент в последовательности. Программисту нужно было лишь увеличивать индексный регистр при каждом проходе. Мел никогда этим не пользовался.
Вместо этого он переносил инструкцию в машинный регистр, прибавлял единицу к ее адресу и сохранял обратно. Затем он выполнял измененную инструкцию прямо из регистра. Цикл был написан таким образом, чтобы учитывать это дополнительное время выполнения: как только эта инструкция заканчивалась, следующая оказывалась прямо под считывающей головкой барабана и была готова к выполнению. Но в цикле не было проверки.
Ключевая догадка пришла ко мне, когда я заметил, что бит индексного регистра, расположенный между адресом и кодом операции в слове инструкции, был включен, хотя Мэл никогда не использовал индексный регистр, оставляя его всегда нулевым. Когда меня осенило, я чуть не ослеп от радости.
Он расположил данные, с которыми работал, в верхней части памяти — в самых больших ячейках, на которые могли ссылаться инструкции, — поэтому после обработки последнего элемента данных увеличение адреса инструкции привело бы к переполнению. Перенос прибавлял единицу к коду операции, изменяя его на следующий в наборе команд: команду перехода. Разумеется, следующая программная команда находилась по нулевому адресу, и программа благополучно продолжала работу.
Я давно не общался с Мелом, поэтому не знаю, поддался ли он потоку изменений, захлестнувшему методы программирования с тех давних времен. Мне хочется думать, что нет. В любом случае я был настолько впечатлен, что перестал искать проблемный тест и сказал Большому Боссу, что не смог его найти. Он не удивился.
Когда я уходил из компании, программа для игры в блэкджек по-прежнему жульничала, если вы включали правильный переключатель sense, и я думаю, что так и должно быть. Я не чувствовал себя комфортно, взламывая код настоящего программиста...




















