Kód, který přistál na Měsíci: Nejlepší perličky ze softwaru Apollo 11

Když 20. července 1969 Eagle dosedl v Moři klidu, řídil ho počítač s méně paměti, než má dnešní kuchyňská váha. Zdrojový kód tohoto počítače je dnes veřejně dostupný — a je plný překvapení.


Počítač menší než e-mail

Apollo Guidance Computer (AGC) měl k dispozici 36 kilobajtů trvalé paměti (ROM) a pouhé 2 kilobajty operační paměti (RAM). Pro srovnání: průměrný e-mail s přílohou je větší než celý program, který navigoval kosmickou loď na Měsíc a zpět.

Paměť ROM přitom nebyla uložena na čipu — byla doslova upletena ručně. Pracovnice v továrně protahovaly dráty magnetickými jádry: průchod jádrem znamenal jedničku, obejití jádra nulu. Říkalo se tomu „rope memory“ — lanová paměť. Změna jediného bitu znamenala přeplést celou sekci.

Finální verze softwaru pro lunární modul nese označení Luminary099 a byla sestavena 14. července 1969 v 16:27 — pouhých šest dní před přistáním. Skládá se z 91 souborů a přes 50 000 řádků kódu v jazyce assembly.


Shakespeare v navigačním počítači

Na samém začátku největšího souboru v celém projektu — PINBALL_GAME_BUTTONS_AND_LIGHTS (3 799 řádků, obsluhující klávesnici a displej kosmické lodi) — stojí citát ze Shakespeara:

# "IT WILL BE PROVED TO THY FACE THAT THOU HAST MEN ABOUT THEE THAT
# USUALLY TALK OF A NOUN AND A VERB, AND SUCH ABOMINABLE WORDS AS NO
# CHRISTIAN EAR CAN ENDURE TO HEAR."
#                                       HENRY 6, ACT 2, SCENE 4

„Bude ti dokázáno, že se obklopuješ lidmi, kteří neustále mluví o podstatném jménu a slovesu, a takovými ohavnými slovy, jaká žádné křesťanské ucho nemůže snést.“

Proč zrovna Jindřich VI.? Protože celé ovládání kosmické lodi fungovalo na principu VERB + NOUN (sloveso + podstatné jméno). Astronaut na klávesnici DSKY zadával příkazy ve tvaru:

  • V16 N68 E = „Zobraz mi (V16) údaje o přistávání (N68), proveď (E)“
  • V37 N63 E = „Spusť (V37) program brzdění (N63)“

Tento systém vznikl téměř náhodou. Ramón Alonso, jeden z původních vývojářů, později vzpomínal:

„Nikdo ještě neměl žádné softwarové požadavky na uživatelské rozhraní, když vznikla touha předvést počítač návštěvníkům laboratoře. Programátoři narychlo vytvořili demo s konceptem VERB/NOUN — bez záměru, že by se to dostalo do letového softwaru.“

Námitky zahrnovaly: „není to vědecké“, „není to důstojné“, dokonce „astronauti to nepochopí“. Přesto se provizorní demo dostalo do finálního kódu a odletělo na Měsíc.


„BURN, BABY! BURN!“ — Nejvýstřednější název rutiny v historii

Rutina, která řídí zapalování raketových motorů — od odpočtu T-35 sekund po samotné zapálení — se jmenuje:

BURN_BABY_BURN–MASTER_IGNITION_ROUTINE

Svůj název dostala po DJ Magnificent Montaguovi, který v roce 1965 v losangeleském rádiu KGFJ používal frázi „Burn, baby! BURN!“ kdykoliv pouštěl zvlášť žhavou nahrávku. Během nepokojů ve Watts v létě 1965 se tahle fráze bohužel stala i symbolem požárů v ulicích.

Don Eyles, autor rutiny, si ji na konci 60. let vybral jako název — a nikdo v NASA neprotestoval natolik, aby se změnil. V komentářích souboru si autor nechal poznámku:

# BURN, BABY, BURN  --  MASTER IGNITION ROUTINE
# BY DON EYLES

„NO ROOM IN THE INN“ — Biblická narážka na přetečení systému

Počítač Apollo měl prostor pro pouhých 9 souběžných časovaných úloh. Když jich přišlo příliš, nezbylo místo. Programátor, který tuto chybovou rutinu psal, ji okomentoval s černým humorem:

FILLED      INHINT
            TC      BAILOUT     # NO ROOM IN THE INN.
            OCT     01203       # ALARM 1203

„Žádné místo v hostinci“ — odkaz na biblický příběh o Ježíšově narození, kdy Maria s Josefem nenašli ubytování. Alarm 1203 znamenal, že plánovač úloh (waitlist) byl plný.


Slavné alarmy 1201 a 1202 — 3 minuty před přistáním

Nejdramatičtější okamžik celé mise Apollo 11 se odehrál tři minuty před přistáním, když DSKY začal blikat alarmem 1202 — přetečení plánovače úloh. Řídící středisko v Houstonu mělo 26 sekund na rozhodnutí: pokračovat, nebo přerušit přistání?

V kódu se chyba nachází v souboru EXECUTIVE.agc. Počítač mohl současně obsluhovat maximálně 8 úloh (tzv. „core setů“). Když o jednu požádal devátý program, nastala katastrofa:

NOVAC2      TS      LOCCTR
            CCS     PRIORITY    # CCS PRIORITY TO SEE IF CURRENT JOB
            TCF     +1          # ...CAN BE INTERRUPTED
            ...
BAILOUT2    TC      BAILOUT     # ALL CORE SETS OCCUPIED.
            OCT     01202       # ALARM 1202

Příčina? Rendezvous radar (program P20) nechtěně běžel na pozadí a konzumoval výpočetní čas, přestože ho při přistávání nikdo nepotřeboval. Radarová anténa nebyla správně nastavena a generovala lavinu přerušení, která zahlcovala procesor.

Klíčové rozhodnutí padlo díky 26letému inženýrovi Stevu Balesovi, který věděl, že alarm 1202 není fatální — počítač se dokáže restartovat a pokračovat, protože software navrhla Margaret Hamiltonová s důrazem na obnovu po selhání. Bales řekl „GO“ a Eagle přistál.

Hamiltonová později vysvětlila, proč software přežil:

„Systém byl navržen tak, aby rozpoznal chybové stavy a obnovil se z nich. Nižší-prioritní úlohy byly zrušeny a kritické — jako řízení přistání — pokračovaly.“


Trigonometrie na 40 řádcích — celá navigace v jednom tweetu

Jeden z nejkratších souborů celého projektu se jmenuje SINGLE_PRECISION_SUBROUTINES.agc a obsahuje implementaci sinusu a cosinusu na pouhých 40 řádcích kódu. Celá trigonometrie, na které závisela navigace kosmické lodi, by se vešla do jednoho příspěvku na Twitteru.

Funguje to na principu polynomiální aproximace — místo přesného výpočtu (který by trval příliš dlouho) se sin(x) vypočítá jako:

sin(x) ≈ c₁·x + c₃·x³ + c₅·x⁵

Tři koeficienty, pár násobení, a výsledek je dostatečně přesný pro navigaci ve vesmíru. Cosinus je pak ještě jednodušší — využívá známý vztah cos(x) = sin(x + 90°):

SPCOS       AD      HALF        # cos(x) = sin(x + π/2)
SPSIN       TS      TEMK        # ...a pokračuj jako sinus

Když si uvědomíte, že tyto desítky řádků kódu počítaly úhly pro navigaci na vzdálenost 384 000 kilometrů, je to pozoruhodná ukázka elegance pod tlakem.


Počítač, který sám sebe neustále testuje

Soubor AGC_BLOCK_TWO_SELF_CHECK.agc obsahuje program, který neustále běžel na pozadí a prověřoval, zda počítač správně funguje. Běžel s nejnižší možnou prioritou — pracoval jen tehdy, když nebylo co jiného dělat.

Program testoval:

  • Paměť RAM: Zapsal do registru svou vlastní adresu, přečetl ji zpět a porovnal.
  • Rotační registry: Zapsal číslo 25252₈ a ověřil, že se správně posouvá.
  • Paměť ROM: Spočítal kontrolní součet každé paměťové banky.

Pokud test selhal, rozsvítil alarm 01102 a zaznamenal adresu, kde k chybě došlo. Astronaut si pak mohl zobrazit detaily příkazem V05 N09 E.

Pointa: AGC měl vlastní vestavěnou diagnostiku, která běžela nepřetržitě po celou dobu mise. Počítač věděl, jestli je zdravý — a pokud ne, řekl to.


Virtuální počítač uvnitř počítače

Procesor AGC uměl pouhých 11 základních operací — sčítání, odčítání, kopírování a pár dalších jednoduchých kroků. Pro navigaci ve vesmíru potřebujete vektorovou algebru, maticové násobení, odmocniny a goniometrické funkce. Jak tohle vyřešit s 11 instrukcemi?

Odpověď: Postavit virtuální počítač uvnitř fyzického počítače.

Soubor INTERPRETER.agc (3 076 řádků — jeden z největších modulů) implementuje kompletní virtuální stroj s vlastní instrukční sadou o více než 64 příkazech:

  • VLOAD — načti vektor (3 souřadnice)
  • VXV — vektorový součin (cross product)
  • DOT — skalární součin
  • UNIT — vypočti jednotkový vektor
  • SQRT — odmocnina
  • SINE, COSINE — sinus, cosinus

Navigační rovnice se pak psaly téměř jako matematické vzorce:

VLOAD   RN          # Načti pozici lodi
UNIT                # Vypočti směr (jednotkový vektor)
STODL   UNIT/R/     # Ulož směr, načti čas
DMP     LEADTIME    # Vynásob korekčním faktorem
DAD     PIPTIME     # Přičti čas měření
STCALL  TDEC1       # Ulož a zavolej integraci dráhy
        INTEGRV

Tento interpret běžel přibližně 10× pomaleji než přímý strojový kód, ale programy zapsané v něm byly 3–5× kratší. S pouhými 36 kilobajty ROM to byl rozhodující kompromis — bez interpretu by se software jednoduše nevešel do paměti.

Zajímavost: na úplně stejném principu dnes funguje Java — její programy také běží na „virtuálním stroji“ uvnitř reálného počítače. V roce 1966 to ale bylo naprosto revoluční.


Komentář „TEMPORARY, I HOPE HOPE HOPE“

V celém kódu jsou roztroušeny desítky komentářů, které prozrazují lidskou stránku vývoje — od frustrace po černý humor. Některé pozoruhodné:

# TEMPORARY, I HOPE HOPE HOPE

Tento komentář u dočasného řešení zůstal v produkčním kódu, který přistál na Měsíci.

# CLOSE ENOUGH FOR GOVERNMENT WORK

U rutiny, kde se přesnost „zaokrouhlila“ — klasická americká fráze.

# TRASHY LITTLE SUBROUTINES

Lakonický nadpis oddílu pomocných rutin.

A jeden z nejvýmluvnějších komentářů v celém projektu:

# LESS IS MORE.

Poznámka v souboru přiřazení paměti, kde se každý registr počítal. Na 2 kilobajtech RAM opravdu platilo, že méně je více.


„Gimbal lock“ — 77 řádků mezi životem a smrtí

Gyroskopy lodi Apollo používaly tři otočné rámy (gimbaly) k měření orientace. Pokud se střední gimbal natočil příliš (nad 85°), dva rámy se dostaly do stejné roviny a systém ztratil schopnost rozlišit otáčení kolem jedné osy. Říká se tomu gimbal lock a pro posádku by to znamenalo ztrátu navigace.

Celá ochrana zabírá pouhých 77 řádků kódu v souboru GIMBAL_LOCK_AVOIDANCE.agc. Ale T4RUPT program monitoruje gimbal lock ještě důkladněji — každých 480 milisekund kontroluje registr CDUZ (úhel středního gimbalu):

GLOCKMON    CCS     CDUZ            # Zkontroluj úhel středního gimbalu
            TCF     GLOCKCHK        # Zjisti, jestli je > 70°

GLOCKCHK    AD      -70DEGS         # Odečti 70 stupňů
            EXTEND
            BZMF    SETGLOCK -1     # Pokud menší → vše OK

            AD      -15DEGS         # Odečti dalších 15° (celkem 85°)
            EXTEND
            BZMF    NOGIMRUN        # Mezi 70° a 85° → varovná kontrolka

            # Nad 85° → přepni IMU do nouzového režimu!

Tři zóny: do 70° klid, 70–85° blikající kontrolka na panelu, nad 85° nouzový režim. Jednoduchá logika — ale na ní závisel osud celé mise.


Jak Houston viděl, co se děje na palubě

Každých 20 milisekund — padesátkrát za sekundu — AGC odeslal dvě datová slova směrem k Zemi. Za dvě sekundy tak Houston obdržel 200 slov popisujících stav lodi: pozici, rychlost, stav motorů, palivo, teplotu, alarmy.

Rutina DODOWNTM v souboru DOWN_TELEMETRY_PROGRAM.agc obsahuje jednu z nejchytřejších částí celého kódu: atomický snapshot. Některá data (jako pozice a rychlost) musí být odeslána současně — nesmí se stát, že pozice odpovídá jednomu okamžiku a rychlost jinému. Proto se 12 klíčových registrů nejdříve najednou zkopíruje do vyrovnávací paměti a teprve pak se postupně odesílá.

Houston mohl také zadat příkaz V74E (Verb 74) a AGC odeslal kompletní výpis celé operační paměti — všech 2 048 slov, čtyřikrát po sobě. Trvalo to 83 sekund a umožnilo to pozemnímu týmu diagnostikovat problémy na dálku 384 000 kilometrů.


Poslední čísla

FaktHodnota
Taktovací frekvence procesoru2,048 MHz
Paměť ROM36 864 slov (69 KB)
Paměť RAM2 048 slov (3,8 KB)
Počet souborů zdrojového kódu91
Počet řádků kódu~50 000
Počet stránek originálního výpisu1 510
Příkon počítače70 wattů
Hmotnost32 kg
Velikost týmu~350 lidí
Datum sestavení14. července 1969, 16:27
Přistání na Měsíci20. července 1969, 20:17 UTC

Závěr: Kód jako vzkaz z minulosti

Zdrojový kód Apolla 11 není jen historický artefakt. Je to svědectví o tom, jak skupina lidí dokázala s extrémně omezenými prostředky vyřešit problémy, se kterými se lidstvo nikdy předtím nesetkalo.

Margaret Hamiltonová a její tým na MIT vybudovali operační systém, virtuální počítač, uživatelské rozhraní, navigační systém, autopilota a telemetrii — to vše v 36 kilobajtech. Pro srovnání: samotný text tohoto článku zabírá víc místa než program, který přistál na Měsíci.

A mezi řádky kódu nechali vzkazy: shakespearovské citáty, biblické narážky, slangové názvy rutin a prosbu „TEMPORARY, I HOPE HOPE HOPE“. Protože i ten nejdůležitější software v historii psali obyčejní lidé — s humorem, pod tlakem, a s vědomím, že na jejich práci závisí životy.

Kód je od roku 2016 volně dostupný na GitHubu. Nemusíte být programátor, abyste ocenili, co se v něm skrývá. Stačí otevřít libovolný soubor a číst komentáře. Příběhy v nich jsou stejně fascinující jako samotná cesta na Měsíc.