Код, который отправил человечество на Луну
Вы когда-нибудь задумывались, сколько строк кода нужно, чтобы посадить на Луну консервную банку с людьми? В 1969 году у разработчиков из MIT не было Stack Overflow, Docker или хотя бы нормальных мониторов. Зато у них был ассемблер и Маргарет Гамильтон, которая руководила созданием софта для бортового компьютера «Аполлона-11».
Репозиторий chrislgarry/Apollo-11 — это не просто архив. Это оцифрованный исходный код AGC (Apollo Guidance Computer), который управлял командным и лунным модулями. Если вы думали, что ваш легаси-код выглядит странно, добро пожаловать в мир, где комментарии в коде могут содержать фразы вроде «BURN, BABY, BURN».
Что внутри этого хранилища
Проект содержит исходники двух основных программ:
- Comanche 055: софт для командного модуля.
- Luminary 099: код для лунного модуля (того самого, что совершал посадку).
Код написан на языке ассемблера AGC. Чтобы вы понимали масштаб подвига: оперативная память компьютера составляла всего около 4 килобайт, а постоянная память (прошитая буквально вручную на магнитных сердечниках) — около 72 килобайт. В таких условиях каждый такт процессора был на вес золота.
На что стоит взглянуть в первую очередь
Читать ассемблер пятидесятилетней давности — сомнительное удовольствие, если только вы не фанат ретро-компьютинга. Но здесь есть вещи, которые поймет любой современный программист.
Юмор и пасхалки в комментариях
Разработчики NASA тоже люди. В файле LUNAR_LANDING_GUIDANCE_EQUATIONS.agc можно найти забавные комментарии. Например, там есть блок кода, помеченный как TEMPORARY, I HOPE HOPE HOPE. Видимо, концепция «костыля», который планируют исправить позже, родилась вместе с самой индустрией.
Обработка ошибок
Самый известный случай работы этого кода произошел во время посадки «Аполлона-11». Из-за ошибки в данных радара компьютер начал спамить ошибками 1201 и 1202 (перегрузка исполнительного устройства). Код был написан настолько грамотно, что система просто начала убивать низкоприоритетные задачи, чтобы сосредоточиться на самой важной — посадке. В репозитории можно найти те самые алгоритмы приоритизации, которые спасли миссию.
Оцифровка и точность
Этот код не просто написали по памяти. Ребята из Virtual AGC и музея MIT сканировали оригинальные бумажные распечатки. Затем волонтеры вручную перепечатывали текст. Если вы найдете опечатку в сравнении со сканом — смело создавайте Pull Request. Да, здесь до сих пор принимают правки в код 1969 года.
Технические странности и находки
Взгляните на типичный фрагмент кода того времени:
P63SPOT TC BANKCALL
CADR P63SPOT1
TC POSTJUMP
CADR BURNBABY
Фраза BURNBABY (отсылка к популярному тогда диджею Magnificent Montague) на самом деле запускала процедуру зажигания двигателя. Это к вопросу о том, как именование переменных и меток влияет на понимание контекста.
Компьютер AGC использовал необычную 15-битную архитектуру. Одно слово данных состояло из 15 бит плюс один бит четности. Это диктовало свои правила оптимизации, которые современному разработчику на Python или JS покажутся магией древних.
Зачем это современному разработчику
Понятно, что вы не будете использовать этот код в своем следующем микросервисе. Но изучить его полезно по нескольким причинам.
Во-первых, это отличный урок по экстремальной оптимизации. Когда у вас 4 КБ памяти, вы не думаете о красоте абстракций, вы думаете о том, как выжить.
Во-вторых, проект показывает важность документации. Каждая строка здесь сопровождена комментариями, объясняющими физику процесса или логику принятия решения. Без этих пояснений код превратился бы в бессмысленный набор инструкций.
В-третьих, это просто чертовски вдохновляет. Этот код работал без багов (почти) в условиях вакуума и радиации, управляя кораблем на расстоянии 380 тысяч километров от Земли.
Как с этим поиграть
Если простого чтения файлов в браузере мало, можно пойти дальше:
- Попробуйте скомпилировать код. В README есть ссылка на проект Virtual AGC, где лежит эмулятор и ассемблер yaYUL.
- Поищите знаменитые комментарии. В поиске по репозиторию введите
TRASHYилиOFF TO SEE THE WIZARD. - Посмотрите на подписи в файле
CONTRACT_AND_APPROVALS.agc. Там стоят имена людей, которые несли личную ответственность за каждую строчку. Поразительный уровень дисциплины.
Этот репозиторий — памятник эпохи, когда программирование было ближе к инженерному искусству и математике, чем к потреблению готовых библиотек. Если вам когда-нибудь покажется, что ваша задача слишком сложная, просто вспомните, что кто-то посадил людей на Луну, используя 72 килобайта памяти и ассемблер.
