Vytvořit jazyk (exkurze do světa Lispu, šílenství závorek a vítězství strojů)
Nikdo nemůže skutečně pochopit jazyk, který sám nevytvořil.
Tohle platí pro programovací jazyky, ne pro ty přirozené. Pokud jazykem mluví jen jeden člověk, nemá si s kým povídat, ale i osamocený programátor může použít svůj singulární lingvistický výtvor k tomu, aby přikázal počítačům dělat něco užitečného.
Nepíšu to jen tak pro nic za nic. Včera/předevčírem jsem napsal vlastní verzi LISPu – toho McCartyova dítka, se narodilo před šedesáti lety a zcela změnilo computer science. Nemám v oboru návrhu jazyků žádné velké znalosti, dokonce ani nepoužívám Lisp (pokud nepočítám instanci, kdy jsem kdysi použil Lisp-v-PHP pro implementaci objektového systému), jen jsem lovil ze vzpomínek to málo, co si pamatuji o Clojure nebo Scheme, a jel jsem po paměti a podle citu computer art stylem. Výsledek byl uchvacující. Nevím kde jinde může člověk zažít ten pocit, že jeho dílo začne žít – napíšu lexer, parser, funkci eval, přidám několik speciální forem a najednou tomu bije srdce programovacího jazyka, skoro jakoby náhodou, jakoby omylem – kde přesně se nachází hranice mezi mrtvým kódem a žijícím programem – v psaní je to možné na začátku procesu, kdy načrtávám obrysy světa a příběhu a v jeden okamžik do sebe všechno zapadne a začne fungovat jako homogenní celek – ale ani to není tak silný pocit, jako když jsem hlíně kódu najednou vdechl život. Samozřejmě, že v té chvíli práce jen začíná, protože rozdíl mezi „funguje pro mě“ a „je všeobecně použitelný a užitečný“ je obrovský. Možná se to tedy od psaní tolik neliší – poté, co jsem svázal uzle příběhu, je třeba začít psát.
Lisp jako homoikonický jazyk je velice mocný, ale je v něm něco perverzního. Dlouho jsem se s touto kognitivní disonancí potýkal, ale nedokázal jsem si přesně pojmenovat. Ale teď možná vím…
Jazyk Lisp je známý svojí syntaxí bohatou na závorky (dostal proto backronymy jako „Lost In Stupid Parentheses“ nebo „Lots of Irritating Superfluous Parentheses“), která přesně popisuje nahé datové struktury, kterými je reprezentován program.
(if (and (.startsWith (.slug article) "stripy/669") (.hasTag article (tag "669" true))) (let (t (tag "669" true) p (.prev base article t) n (.next base article t)) (join (if p (a (href (article-url p)) "««« předchozí") "") (if n (a (href (article-url n)) "následující »»»") ""))))
Kód jsou data, data je kód, tak zní nosná idea homoikonicity, která Lispu propůjčuje neobvyklou moc s pomocí které může provádět triviálně složité věci jako makra nebo generování kódu. Ale tady je také zakopaný pes. Hlavní problém pro mě osobně je opuštění literární tradice. Lispovský kód nevypadá jako próza, ani se tak nesnaží vypadat, jde jen o obnaženou serializovanou formu datových struktur, které by programátor nikdy neměl vidět. Lisp v určitém ohledu udělal perverzní krok zpátky, ale prezentoval ho jako krok vpřed.
Jiné jazyky mají blíže k psanému textu a expresivitou se snaží přiblížit próze, protože tak fungují naše mozky, tak jsme se byli trénováni od malička, když nás učili číst. Přirozený text není komisí vytvořená kombinace syntaxe a slovní zásoby, jde o plastickou entitu, která se přizpůsobuje našim jazykům a našim očím — to co se dobře čte a co se pohodlně vyslovuje, přežije. Obrozenecký patvar „čistokapsonosoplena“ zemřel, přežil „kapesník“, mnohem méně logický, mnohem méně popisný, spíš výjimka než výsledek nějakého obecného pravidla, ale tak my fungujeme. Římané neoddělovali slova mezerami, ale to se těžko četlo – porozumění benefituje ze separace tokenů přirozeného jazyka. To také není náhoda, protože je to pohodlné pro naše mozky, nemusíme přemýšlet, kde končí jedno slovo a začíná jiné (stejně jako nemusíme hledat, kde přesně končí ten který pár závorek).
Tohle všechno Lisp postavil na hlavu. Nevychází z jazyka, gramatiky, mezilidské komunikace, ale z diametrálně odlišné pozice: Jak můžeme udělat tohle co nejpohodlnější pro stroje. Stroje si můžou jít nasrat. Pamatuju si, jak mi jeden profesor říkal něco v duchu, že stroje mají pracovat, lidé se mají bavit (očividně nebyl ani speed freak a ani apokalypsista). komplikované záležitosti reprezentace a významu bychom měli nechat strojům a produkt udělat co nejpřirozenější pro uživatele.
Lisp si v sobě také nese stigma zklamání a kolapsu technooptimismu. V šedesátých letech byl používán ve výzkumu umělé inteligence a špičky oboru věřily, že symbolická manipulace bude klíčem k myslícím strojů, nadšení bylo obrovské a výzkumníci věřili, že je od této reality dělí jen pár let.
Jak ukazuje historie, nic z toho se nenaplnilo, až teprve teď, v Poslední Dekádě Posledního Milénia pokrok AI postupuje mílovými kroky.
Proč tady ale píšu zrovna o Lispu, proč se sakra zmiňuju o implementaci vlastního hybridu? Tu implementaci jsem napsal kvůli tomuhle webu. Chtěl jsem nějaký skriptovací nástroj, který by mohl specificky rozšířit poměrně rigidní & obecný systém asciiblogu, změny zatím necommitnuté, jedna z věcí, kterou generuje Lisp kód je ten přehled článků k nepřehlédnutí. Místo abych použil něco ověřeného a fungujícího, jsem jako nadšený idiot napsal další jazyk, který nikdo nebude používat a zemře tichou smrtí. Protože proč ne?