Príbeh o Melovi alebo Najpravejší programátor zo všetkých

Nasledovný text bol zverejnený na Usenete jeho autorom, ktorým je Ed Nather (nather@astro.as.utexas.edu) 21. mája 1983. Pôvodný text v angličtine je na http://www.catb.org/jargon/html/story-of-mel.html.


Nedávny článok venovaný machom programovania vyhlásil nahlas a bez okolkov:

Praví programátori píšu vo Fortrane.


V dnešnej dekadentnom dobe
nealko piva, vreckových kalkulačiek a „používateľsky prítulného“ softvéru,
je to možno pravda,
ale za Starých dobrých čias,
keď slovo „softvér“ znelo smiešne
a Pravé počítače pozostávali z bubnov a elektróniek,
Praví programátori programovali v strojovom kóde.
V žiadnom Fortran. Ani RATFORe. Ba ani assembleri.
V strojovom kóde.
V surových, nevyspytateľných hexa čísla bez príkras.
Priamo.


Aby nové pokolenie programátorov,
nevyrástlo v nevedomosti o slávnej minulosti,
som povinný opísať
čo najlepšie skz priepasť generácií,
ako Pravý programátor písal kód.
Budem ho volať Mel,
lebo to bolo jeho meno.


Prvýkrát som ho uvidel, keď som začal pracovať pre Royal McBee Computer Corp.,
už zrušenú dcéru spoločnosti pre písacie stroje.
Firma vyrábala LGP-30,
malý, lacný (vzhľadom na tie časy),
počítač s bubnovou pamäťou,
a práve začala s výrobou
RPC-4000, viacnásobne vylepšeného
väčšieho, lepšieho, rýchlejšieho, počítača s bubnovou pamäťou.
Jadrá však stáli priveľa,
a nebolo im súdené prežiť.
(Preto ste nikdy nepočuli ani o spoločnosti, ani o počítači.)


Bol som prijatý, aby som napísal kompilátor Fortranu
pre tento zázrak a Mel mať byť sprievodca jeho krásami.
Mel však neuznával kompilátory.


„Ak program nevie prepisovať vlastný kód,“
spýtal sa, „načo je dobrý?“


Mel vytvoril
v hexa sústave
najpopulárnejší program, ktorý spoločnosť mala.
Bežal na LGP-30,
a hral na veľtrhoch
s potenciálnymi zákazníkmi blackjack.
Vždy urobil ohromný dojem.
Stánok pre LGP-30 praskal vo švíkoch,
a obchodníci z IBM stáli opodiaľ
a zhovárali sa.
Či to naozaj pomohlo predávať počítače
bola otázka, nad ktorou nik neuvažoval.


Melova úloha bola prepísať
program blackjacku pre RPC-4000.
(Portovať? Čo to znamená?)
Nový počítač mal adresovaciu schému
jedna plus jedna,
kde každá strojová inštrukcia
mala okrem kódu operácie
a adresy potrebného operandu,
ešte druhú adresu, ktorá udávala miesto na bubne,
kde sa nachádza ďalšia inštrukcia.
V modernej reči,
za každou inštrukciou bolo GOTO!
Skúste si to narvať do Pascalu!


Mel miloval RPC-4000,
lebo mohol optimalizovať jeho kód:
čiže vyhľadať inštrukciu na bubne,
takže keď súčasná inštrukcia dobehla,
nasledovná akurát došla pod „čítaciu hlavu“
a mohla sa okamžite vykonať.
Na toto síce existoval program,
„optimalizujúci assembler“,
ale Mel ho odmietal používať.


„Keďže nikdy nevieš, kam ti umiestni veci,“
vysvetlil, „musel by si používať samostatné konštanty.“.


Bolo to dávno predtým, než som pochopil túto poznámku.
Keďže Mel poznal číselnú hodnotu
každého kódu operácie,
a sám si priradzoval adresy na bubne,
každá inštrukcia, ktorú napísal, sa mohla tiež považovať
za numerickú konštnatu.
Mohol napríklad prečítať predošlú inštrukciu na sčítanie,
a ak mala správnu numerickú hodnotu,
vynásobiť ňou.
Jeho kód nebolo ľahké upravovať.


Porovnával som Melove ručne optimalizované programy
s tými, ktoré prešli optimalizujúcim assemblerom,
a Melove boli stále rýchlejšie.
To preto, lebo metodológia návrhu „zhora nadol“
ešte nebola vynájdená.
A aj keby, Mel by ju nepoužíval.
Lebo najprv napísal najvnútornejšie cykly,
aby mohli ako prvé možnosť vyhľadať
optimálne umiestnenie inštrukcie na bubne.
Optimalizujúci assembler na to nebol dosť chytrý.


Mel nikdy nepísal ani zdržiavacie cykly,
dokonca ani vtedy, keď ťažkopádny Flexowriter
vyžadoval pauzy medzi výstupnými znakmi,
lebo inak by nefungoval správne.
Mel jednoducho umiestnil inštrukcie na bubon tak,
aby hlava tesne minula nasledujúcu inštrukciu,
ktorá sa mala vykonať.
Bubon sa tak musel celý otočiť, aby sa našla
ďalšia inštrukcia.
Pre tento proces stanovil nezabudnuteľné pomenovanie.
Vieme, že „optimum“ je absolútne označenie,
práve tak ako „jedinečný“,
ale bežne sme ho používali ako relatívne označenie:
„takmer optimálny”, “menej optimálny než”, či
„neveľmi optimálny”.
Mel nazýval umiestnenia inštrukcií,
ktoré potrebovali najviac času na načítanie,
za „najväčšie pesimum“.


Keď dokončil svoj blackjack
a spustil ho
(„Ešte aj inicializátor je optimalizovaný,“
vravel hrdo)
dostal z oddelenia predaja požiadavku na zmenu.
Program používal elegantný (optimalizovaný)
generátor náhodných čísiel
ktorý miešal „karty“ a rozdával ich.
Ktorýsi predajca mal dojem, že je to príliš férové,
pretože zákazníci niekedy prehrávali.
Chceli od Mela, aby upravil program tak,
aby po prepnutí dotykového senzora na paneli,
šance zákazníka vzrástli,
a ten mohol vyhrať.


Mel sa zháčil.
Cítil, že je to vrcholne nepoctivé,
čo bola pravda,
a je to v rozpore s osobnou integritou programátora,
čo naozaj bolo,
a preto to odmietol spraviť.


Šéf predaja márne presviedčal Mela,
rovnako ako Najvyšší šéf,
spolu s členmi Melovho tímu.
Nakoniec Mel ustúpil a napísal kód,
lenže obrátil test v podmienke,
takže keď sa dotykový prepínač zapol,
program začal podvádzať, a teda nikdy neprehral.
Mel sa tešil z tohto riešenia,
tvrdil, že sa riadi svojim svedomím,
a neoblomne odmietal ďalšie opravy.


Potom, čo Mel odišiel z firmy do l€pši€ho,
ma Najvyšší šéf požiadal, aby som sa pozrel do kódu,
našiel príslušnú podmienku, a obrátil ju späť.
Trochu váhavo som súhlasil.
Hrabať sa v Melovom kóde bolo naozajstné dobrodružstvo.


Často som cítil, že programovanie je druh umenia,
ktorého skutočnú hodnotu môže oceniť
len ten, kto zakúsil jeho rovnaké tajomstvá;
možno nájsť krásne perly, a vidieť majstrovské triky,
ukryté pred zrakmi ľudí a ich chválou, často naveky,
lebo to vyplýva zo samotnej podstaty ich tvorby.
O človeku možno zistiť mnoho,
len tým, že čítate jeho kód,
a nezáleží na tom, či je v hexa sústave.
Mel bol, myslím si, neodhalený génius.


Azda môj najväčší šok prišiel,
keď som našiel nevinný cyklus, v ktorom nebola žiadna podmienka.
Vôbec. Nič.
Sedliacky rozum mi vravel, že je to nekonečný cyklus,
v ktorom sa bude program točiť naveky.
Lenže pri spustení program prešiel cez cyklus bez zastavenia
a pokračoval ďalej.
Trvalo dva týždne, kým som zistil, prečo.


Počítač RPC-4000 obsahoval úplnú novinku,
zvanú register indexu.
Umožňoval programátorovi napísať cyklus,
ktorý používal indexovanú inštrukciu;
po každom prejdení cyklu,
sa číslo v tomto registri,
pripočítalo k adrese inštrukcie,
čím sa následne mohla odkazovať
na nasledujúci údaj v sérii.
Stačilo jednoducho postupne zvyšovať
register indexu.
Mel ju však nikdy nevyužil.


Namiesto toho vytiahol inštrukciu do strojového registra
pripočítal jednotku k adrese,
ktorú doň následne uložil späť.
Upravenú inštrukciu potom vykonal
priamo z registra.
Cyklus bol napísaný tak, aby zobral do úvahy
tento dodatočný čas na potrebný vykonanie —
čiže keď sa inštrukcia vykonala,
nasledujúca sa ocitla presne pod čítacou hlavou bubna,
a mohla sa rovno načítať.
Lenže v cykle nebola žiadna podmienka.


Zlomový moment nastal, keď som si všimol, že
bit registra indexu,
teda bit, ktorý ležal medzi adresou,
a kódom operácie v inštrukčnom slove,
bol zapnutý —
hoci Mel nikdy nepoužil register indexu,
a teda bol stále nulový.
Keď sa rozsvetili neóny, skoro som oslepol.


Dáta, na ktorých pracoval, umiestnil
pri konci pamäte —
teda v najvyšších lokáciách, ktoré mohli inštrukcie adresovať —
a teda potom, čo sa spracoval posledný údaj,
inkrementácia adresy inštrukcie
spôsobila pretečenie.
Prenášaná cifra pripočítala jednotku
ku kódu operácie, čím ju zmenila na nasledujúcu v inštrukčnej sade:
a tou bola inštrukcia pre skok.
Istotou bolo, že ďalšia inštrukcia programu bola
na lokácii s adresou nula,
a teda program mohol radostne pokračovať.


O Melovi som viac nepočul,
a teda neviem, či sa poddal prívalom
zmien v programovacích technikách
od tých dávno pominutých čias.
Chcem veriť, že nie.
Tak či onak,
bol som natoľko ohúrený, že som
viac nehľadal príslušnú podmienku,
len som oznámil Najvyššiemu šéfovi, že sa mi to nepodarilo.
Nevyzeral prekvapený.


Keď som i ja opustil firmu,
program hrajúci blackjack ešte stále vyhrával
ak ste zapli ten správny dotykový prepínač,
a myslím, že tak to má byť.
Necítil som sa byť natoľko istý,
aby som hackoval kód po Pravom Programátorovi.


Dodatok z roku 1992: Autor píše “Pôvodný príspevok nebol vo voľnom verši, a ani vzdialene ho nepripomínal. Bol napísaný ako próza, v nezarovnaných odsekoch. Tak, ako koloval sieťami, ho zjavne niekto upravil do súčasnej veršovanej podoby. Inými slovami, na sieti ho niekto hackol. Príde mi to istým spôsobom veľmi príhodné.” Autor dodáva, že táto veršovaná verzia sa mu páči viac.

Dodatok z 1999: Zistilo sa Melovo priezvisko. Manuál k LGP-30 spomína, že “Mel Kaye z Royal McBee, ktorý naprogramoval veľkú časť […] systému ACT1”. (Bolo to v roku 1959, pozn. prekl.)

Dodatok z 2001: Počítač Royal McBee LGP-30 sa vyskytol v ešte jednom slávnom momente. Vysvitlo, že meteorológ Edward Lorenz na ňom robil simulácie počasia, keď v roku 1961 objavil efekt motýlích krídiel a výpočtový chaos. Príde mi to istým spôsobom veľmi príhodné.

Dodatok z 2002: Kópia programátorského manuálu pre LGP-30 sa nachádza na at http://ed-thelen.org/comp-hist/lgp-30-man.html.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *