V matematiki iščemo navdih za nova orodja

Kaj so prestrezniki učinkov in kako matematika in računalništvo hodita z roko v roki? O tem v pogovoru z Matijem Pretnarjem, teoretičnim računalničarjem.
Fotografija: Matija Pretnar je predavatelj in raziskovalec na ljubljanski fakulteti za matematiko in fiziko.
FOTO: Jure Eržen
Odpri galerijo
Matija Pretnar je predavatelj in raziskovalec na ljubljanski fakulteti za matematiko in fiziko. FOTO: Jure Eržen

Doc. dr. Matija Pretnar z ljubljanske fakultete za matematiko in fiziko (FMF) je dobitnik prestižne nagrade na področju programske opreme – test of time award, ki jo podeljuje ETAPS, Evropska krovna konferenca o teoriji in praksi programske opreme. Nagrado si deli s kolegom in mentorjem, prof. dr. Gordonom D. Plotkinom z edinburške univerze, in sicer za prestreznike učinkov, ki so elegantno orodje za izražanje številnih pojmov v različnih programskih jezikih.

Nagrado ste prejeli za znanstveni članek Handlers of Algebraic Effects izpred desetih let s področja razvoja programskih jezikov, ki govori o prestreznikih učinkov.

Članek je bil odgovor na vprašanje, ki je bilo takrat odprto slabih deset let. Moj mentor prof. Plotkin je s sodelavcem Johnom Powerjem odkril nov način, kako v programskih jezikih predstaviti računske učinke, ki za seboj potegnejo vrsto zapletov. Teoretični računalničarji skušamo s pomočjo matematike analizirati programe, ki bi jih najraje opisali s funkcijami v matematiki. Vendar so matematične funkcije v nasprotju s programi čiste, nimajo stranskih učinkov, vsakič dajo isti rezultat in se med računanjem ne sesujejo.

Računalničar Eugenio Moggi je v ta namen v funkcijskem programiranju na začetku 90. let vpeljal monade, sicer že od prej znan matematični pojem, ki so postale pomembne strukture v programiranju, Plotkin in Power pa sta nato okoli leta 2000 predstavila še nekoliko bolj prefinjeno ali razdelano različico monad, proste algebre, v katerih si lahko vsako izvajanje programa predstavljamo kot drevo, ki se ob vsakem učinku razveji na toliko vej, kolikor je možnih izidov učinka. Kar nekaj problemov je bilo s tem rešenih, seveda pa ne vsi in ena kritična točka so bili prestrezniki izjem.

image_alt
Umetna inteligenca je samo orodje, kot kladivo

Torej, kaj so prestrezniki izjem, in naprej, kaj prestrezniki učinkov?

Teoretično računalništvo skuša rešitve, ki so se že pojavile v praksi, spraviti v matematične okvire, da bi bilo tako manj napak, da bi še hitreje lahko pisali programe. Foto FOTO: Jure Eržen
Teoretično računalništvo skuša rešitve, ki so se že pojavile v praksi, spraviti v matematične okvire, da bi bilo tako manj napak, da bi še hitreje lahko pisali programe. Foto FOTO: Jure Eržen
V programskih jezikih se lahko marsikaj zalomi in mi želimo vse te napake uloviti. Tako v programu na primer napišemo, naj del kode, če se bo zgodila napaka, uporabniku sporoči, da preveri, ali je pravilno vpisal naslov spletne strani. To so prestrezniki izjem. Z mentorjem sva ugotovila, da ti ustrezajo naravnemu matematičnemu pojmu – homomorfizmom omenjenih algeber. Izkazalo se je, da tako lahko opišemo ne le prestreznike izjem, ampak še kup drugih pojmov z različnih področij programiranja, denimo sočasne procese, večnitno izvajanje in podobno. To je nekako bistvo dela teoretičnih računalničarjev, saj želimo praktične rešitve opisati s teorijo in hkrati teoretične ideje preliti nazaj v prakso. Prej omenjene prestreznike izjem sva posplošila na prestreznike učinkov. To je novo orodje, ki ga imajo zdaj v rokah programerji. Tako kot jeziki, ki imajo samostalnike, glagole, stavke, imajo tudi programski jeziki različne sestavne dele, od zank do pogojnih stavkov, in zdaj tudi prestreznike učinkov.

Lahko navedete primer, kako prestrezniki učinkov delujejo?

S prestrezniki učinkov lahko ulovimo posamezne dogodke, ki jih sprožijo programi, hkrati pa imamo še vedno dostop do preostanka programa. Primer: rad bi, da računalnik pregleda vse možnosti, zato mu v programu na določenih mestih napišem, naj se odloči med dvema ponujenima možnostma. Ne pozabimo, računalnik je samo stroj, on ne tehta tako kot ljudje, ampak potrebuje natančna navodila. Zato okoli programa ovijemo še prestreznik učinkov, ki določi, da naj ob vsaki odločitvi preostanek izvede s prvo izbiro. Če je rezultat uspešen, lahko izvajanje konča, če ni, naj poskusi še drugo možnost.

Še en primer je pri sočasnem izvajanju več ukazov, ki se med seboj izmenjujejo. S prestreznikom lahko določite, na kakšen način naj program na neki točki počaka in da prednost drugemu ukazu.

Vse to se je že prej dalo opisati v programskih jezikih, ampak dostikrat je bilo treba preurediti celoten program, prestrezniki učinkov pa to omogočajo s spremembo samo enega dela programa.

So prestrezniki učinkov orodje, ki ga lahko uporabljajo v vseh programskih jezikih, ali pa je morda to orodje še posebej dobrodošlo na točno določenem področju računalništva?

Prestreznike so najprej posvojili v funkcijskem programiranju, ki je najbližje matematiki. Zanimivo je, da ideje, ki so jih funkcijski programerji imeli pred 30 leti, zdaj počasi prihajajo v vodilne programske jezike. Dodajanje novih orodij obstoječim programskim jezikom je seveda precej zapleteno zaradi združljivosti s starimi različicami. Prav zares bodo denimo prestreznike implementirali v novi verziji programskega jezika OCaml, ki je eden bolj znanih funkcijskih jezikov. Presenetilo pa me je, da so jih v svoji knjižnici uporabili pri podjetju Meta, ki ga bolj poznamo pod imenom Facebook. To je knjižnica React, ki se uporablja za uporabniške vmesnike na spletu, ima jo skoraj vsaka druga stran, čeprav se seveda večina nas tega ne zaveda.

image_alt
Optično vezje, ki raste kot živo bitje

Predstavili ste jih pred več kot desetletjem, kaj se zdaj dogaja na tem področju?

Kot se pogosto zgodi, so stvari ušle z vajeti (nasmeh). Z njimi se je ukvarjala skupina v Edinburgu, predvsem Ohad Kammar in Sam Lindley, sam sem se vrnil v Slovenijo, kjer sva s profesorjem Andrejem Bauerjem razvila prototipni programski jezik Eff. Z njim sva želela pokazati, kako prestrezniki delujejo, saj so bili do takrat samo ideja na papirju. Kmalu zatem so seveda rešitev prevzeli tudi drugi programerji in jo preizkušali v drugih jezikih. Ideja se je pravzaprav ponekod tako preoblikovala, da je niti ne prepoznam več.

Vi še nadaljujete delo na tem področju?

Da, imam še veliko vprašanj, ki bi jih rad razrešil. Trenutno se ukvarjam s tem, kako bi bili čim bolj učinkoviti. Programski jezik je most med računalnikom in človekom in želimo, da bi človek svoje ideje izrazil čim bolj jasno in na enostaven način, računalnik pa mora nato to učinkovito izvesti. Prvi del smo nekako pokrili, pri drugem delu pa zdaj dobivamo obetavne rezultate. Omenil sem, da imajo prestrezniki, ko se nekaj zgodi, dostop do preostanka programa, ki ga lahko izvedejo enkrat, večkrat ali pa nikoli. Večina prestreznikov to nadaljevanje izvede največ enkrat in temu so prilagojene trenutne implementacije, v primeru večkratnih ponovitev pa je izvajanje manj učinkovito. Zdaj poskušam rešiti to zagato.

Sodelujem tudi pri vpeljavi prestreznikov v programski jezik WebAssembly, ki so ga začeli razvijati veliki igralci od Appla do Microsofta, saj želijo nov standard, ki naj bi nadomestil JavaScript. Ta jezik ima formalno matematično specifikacijo in po narejeni osnovni verziji so začele kapljati želje, kaj vse naj še vsebuje. Izkazalo se je, da bi lahko več teh zmožnosti izrazili z enim orodjem, to je s prestrezniki.

Programski jezik je most med računalnikom in človekom in želimo, da bi človek svoje ideje izrazil čim bolj jasno in na enostaven način, računalnik pa mora nato to učinkovito izvesti. FOTO: Jure Eržen
Programski jezik je most med računalnikom in človekom in želimo, da bi človek svoje ideje izrazil čim bolj jasno in na enostaven način, računalnik pa mora nato to učinkovito izvesti. FOTO: Jure Eržen

Ste bili najprej matematik, ki je postal programer, ali obratno?

Najprej sem bil matematik. Kot otroka me programiranje ni zanimalo, potem pa me je na fakulteti prof. Andrej Bauer navdušil nad teoretičnim računalništvom. Na FMF imamo zelo močno skupino na tem področju, kar dokazuje tudi to, da bomo letos po zaslugi prof. Bauerja gostili največjo konferenco s področja funkcijskega programiranja. S programiranjem sem vseskozi v stiku, saj o tem tudi predavam in študentom želim predstaviti najnovejše smernice.

image_alt
Matematika je kraljica in sužnja drugih ved

Teoretično računalništvo skuša rešitve, ki so se že pojavile v praksi, spraviti v matematične okvire, da bi bilo tako manj napak, da bi še hitreje lahko pisali programe. Z matematiko tako formaliziramo računalništvo, hkrati pa v njej iščemo navdih za nova orodja. Programer Leo White je to lepo opisal, da je teorija programskih jezikov kot arhitektura. Kot arhitekti se moramo držati pravil, da bo hiša stala in bo varna in stabilna, kakšna bo videti, pa si lahko izmišljuješ. Včasih lahko kar nekaj časa tavaš v temi. Najbolj mi je všeč to odkrivanje stvari, ki so že tam, a so vseeno skrivnostne. Mi nikoli ne rečemo, da smo nekaj izumili, ampak da smo nekaj odkrili. Tudi prestrezniki so leta čakali, da bomo lahko prek njih izrazili svoje ideje.

Teoretično računalništvo se je začelo razvijati, preden smo sploh imeli računalnike, pravi razmah pa je doživelo po drugi svetovni vojni. Na tem področju smo tako šele na začetku in potencial je ogromen. Študentom pogosto povem, da mi iščemo rešitve, ki bodo uporabne čez 30 let. Nekoliko pri tem zamolčim, da je tako tudi zato, ker tvojega dela nihče ne opazi. Mi delamo orodja za ljudi, ki delajo orodja za ljudi … Ta veriga je lahko zelo dolga. Vendar se je tudi pri tej nagradi, ki sva jo dobila za delo, staro le malo več kot deset let, izkazalo, da nas vseeno nekdo spremlja.

Pri vsem tem pa mora biti zraven še sreča. Precej stvari se je moralo poklopiti: v pravem trenutku videti problem, ga rešiti, ampak predvsem gre zasluga drugim strokovnjakom, ki so v preteklosti morali postoriti marsikaj, da so celotno področje pripeljali do točke, ko naše ideje, čeprav se včasih zdi, da gre za neuporabno teorijo, prepoznajo tudi v praksi.

Preberite še:

Komentarji: