Mám rád assembler.
Byl to první jazyk, který jsem se “naučil”. Bylo mi dvanáct, počítač jsem neměl, tak jsem se učil “na papíře”. A asi to šlo, protože když jsem si rok nato sednul k počítači, tak moje první programy, na papíře pečlivě sepsané, přepsané do hexadecimální podoby a se spočítanými adresami, po naklepání do PMD-85 fungovaly. BASIC jsem se učil až potom. A ačkoli dneska píšu o deset úrovní abstrakce výš, tak jsem na assembler nikdy nezapomněl a rád ho mám dodneška.
Samozřejmě bych v něm nepsal nic velkého. Nejsem blázen ani ortodoxní “programátor”. Ale vím, umím a pamatuju se.
Že si dělám osmibitový online assembler, to asi víte. První prototyp jsem spustil někdy v roce 2014, plus mínus. Mělo to editor, překladač, debugger a pár emulátorů starých osmibitů. Slepoval jsem to ve volných chvílích, a pak jsem to tak porůznu udržoval.
Někdy v roce 2020 jsem už na to neměl čas, a navíc jsem si říkal, že by to zasloužilo přepsat. A tak jsem zkusil přepsat jádro do modernějšího ES6, aspoň aby tam moduly byly a pokrývaly to testy. Trvalo to, ale nakonec to nějak dopadlo a já to zveřejnil.
Pak jsem si říkal, že by to chtělo přepsat to samotné IDE. Chvíli jsem experimentoval, zkusil jsem integrovat Monako do Svelte, pak se mi Svelte změnilo pod rukama, stal se z něj runový React, tak jsem si říkal, že to někdy přepíšu, a to “někdy” se stále vzdalovalo…
Až letos… Ležím takhle v posteli a trpím se žlučníkovou kolikou. Moc toho v takovém stavu dělat nemůžete. Ležíte, jste rádi, že dýcháte, a snažíte se dýchat co nejmíň, aby to nebolelo víc než je nezbytně nutné. No a po jednom takovém záchvatu, bylo asi půl jedné v noci, jsem si říkal, že se podívám na to, jak ten opěvovaný OpenCode s těmi “coding” modely umí pracovat. Myslím, že byl zrovna venku Minimax M2.5 nebo něco takového, tak jsem to měl spuštěné. Na práci jsem neměl ani pomyšlení, ale zas jsem ho chtěl zkusit. Oči se mi klížily únavou, tak jsem mu napsal něco jako:
Udělej základ webové aplikace - IDE pro online překladač.
Menu, panel se souborovým stromem, panel s editorem (Monako), status bar.
Zvol si systém pro frontend. Asi nechci Bootstrap. Nechci ani React, ani Vue, ani Svelte.
SPA, ES6, async. Nastav i devserver a build systém.Pak jsem notebook odložil vedle postele a usnul jsem.
Ráno jsem se probudil a šel jsem se podívat, kde se zasekl. Kupodivu tam bylo napsáno “Hotovo, spusť si to přes npm run dev.” Spustil jsem si to, a co myslíte?
Nevěřil jsem, že to zvládnul. Ale zvládnul. Bylo tam IDE s menu, s funkčním Monakem, s funkčními webworkery, s komponentami přes Shoelace, a vypadalo to slušně.
Do té doby bylo maximum fungování tak nanejvýš “pomož mi s touhle funkcí” a “tady udělej takový a onaký modul”. A to jsem u toho kvetl, protože modely měly tendenci vymýšlet kolo, nepoužívat knihovny, nebo naopak použít těžký Axios tam, kde stačil fetch…
Byl to výstřel naslepo, ale vyšel. Udělal za mě tu nejvíc opruznou práci. Pokud jste někdy někam integrovali holé Monako, tak víte, o čem mluvím. Povzbudilo mě to, a tak jsem zkusil pokračovat: Napojit filesystém, napojit existující překladač, udělat uživatelské rozhraní smysluplné, opakovat mu “takhle ne…” a napovídat mu.
“Stop! Proč takto? Udělej to úplně jednoduše, udělej toto!”
“Ne, nechci tohle. Chci, aby to přeložilo soubor!”
“Proč jsi tu vymyslel tento přepínač? Vždyť máš Shoelace?!”
Jako se snaživým juniorem.
Ale pak to dodělal a bylo to natolik uspokojivé, že jsem si řekl, že tudy vede cesta.
“Doplň přihlašování přes Auth0”
“Udělej databázový backend, kde budou uložené ty projekty”
Jen jsem seděl, poroučel, kontroloval a usměrňoval. Ono to takhle vypadá jednoduše, ale ve skutečnosti za tím byla spousta jiné práce. “Proč používáš tohle API, to je dávno deprecated!” Nebo: “Ten kód je nepřehledný, vyhoď ten middleware a napiš to sám. Nezapomeň na JSDoc.” Anebo: “Auth0 už tuto metodu nepodporuje!”
Někdy v tu dobu se Claude Code začal i na Windows chovat příčetně, tak jsem ho nasadil na hlavní linii úprav. OpenCode mi mezitím přepisoval můj kompiler Basicu pro 8080 tak, aby fungoval i pro 6502, a Codexem jsem pracoval na druhé verzi s překladem do p-codes.
Postupně jsem workflow vylepšoval - tu Ralph Loop, onde skilly, a s tím rostla i efektivita práce. A já byl najednou bujný, vymýšlel jsem si další legrácky, nechal jsem si navrhovat, co ještě dodělat, nechal jsem si dělat rešerše funkcí, co by dávaly smysl, pak jsem je plánoval a nechal vyvíjet… Zábavné to je, když víte, co děláte.
Spoustu práce udělali subagenti. “Máme tuhle featuru odladěnou pro jeden procesor. Udělej ji i pro další!” Třeba syntax highlight pro všechny podporované procesory. Já bych to ručně nepsal, fakt ne. Subagenti jo, a docela rádi.
Pak jsem je nechal přepsat staré emulátory počítačů z původního ASM80. Mořili se s tím, ale dali to. Do toho vymýšlely bejkovinky, jako zobrazení počtu taktů u každé instrukce rovnou v editoru.
Nechal jsem ho napsat příručku, podle těch starých osmdesátkových. Jak se assembler vyvíjí, tak vzadu běží tým z paperclip.ai, který sleduje commity do všech částí a podle nich příručku přepisuje a rozšiřuje.
Když jsem byl spokojen a už jsem nevěděl, co dál dělat, tak jsem jel na kontrolu do špitálu a po cestě jsem si přemýšlel nad takovou ptákovinkou, co se mi zdála lehce šílená, ale užitečná: že by se rovnou v editoru mohl kus kódu spustit a já bych při psaní viděl, jak se mění hodnoty v registrech, v paměti, kolik T to trvá, … Z čekárny jsem to probíral s Claudem, jak to co nejlíp udělat a integrovat, a než jsem přišel na řadu, měl jsem sepsanou specifikaci.
Tady třeba bylo jasně vidět, jak se vyplatí podrobná příprava a tlačení LLM do módu “ptej se a argumentuj”. V průběhu debaty jsem ho několikrát vracel, když začal “myslet víc, než je zdrávo” a měl tendence překombinovávat. Nejčastější replika, kterou jsem používal, bylo “To je zbytečné. Stačí to udělat takto!”
Sepsanou specifikaci jsem mu odpoledne hodil k zapracování. Večer bylo hotovo. Samozřejmě že jsem mu to asi desetkrát vracel k předělání a úpravám, ale nakonec doiteroval a dokonvergoval k tomu, co jsem si představoval, i když jsem předtím vlastně ani přesně nevěděl, co chci.
Od toho byl krok k “playbooku” - obdobě Jupyter Notebooku, jen pro assembler. Máte text - návod či tutoriál - a v něm máte kusy assemblerového kódu, který si můžete přeložit a v emulátoru spustit. A můžete si ho i změnit, podívat se, co to dělá, jak se změna projeví dál… Říkám si, že k výuce by se to mohlo hodit.
Ale pořád jsem cítil, že potřebuju ještě něco víc. Mám assembler, mám BASIC, mám live terminály i emulátory, ale ještě by to chtělo něco, něco… Něco jako překladač Céčka!
Nemusí to být GNU C. Nebude to cc65 ani SDCC, protože tam to je všelijaké s licencemi a musel bych to spouštět na serveru a to by bylo pomalé, navíc to zabezpečit a dělat konektory pro ASM80… A tak jsem vzal hezký překladač céčka v céčku a nechal jsem ho přepsat do ES6, aby běžel v prohlížeči. Ne WASM, ale normální přepsání. K tomu malá sada testů na všechny podporované konstrukce. Dva dny, a fungovalo to.
Pak bylo potřeba vykostit šestnáctibitový x86 fundament, dodělat codegen pro z80, 6502 a 6809 (fáze 1), připravit další sadu testů, pak udělat E2E testy, což si vyžádalo připravit některé části ASM80 (překladač, linker, archiver a emulátor) jako CLI utility. Překladač překládá, jen se mi nelíbí výsledný kód. Není optimalizovaný, protože čistý kompiler překládá céčkové konstrukce dost otrocky. Někdy si načítá do registrů proměnné, které v nich už dávno má, někdy počítá a[0] a sčítá ukazatel na A s nulou, někdy stvoří mrtvý kód, kam se procesor nikdy nedostane. Takže od včerejška řeším optimalizace kódu. Všechny features už jsou implementované a pokryté testama, takže je čas na optimalizaci generátoru kódu.
Jak píšu tento článek, tak v druhém okně sleduju, jak se s tím moří. Já mu ukážu konstrukci, která je nesmyslná, on si zanalyzuje, v čem je nesmyslná, zjistí, jak vzniká, povrtá se ve střevech samotného překladače, aby přišel na to, jak se tomu vyhnout, pak napíše specifikaci, pak napíše plán, jeho kámoš ten plán zreviduje, třikrát si to pinknou, pak si udělá worktree, spustí subagenty, kteří ten plán realizují, otestují, commitují, a očekávám, že tak za hodinu bude hotovo.
Teď má takovou chvilku pro sebe, takže já přemýšlím, co můžu dělat, zatímco robot pracuje…
No nic. Budu se těšit na psaní libc. To bude konečně pořádná chlapská práce! To mu nesvěřím! No, možná ty nudné části…
Dopíšu a půjdu vymyslet, čím ho zabavím přes noc. :)





