Perl (1987)
Lingvist koji je htio spašavati duše, pa je umjesto toga spojio sed, awk i shell u jedan jezik i nazvao ga biserom.
Godina je 1987., i negdje u utrobi jednog sustava koji vrti telemetriju za NASA-in podizvođač, netko upravo pokušava spojiti tri stvari koje se međusobno mrze. Awk zna brojati i rezati kolone, ali mu je stalo do teksta koliko je stalo do tebe. Sed zna zamijeniti jedan uzorak drugim, ako mu prvo objasniš uzorak jezikom koji izgleda kao da ga je napisao netko u žurbi, ljut na svijet. Shell skripta zna pozvati oboje, i to je to — ona je ljepilo, ne alat. Svaki od njih govori svoj dijalekt, a čovjek koji mora izvući log iz jednog sustava, obraditi ga i ubaciti u drugi zove se sysadmin — osoba čiji je posao održavati servere i sustave na okupu, i koja svakodnevno spaja baš ovakve alate da sve to nekako proradi. On mora znati sva tri jezika, plus C ako stvari stvarno zapnu.
Nije to nikakva tragedija, tako se radilo. Radiš zadatak, biraš alat koji odradi baš tu jednu operaciju, spajaš izlaz jednog u ulaz drugog pomoću tzv. pipea — zamisli ga kao crijevo kojim rezultat jednog programa direktno uliješ u drugi, bez da ga prepisuješ rukom — i moliš se da nijedan od njih ne promijeni format bez upozorenja. Zove se to Unix filozofija: mali alati, svaki radi jednu stvar. Lijepo na papiru. U praksi, ako imaš stotinu logova, tri formata podataka i deadline u petak, provodiš popodne prevodeći između triju gramatika koje nisu dizajnirane da razgovaraju.
U toj utrobi sjedi čovjek koji tamo, iskreno, ne bi trebao biti. Studirao je jezike. Ne programske — stvarne, ljudske, s padežima i nepravilnim glagolima i idejom da je svaka rečenica koju možeš izreći na tri različita načina zapravo bogatstvo, a ne problem. Trenirao se za misionarski rad, htio je ići nekamo daleko i prevoditi Bibliju narodima koji nemaju pismo. Umjesto toga završio je u informatici, jer se ispostavilo da i računala imaju narode bez pisma — awk, sed i shell, svaki sa svojom gramatikom — i da netko treba prevoditi i tamo.
On ne bira između awka, seda i shella. Radi ono što bi svaki lingvist s previše slobodnog vremena i previše frustracije napravio: uzme sve tri gramatike, sve njihove trikove, dobaci malo C-a za mišićnu snagu i sve to zalijepi u jedan jezik. Ne najlijepši jezik na svijetu — o tome će se raspravljati narednih trideset godina, uglavnom na njegovu štetu. Ali jezik koji govori sve dijalekte odjednom i ne tjera te da biraš.
Ono što ne znam je hoće li iz sobe negdje u Kaliforniji doći nešto što će sysadmine sljedećih deset godina spasiti od noćnih smjena provedenih u lančanom prevođenju formata. Znam samo da je 1987., da netko upravo tipka prve linije nečega što nema pravila osim onog koje glasi da postoji više od jednog načina da se nešto kaže — i da će to pravilo, koliko god zvučalo kao sloboda, jednog dana postati i optužnica.
Taj netko iz sobe u Kaliforniji ima ime — Larry Wall — i studirao je lingvistiku na Seattle Pacific University.
Zdravstveni razlozi (i, iskreno, život) preusmjerili su ga prema informatici, i tu bi većina ljudi rekla da je priča gotova — lingvist je odustao od lingvistike, postao je programer, kraj. Ali nije. Wall nije ostavio lingvistiku iza sebe kad je sjeo pisati kod. Ugurao ju je u njega. Cijela filozofija Perla, jezika koji je 1987. izbacio u svijet, temelji se na jednoj ideji koju je pokupio proučavajući ljudske jezike — a ne strojeve.
Ta ideja se zove TMTOWTDI — There's more than one way to do it, odnosno »postoji više od jednog načina da se nešto kaže«. Ako pitaš deset ljudi da opišu isti zalazak sunca, dobit ćeš deset različitih rečenica, i nijedna nije pogrešna. Neki će reći da je sunce zašlo, neki da je nebo pocrvenjelo, neki će samo reći da je bilo lijepo. Prirodni jezici toleriraju — štoviše, slave — tu vrstu redundancije. Sinonimi postoje. Različiti redoslijedi riječi postoje. Nitko te ne tjera da uvijek kažeš stvar na isti, propisani način.
Wall je pogledao programske jezike svog vremena i vidio suprotno. Vidio je jezike koji te guraju kroz jedan uski hodnik: ovako se piše petlja, ovako se piše funkcija, drugog puta nema, a ako pokušaš svoj put — kompajler (program koji tvoj kod pretvara u nešto što računalo razumije, i koji pritom rado igra ulogu strogog učitelja) te opali po prstima. Wall je odlučio da jezik ne treba tako funkcionirati. Ako je engleski dovoljno fleksibilan da izdrži i Shakespearea i poruku napisanu u žurbi, dovoljno fleksibilan da izdrži formalni ugovor i pjesmu, zašto programski jezik ne bi mogao izdržati i brzu skriptu od tri retka i cijeli sustav od tri tisuće linija, napisane na tri različita, jednako valjana načina?
Dva čovjeka, dva kontinenta, gotovo isto desetljeće, dijametralno suprotna vizija o tome što programski jezik smije dopustiti čovjeku da radi. Dok su drugi jezici tog doba vjerovali u disciplinu nametnutu odozgo, Wall je vjerovao da se disciplina, ako je uopće treba, mora roditi iznutra, iz navike govornika — a ne iz zabrane u kompajleru. Nijedan pristup nije u potpunosti u pravu. Ali samo jedan od njih je svoj jezik nazvao — sasvim ozbiljno — biserom: Wall je isprva htio ime „Pearl”, baš to, biser, dok nije otkrio da jezik s tim imenom već postoji, pa je jednostavno izbacio jedno „a” i dobio Perl.

Švicarska motorna pila
Dobro, sad kad znaš odakle je Wall dolazio — jezici, prijevodi, ljudi koji istu misao izraze na pet različitih načina — vratimo se na sam alat. Jer Perl nije bio samo filozofija upakirana u sintaksu. Bio je, sasvim konkretno, najbolji nož za rezanje teksta koji je Unix svijet ikad vidio.
Prije Perla, ako si htio izvući nešto iz gomile teksta — rezultat pretrage logova, izvještaj, ili output nekog drugog programa koji ispljune tisuću redaka besmislenog brbljanja — imao si grep za pretragu, sed za zamjenu, awk za obradu po stupcima, i shell koji je sve to trebao spojiti u nešto funkcionalno. Svaki alat govori svoj dijalekt, svaki ima svoje čudnosti, i kad ti zatreba i pretraga i zamjena i računanje u istom zadatku, pišeš skriptu koja pozove tri programa i moli se da se izlaz jednog uklopi u ulaz drugog. Radi. Ali kao da kuhaš ručak pozivajući tri različita restorana da ti dostave po jedan sastojak — i to je bio svakodnevni kruh sysadmina, često upravo spajanjem takvih alata da nešto, bilo što, proradi.
Wall je uzeo taj problem i riješio ga na način koji je bio pola genijalan, pola svetogrđe: ubacio je regularne izraze — onu čudnu, gotovo ezoteričnu notaciju za pretraživanje uzoraka u tekstu, zamisli ju kao vrlo sofisticiranu verziju onog "pretraži i zamijeni" iz Worda, samo za ljude koji su spremni patiti — ravno u srce jezika. Ne kao biblioteku koju učitaš. Ne kao poseban alat koji pozoveš. Regex je u Perlu bio građevni element, isto kao zbrajanje ili if-uvjet. Napišeš $tekst =~ /uzorak/ i gotovo, jezik sam zna što to znači i radi s tim.
A tekst je, u tom Unixovom svijetu kasnih osamdesetih, bio glavna hrana. Sve što se događalo na poslužitelju pretvaralo se u redak u nekoj datoteci — logovi prijava, izvještaji o greškama, statusi procesa, izvještaji iz baza koje su ispisivale sto stupaca odvojenih tabulatorima, jer nitko još nije čuo za JSON. Sysadmin devedesetih nije programirao u smislu u kojem to danas zamišljaš — on je čitao gomile teksta i pisao skripte koje tu gomilu pretvore u nešto razumljivo. Perl je za taj posao bio skoro nepravedno dobar.
I onda se, baš u tom trenutku, dogodio web. Ne odmah — Perl je izašao 1987., web se rodio 1991. — ali kad su ljudi počeli tražiti način da web stranica napravi nešto pametnije od statičnog, nepomičnog HTML-a, netko se sjetio: čekaj, imamo alat koji je pravljen baš za obradu teksta u letu. Tako su nastale CGI skripte — kratica za Common Gateway Interface, što je samo kompliciran naziv za jednostavnu ideju: kad klikneš gumb na stranici, netko na poslužitelju mora pokrenuti neki program koji će odgovoriti, i CGI je bio taj most između tvog klika i tog programa. Kroz cijelu drugu polovicu devedesetih, taj „netko” je gotovo redovito bio Perl. Forma koju popuniš, obrada narudžbe, gost knjiga na nekoj osobnoj stranici — vrlo vjerojatno je iza kulisa radio Perl skript od nekoliko desetaka linija koji je nekome trebao dan da napiše.
Frazu „ljepilo za cijevi” interneta ljudi su Perlu lijepili kao uvredu, iako je promašena kao takva. Ljepilo za cijevi ne izgleda lijepo na spoju dvije cijevi, ali cijev ne pušta. Perl nije bio jezik u kojem su ljudi sanjali graditi katedrale softvera. Bio je jezik u kojem si zalijepio dvije stvari koje nisu trebale razgovarati, i one su — začudo — proradile, i nastavile raditi godinama poslije, dok je autor davno zaboravio zašto je baš tako napisao taj redak.

Kultura kao proizvod
Kad jezik nastane iz jednog čovjeka koji misli da je humor legitiman inženjerski alat, dobiješ zajednicu koja se ponaša u skladu s tim. Perlovska dokumentacija — perldoc, ono što otvoriš kad ti treba objašnjenje neke funkcije — puna je fusnota koje te nasmiju dok učiš. Wall je znao pisati rečenice koje su istovremeno tehnički precizne i apsurdne, i ta navika se prelila na cijelu zajednicu. Ljudi su počeli pisati dokumentaciju kao da pišu pismo prijatelju koji je pametan, ali umoran, i kojem treba malo zabave da izdrži još jednu stranicu specifikacije.
Onda su otišli korak dalje. Perl poezija — da, to je stvarno postojala stvar — pokret u kojem programeri pišu kod koji je istovremeno valjan program i pjesma, s ritmom i rimom, objavljivan na news grupama devedesetih kao neka vrsta digitalnog haikua za informatičare. Zvuči kao gubljenje vremena. I jest, u najboljem smislu te riječi — gubljenje vremena je ono što radiš kad voliš alat, a ne kad ga samo koristiš da preživiš do plaće.
Vrhunac te kulture — ili dno, ovisno koga pitaš — su takmičenja u „obfuskaciji”, odnosno u namjernom zamagljivanju koda: cilj je napisati što nečitljiviji, najkrivlji, najmučniji Perl kod koji se može zamisliti, kod koji izgleda kao da je mačka hodala po tipkovnici — a onda se pokrene i, začudo, radi. Postoje programi koji ispisuju ASCII sliku deve, napisani u obliku te iste deve. Postoje programi koji su istovremeno valjan Perl i valjan C, ovisno samo o tome koji prevoditelj ih pročita. Ovo nije slavlje nečitljivosti zato što je nečitljivost dobra. Ovo je slavlje činjenice da je jezik toliko fleksibilan da u njemu možeš izraziti bilo što, uključujući i vlastitu ludost.
Ali dok se to prepucavanje oko filozofije vrtjelo po forumima, dogodila se stvar koja je bila mirna, tiha, praktično genijalna — i koja se rijetko spominje kad se priča o Perlu kao o šaljivom jeziku za regularne izraze. Godine 1995. pokrenut je CPAN — Comprehensive Perl Archive Network, odnosno »sveobuhvatna arhiva Perl koda«. Zamisli centralno mjesto gdje netko napiše korisnu komadinu koda, spakira je, opiše što radi, i stavi na policu da je bilo tko na svijetu može skinuti i ugraditi u svoj program jednom jedinom naredbom. Danas takvo mjesto zovemo package manager (upravitelj paketa) i uzimamo ga zdravo za gotovo — npm za JavaScript, pip za Python, sve to postoji jer je netko davno riješio isti problem. CPAN je to radio desetljećima prije njih, u vremenu kad je internet još bio nešto što si čekao na modemu da se spoji.
I evo gdje se krug zatvara na način koji zaslužuje da stane i pomisliš na trenutak: sjećaš se filozofije malih programa koji rade jednu stvar i rade ju dobro — one Unixove ideje da se sustav grade od komponenti, a ne od monolita? CPAN je ta ista ideja, samo skalirana na cijeli svijet. Umjesto da svaki programer u svakoj firmi iznova piše funkciju za parsiranje datuma ili slanje e-maila, netko je to već napisao, testirao i stavio na policu. Ti samo uzmeš. Wall, lingvist koji je volio jezike zato što dopuštaju više načina izražavanja iste misli, nesvjesno je izgradio infrastrukturu koja je dopuštala cijeloj programerskoj zajednici da izražava jednu misao — evo, ovo je riješeno, ne moraš ponovno — na tisuće različitih načina, i da je svi drugi mogu čitati kao knjigu.
Naravno, kultura koja slavi kreativnost više nego disciplinu na kraju plati cijenu — a upravo do te cijene, one koja je Perlu donijela reputaciju jezika koji izgleda kao mačja šapa na tipkovnici, stižemo za trenutak. Ali prije toga vrijedi zapamtiti da je CPAN, u trenutku kad je nastao, bio jedina stvar te vrste na planeti. Ne loša verzija nečega. Prva verzija svega.

Ljepota je precijenjena, korisnost nije
Optužba je stigla brzo i nije bila nježna. „Write-only” jezik, rekli su — jezik koji možeš napisati, ali ne i pročitati, ni ti sam, ni tjedan dana kasnije. Perlov kod, tvrdili su čistunci, izgleda kao da je mačka pretrčala tipkovnicu, pa se netko pobrinuo da se to spremi kao .pl datoteka. Regex isprepleten sa sigilima ($, @, %) — simbolima koji u Perlu obilježavaju tip varijable, je li riječ o jednoj vrijednosti, listi ili hashu, tako da se, teoretski, već iz interpunkcije vidi s čime se nosiš — pa varijable koje mijenjaju tip kad im se prohtije, i onih legendarnih trideset i sedam načina da napišeš petlju, od kojih dvadeset izgledaju kao da su izašli iz šifrarnika. Postoji, dakle, kompajlirana, dokumentirana zloba prema Perlu, i ona ima ime — Perl golf, natjecanje tko će isti problem riješiti u manje znakova, obično toliko nečitljivih da program prije podsjeća na otisak mačke na ledu. To se stvarno radilo. Ljudi su se time hvalili.
Larry Wall na sve to nikad nije reagirao kao uvrijeđeni umjetnik. Reagirao je kao lingvist, jer to je i bio. Njegova obrana nije bila da je Perl lijep — priznao je da često nije — nego da lijepota nije ni bila cilj. Prirodni jezici, poput ovog hrvatskog kojim upravo ovo čitaš, puni su nedosljednosti, iznimaka, sinonima i triput duljih rečenica nego što bi trebalo, a nitko ne traži da se engleski ukine zato što ima nepravilne glagole. Jezici koje ljudi stvarno koriste rastu kao korov, ne kao arhitektura. Wall je to namjerno prenio na programski jezik: TMTOWTDI — »postoji više od jednog načina da to napraviš« — nije bio slogan koji je izmislio marketing nakon lansiranja, nego dizajnerska odluka od prvog dana, i on ju je branio do groba.
Ono što je Wall zapravo govorio, kad skineš slojeve lingvističke romantike, glasi ovako: jezik postoji za ljude koji njime rade posao pod pritiskom, a ne za profesore koji ga procjenjuju na predavanju o teoriji programskih jezika. Sysadmin u tri ujutro, s produkcijskim serverom koji gori, ne treba elegantnu apstrakciju — treba jednu liniju koda koja izvuče IP adrese iz megabajta logova prije nego šef stigne na posao. Perl je za to napravljen, i u tome je, dokazano, bio bolji od svega što je postojalo. Nije slučajno da su tisuće administratora širom svijeta imale skriptu koja je spašavala noć — zvala se nekako.pl, imala tri retka regexa koje nitko osim autora nije razumio, i vraćala se, spremna, godinama.
Pošteno vaganje, dakle, ne ide u korist ljepote onako kako je čistunci vole zamišljati. Milijuni poslova, računa, izvještaja, migracija podataka i noćnih popravaka odrađeni su u Perlu — ružno, brzo i na vrijeme. Nasuprot tome stoji zamišljeni, savršeno čitljiv kod koji nikad nije napisan, zato što je programer još razmišljao o ispravnoj apstrakciji dok mu je rok pred nosom curio kroz prste. Perlov grijeh nije bio što je bio ružan. Grijeh je bio što je, jednom napisan, ostajao ružan zauvijek — jer ga je jedino osoba koja ga je napisala mogla dešifrirati, a ta osoba je, po zakonu korporativne fluktuacije, do sljedeće godine već bila negdje drugdje.

Zalazak i sjena
Devedesete su Perlu bile zlatno doba. Bio je jezik weba prije nego što je web znao da mu treba jezik — svaki CGI skript koji je ispisivao HTML na neku posluženu stranicu vjerojatno je negdje na početku imao shebang s riječju perl, onaj prvi redak skripte (poput #!/usr/bin/perl) koji sustavu govori kojim programom pokrenuti datoteku. Ali zlatno doba ima jednu osobinu koju svi zaborave dok ga žive: prolazi. I dok je Perl slavio, u pozadini je rastao jezik koji je radio gotovo isto što i on, samo — čitljivije.
Python je Perlu oduzimao teritorij polako, gotovo pristojno. Nije bio brži, nije imao bolji regex, nije imao ni CPAN u svom prvom desetljeću. Imao je jednu ideju koja je Wallovoj filozofiji bila direktna protuteža: da postoji jedan očit način da se nešto napiše, i da je to dobro. Tamo gdje je Perl vikao „There's more than one way to do it” („Postoji više od jednog načina da se to napravi”) kao zastavu slobode, Python je šapnuo „There should be one — and preferably only one — obvious way” („Trebao bi postojati jedan — i po mogućnosti samo jedan — očit način”), i pokazalo se da puno više ljudi želi tu tišinu nego tu slobodu.
Wall na sve to nije gledao skrštenih ruku. Odgovor Perl zajednice na sve glasnije žalbe o nečitljivosti — na šale o „write-only” jeziku koje su sad prelazile iz zajebancije u ozbiljnu kritiku — bio je ambiciozan, hrabar, i u konačnici katastrofalan po tempu: Perl 6. Najavljen 2000. kao potpuni redizajn jezika, s obećanjem da će riješiti sve što je starom Perlu nedostajalo, a ništa od onoga zbog čega su ga ljudi voljeli.
Perl 6 je izlazio petnaest godina. Petnaest. Za usporedbu — cijeli je web u tom vremenu prošao kroz Web 2.0, mobitele, cloud i barem dva hype ciklusa umjetne inteligencije. Dok je zajednica čekala redizajn koji stiže „uskoro”, Python je tiho, bez drame, postajao zadani jezik za skripte, za analizu podataka, za sve ono za što je Perl nekad bio prvi izbor. Kad je Perl 6 konačno stigao 2015., dogodilo se ono što se dogodi svakom projektu koji čeka toliko dugo da mu ime izgubi vrijednost — s vremenom je preimenovan u Raku, kao da i sam priznaje da onome tko je čekao Perl 6 zapravo isporučuje sasvim drugi jezik.
Klasičan Osborneov efekt, samo naplaćen jeziku umjesto tvrtki (Osborne je početkom osamdesetih najavio nasljednika svog računala tako rano da su ljudi prestali kupovati postojeći model — a onda nasljednik nije stigao na vrijeme, i tvrtka je propala). Isti mehanizam: najaviš nasljednika toliko rano i toliko glasno da ubiješ tržište za ono što već imaš, a onda ne isporučiš nasljednika na vrijeme da ga netko dočeka budan. Stari Perl je stagnirao jer je „nova verzija stiže”. Nova verzija je stigla kad je već bilo kasno da to ikoga zanima.