k47.cz  — každý den dokud se vám to nezačne líbit
výběr foto Praha povídky kultura
TECH ▞▞ kolo | twitter RSS
««« »»»

Vytvořit jazyk (exkurze do světa Lispu, šílenství závorek a vítězství strojů)

12. 3. 2018 — k47 (♪)

Nikdo nemůže sku­tečně po­cho­pit jazyk, který sám ne­vy­tvo­řil.

Tohle platí pro pro­gra­mo­vací jazyky, ne pro ty při­ro­zené. Pokud ja­zy­kem mluví jen jeden člověk, nemá si s kým po­ví­dat, ale i osa­mo­cený pro­gra­má­tor může použít svůj sin­gu­lární lin­gvis­tický výtvor k tomu, aby při­ká­zal po­čí­ta­čům dělat něco uži­teč­ného.

Nepíšu to jen tak pro nic za nic. Včera/pře­devčí­rem jsem napsal vlastní verzi LISPu – toho Mc­Car­ty­ova dítka, se na­ro­dilo před še­de­sáti lety a zcela změ­nilo com­pu­ter science. Nemám v oboru návrhu jazyků žádné velké zna­losti, do­konce ani ne­po­u­ží­vám Lisp (pokud ne­po­čí­tám in­stanci, kdy jsem kdysi použil Lisp-v-PHP pro im­ple­men­taci ob­jek­to­vého sys­tému), jen jsem lovil ze vzpo­mí­nek to málo, co si pa­ma­tuji o Clo­jure nebo Scheme, a jel jsem po paměti a podle citu com­pu­ter art stylem. Vý­sle­dek byl uchva­cu­jí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ě­ko­lik spe­ci­ální forem a na­jed­nou tomu bije srdce pro­gra­mo­va­cího jazyka, skoro jakoby ná­ho­dou, jakoby omylem – kde přesně se na­chází hra­nice mezi mrtvým kódem a ži­jí­cím pro­gra­mem – v psaní je to možné na za­čátku pro­cesu, kdy na­čr­tá­vám obrysy světa a pří­běhu a v jeden oka­mžik do sebe všechno za­padne a začne fun­go­vat jako ho­mo­genní celek – ale ani to není tak silný pocit, jako když jsem hlíně kódu na­jed­nou vdechl život. Sa­mo­zřejmě, že v té chvíli práce jen začíná, pro­tože rozdíl mezi „fun­guje pro mě“ a „je vše­o­becně po­u­ži­telný a uži­tečný“ je ob­rov­ský. 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 ho­mo­i­ko­nický jazyk je velice mocný, ale je v něm něco per­verz­ního. Dlouho jsem se s touto ko­gni­tivní diso­nancí po­tý­kal, ale ne­do­ká­zal jsem si přesně po­jme­no­vat. Ale teď možná vím…

Jazyk Lisp je známý svojí syn­taxí bo­ha­tou na zá­vorky (dostal proto bac­kro­nymy jako „Lost In Stupid Paren­theses“ nebo „Lots of Irri­ta­ting Su­per­flu­ous Paren­theses“), která přesně po­pi­suje nahé datové struk­tury, kte­rými je re­pre­zen­to­ván pro­gram.

(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 ho­mo­i­ko­ni­city, která Lispu pro­půj­čuje ne­ob­vyklou moc s pomocí které může pro­vá­dět tri­vi­álně slo­žité věci jako makra nebo ge­ne­ro­vání kódu. Ale tady je také za­ko­paný pes. Hlavní pro­blém pro mě osobně je opuš­tění li­te­rární tra­dice. Lis­pov­ský kód ne­vy­padá jako próza, ani se tak ne­snaží vy­pa­dat, jde jen o ob­na­že­nou se­ri­a­li­zo­va­nou formu da­to­vých struk­tur, které by pro­gra­má­tor nikdy neměl vidět. Lisp v ur­či­tém ohledu udělal per­verzní krok zpátky, ale pre­zen­to­val ho jako krok vpřed.

Jiné jazyky mají blíže k psa­nému textu a ex­pre­si­vi­tou se snaží při­blí­žit próze, pro­tože tak fun­gují naše mozky, tak jsme se byli tré­no­váni od ma­lička, když nás učili číst. Při­ro­zený text není komisí vy­tvo­řená kom­bi­nace syn­taxe a slovní zásoby, jde o plas­tic­kou entitu, která se při­způ­so­buje našim ja­zy­kům a našim očím — to co se dobře čte a co se po­ho­dlně vy­slo­vuje, pře­žije. Ob­ro­ze­necký patvar „čis­to­kap­so­no­so­plena“ zemřel, přežil „ka­pes­ník“, mnohem méně lo­gický, mnohem méně po­pisný, spíš vý­jimka než vý­sle­dek ně­ja­kého obec­ného pra­vi­dla, ale tak my fun­gu­jeme. Římané ne­od­dě­lo­vali slova me­ze­rami, ale to se těžko četlo – po­ro­zu­mění be­ne­fi­tuje ze se­pa­race tokenů při­ro­ze­ného jazyka. To také není náhoda, pro­tože je to po­ho­dlné pro naše mozky, ne­mu­síme pře­mýš­let, kde končí jedno slovo a začíná jiné (stejně jako ne­mu­síme hledat, kde přesně končí ten který pár zá­vo­rek).

Tohle všechno Lisp po­sta­vil na hlavu. Ne­vy­chází z jazyka, gra­ma­tiky, me­zi­lid­ské ko­mu­ni­kace, ale z di­a­me­t­rálně od­lišné pozice: Jak můžeme udělat tohle co nej­po­ho­dl­nější pro stroje. Stroje si můžou jít nasrat. Pa­ma­tuju si, jak mi jeden pro­fe­sor říkal něco v duchu, že stroje mají pra­co­vat, lidé se mají bavit (oči­vidně nebyl ani speed freak a ani apo­ka­ly­psista). kom­pli­ko­vané zá­le­ži­tosti re­pre­zen­tace a vý­znamu bychom měli nechat stro­jům a pro­dukt udělat co nej­při­ro­ze­nější pro uži­va­tele.

Lisp si v sobě také nese stigma zkla­mání a ko­lapsu tech­no­op­ti­mismu. V še­de­sá­tých letech byl po­u­ží­ván ve vý­zkumu umělé in­te­li­gence a špičky oboru věřily, že sym­bo­lická ma­ni­pu­lace bude klíčem k mys­lí­cím strojů, nad­šení bylo ob­rov­ské a vý­zkum­níci věřili, že je od této re­a­lity dělí jen pár let.

Jak uka­zuje his­to­rie, nic z toho se ne­na­pl­nilo, až teprve teď, v Po­slední Dekádě Po­sled­ního Mi­lé­nia pokrok AI po­stu­puje mí­lo­vými kroky.

Proč tady ale píšu zrovna o Lispu, proč se sakra zmi­ňuju o im­ple­men­taci vlast­ního hyb­ridu? Tu im­ple­men­taci jsem napsal kvůli to­muhle webu. Chtěl jsem nějaký skrip­to­vací ná­stroj, který by mohl spe­ci­ficky roz­ší­řit po­měrně ri­gidní & obecný systém as­cii­blogu, změny zatím ne­com­mit­nuté, jedna z věcí, kterou ge­ne­ruje Lisp kód je ten pře­hled článků k ne­pře­hléd­nutí. Místo abych použil něco ově­ře­ného a fun­gu­jí­cího, jsem jako nad­šený idiot napsal další jazyk, který nikdo nebude po­u­ží­vat a zemře tichou smrtí. Pro­tože proč ne?

píše k47 & hosté, ascii@k47.cz