Pascal (1970)

Švicarac koji je cijeli život brisao kod dok su svi drugi dodavali — i baš zato ga danas svi kradu, samo mu to ne priznaju.

poglavlje 23/2716 min čitanja1970 – 1980

Zürich, 1970. Tramvaji stižu na vrijeme do te mjere da njihovo vrijeme dolaska djeluje kao dogovor, ne kao procjena. Jezero mirno, planine uredno poredane u pozadini kao da ih je nešto poravnalo ravnalom, i cijeli grad odiše osjećajem da negdje postoji Red s velikim R, i da je taj red — normalan. Nije vrlina. Nije trud. Samo je tako. U takvom gradu, na ETH-u (tehničkom sveučilištu koje je, uzgred, i Einsteinu bilo premalo zabavno pa je bježao s predavanja), sjedi čovjek koji se upravo vratio iz Kalifornije, i taj mu se kontrast posve zario pod kožu.

Niklaus Wirth je bio u Stanfordu, sudjelovao u odborima koji su krojili ALGOL (K1, pogl. 22) — jedan od najutjecajnijih ranih programskih jezika, za koji je baš takav odbor znanstvenika pokušavao skovati zajednički standard — onim skupovima pametnih ljudi koji su, svaki sa svojom idejom o tome što jezik treba raditi, na kraju proizvodili čudovišta s previše glava. ALGOL 68 je bio takvo čudovište: moćan, elegantan na papiru, i posve neupotrebljiv za bilo koga tko nije upravo napisao specifikaciju. Wirth je gledao tu katedralu koja se gradila da impresionira druge arhitekte, i pomislio ono što bi svaki Švicarac pomislio gledajući pregrijanu, prezahtjevnu građevinu: ovo je previše. Ne treba biti veće. Treba biti točno.

Vratio se doma, dakle, s jasnom slikom onoga što ne želi. A onda je otišao predavati studentima, i tamo ga je dočekala druga vrsta katastrofe — mnogo prizemnija, ali ne manje bolna. Studenti su učili programirati na FORTRAN-u i asembleru, dvama starijim jezicima iz doba kad se računalima još obraćalo skoro izravno njihovim jezikom — asembler je pisan gotovo pa u instrukcijama samog procesora, bez ikakvih sigurnosnih ograda koje će kasniji jezici uvesti. To znači: učili su jezike koji te nagrađuju za trik. Za onu genijalnu, prljavu petlju koja radi zato što si znao trik s registrom, ne zato što si razmislio o problemu. Jezik ti ne kaže ništa kad zabrljaš — samo šuti, i tvoj program se sruši tri sata kasnije, na posve drugom mjestu, iz posve drugog razloga, i ti sjediš i pitaš se zašto te svemir mrzi.

Wirth je to gledao i vidio dvije krajnosti od kojih obje kažnjavaju krivu stvar. Odbor kaznio ga je za nedostatak mašte — htio je jednostavnost, dobio je barokni ukras. Studenti u učionici bili su kažnjeni za nedostatak strogosti — htjeli su naučiti misliti, a jezik im je dopuštao da se izvuku bez toga. Negdje između te dvije katastrofe, u gradu gdje tramvaj kasni tri sekunde i to je vijest, rodila se ideja: jezik-učionica. Ne moćan. Ne slavan. Samo malen, strog i jasan — jezik koji te ne pušta van iz sobe dok ne razmisliš.

Nije znao još da će taj mali, disciplinirani jezik za studente doživjeti karijeru koju nikakav odbor ne bi mogao izglasati. Ali za sada, 1970., ima samo papir, olovku i odluku da će sljedeći jezik biti onoliko velik koliko treba biti. Ni gram više.

Zamisli odbor. Ne bilo kakav odbor — pravi, europski, s dnevnim redom od dvadeset stavki i podnaslovima koji imaju svoje podnaslove. Krajem šezdesetih upravo takav odbor sjedi nad ALGOL-om 68, jezikom koji je trebao biti nasljednik ALGOL-a 60, a postao je spomenik svemu što se dogodi kad pametni ljudi poželte da jezik radi baš sve. Ortogonalnost, kažu — svaka se konstrukcija smije kombinirati sa svakom drugom, a iz toga izlazi gramatika debela kao telefonski imenik i sintaksa koju ni sami autori ne uspijevaju objasniti bez dodatnog rječnika pojmova koje su, ironično, sami izmislili.

Niklaus Wirth je u tom odboru. Predlaže rezove. Predlaže da se izbaci ono što nitko neće koristiti, da se jezik smanji na ono što se stvarno može naučiti u jednom semestru. Odbor ga presluša, blago rečeno — što znači da ga uglavnom ignorira. ALGOL 68 izlazi u punoj slavi 1968., debeo, moćan, teoretski dosljedan — i praktično nekoristiv izvan uskog kruga ljudi koji su ga i pisali.

Wirth ustaje od stola i odlazi kući. I ne u prenesenom smislu — stvarno se vraća u Zürich, na ETH, gdje ga čekaju studenti kojima ne treba ortogonalna gramatika. Njima treba jezik koji im neće dopustiti da napišu glupost. To je razlika koju je odbor promašio: jezik nije izložba mogućnosti inženjera koji ga je sagradio, jezik je alat za onoga koji njime nešto pravi, često po prvi put, često u tri ujutro prije ispita.

Ovdje se, uzgred, rađa i jedna od Wirthovih kasnijih opservacija koja će ga nadživjeti dulje od bilo kojeg jezika koji je napisao — Wirthov zakon: softver postaje sporiji brže nego što hardver postaje brži. Nije to gorka šala penzioniranog profesora, nego direktan nastavak iste borbe. Odbori i timovi koji dodaju slojeve »samo da bude fleksibilno« proizvode programe koji trebaju sve jače procesore da bi radili istu stvar koju je stariji, manji program radio na desetinku resursa. Kompleksnost se ne osvećuje odmah — osveti se računu za struju i vremenu čekanja, godinama poslije.

Dakle, 1970., dok ALGOL 68 još kola po konferencijama kao dokaz da su Europljani sposobni dizajnirati jezik kompliciraniji od poreznog zakona, Wirth u Zürichu tiho objavljuje nešto sasvim drugo. Jezik nazvan po matematičaru koji je volio uređen svijet i jasne dokaze — Blaiseu Pascalu. Nema u njemu ničega revolucionarnog na prvi pogled. Nema egzotičnih struktura, nema deset načina da napišeš istu petlju. To je upravo poanta. Odbor je izgradio katedralu u kojoj se lako izgubiti. Wirth gradi učionicu u kojoj se ne može.

Jezik kao pedagogija
§ 02

Jezik kao pedagogija

Wirth je to gledao iz prve klupe, doslovno — kao profesor — i zaključio da problem nije u studentima, nego u jeziku kojim ih se tjera da razmišljaju. Pa je napravio jezik koji ne dozvoljava prečac dok ne shvatiš zašto je prečac prečac.

Srce te ideje su strogi tipovi. Zvuči kao sitna administrativna gnjavaža — moraš deklarirati je li varijabla broj, znak ili niz, i to ostaje zauvijek to, bez tihog pretvaranja iz jednog u drugo kad kompajler (program koji tvoj kod prevodi u jezik razumljiv procesoru, i pri tome, ako je pošten kao Pascalov, prvo provjeri jesi li negdje zabrljao) pomisli da bi ti to možda odgovaralo. FORTRAN i C su te stvari (i danas) tolerirali s osmijehom slegnutih ramena, Pascal ne. Pokušaš staviti broj gdje ide slovo, kompajler te zaustavi na licu mjesta, prije nego program uopće krene. Nezgodno kad žuriš. Spasonosno kad ne znaš da žuriš u zid.

Isto vrijedi i za strukturu. Pascal te fizički sili da prije pisanja koda razmisliš o obliku programa — deklariraš sve na početku, blokove označavaš begin i end poput zagrada koje se ne mogu razmimoiliti, a petlje i uvjete pišeš onako kako bi ih i nacrtao na papiru. Nema goto-skokova na sve strane kao poziva u pomoć iz asemblerskog kaosa (o toj drami više u poglavlju o strukturiranom programiranju). Ima samo pitanje koje te jezik neprestano vraća pitati: što ova stvar radi, i zašto na ovom mjestu? Neugodno pitanje za osamnaestogodišnjaka koji samo želi da program ispiše zvjezdice u obliku trokuta. Ali upravo je to pitanje koje FORTRAN nikad nije postavljao, jer mu nije bilo stalo.

I to je upravo razlog zašto je Pascal postao jezik s kojim je odrasla cijela generacija — zapravo nekoliko generacija. Ne u industriji, tamo je kraljevao FORTRAN, a uskoro i C, nego u učionicama, od Stanforda do sveučilišta za koja Amerika nije ni znala da postoje. Balkan uključen, dakako — u osnovnim i srednjim školama devedesetih Pascal je bio ono što bi danas bio Python: prvi jezik, onaj u kojem naučiš da program ima početak i kraj, da varijabla nije čarolija nego kutija s etiketom, i da kompajler nije neprijatelj nego dosadni, ali pravedni profesor koji te ne pušta dalje dok ne riješiš zadatak.

Ono što je Wirth zapravo izumio nije jezik u smislu alata za pisanje softvera, nego jezik u smislu alata za pisanje mišljenja. Svaki tip koji deklariraš, svaki begin koji upariš s end, mala je vježba discipline koju ćeš, htio-ne htio, ponijeti sa sobom u svaki sljedeći jezik koji ikad dotakneš. Zato programeri koji su prošli kroz Pascal u pravilu ne pišu bolji Pascal — pišu bolji sve ostalo.

P-code: prenosivost prije Jave
§ 03

P-code: prenosivost prije Jave

E sad dolazimo do dijela koji Wirth nikad nije naglašavao dovoljno glasno, a trebao je, jer bi mu to danas donijelo barem jednu rečenicu slave koju bi svi pamtili. Dok je slagao Pascal kao jezik za učionicu, morao je riješiti sitan praktični problem: na kojem računalu se to točno vrti? Odgovor je bio — na hrpi različitih. Fakulteti su imali pravi zoološki vrt strojeva, svaki sa svojim procesorom, svojom memorijom, svojim čudnim navikama. Pisati kompajler koji za svaki od njih posebno generira strojni kod bilo bi ludilo — i to ludilo koje ne rješava nijedan pedagoški problem, samo trati vrijeme.

Rješenje je bilo elegantno do te mjere da je danas standard, a tada je bilo skoro pa herezija: umjesto da kompajler cilja stvarni procesor, cilja zamišljeni procesor. Onaj koji ne postoji nigdje osim na papiru i u glavama ljudi koji su ga dizajnirali. Zove se p-code — p od portable, ne od nečeg pametnijeg — i to je jednostavan skup instrukcija koji svaki stvarni stroj može odglumiti ako mu se napiše mali program koji ga tumači. Kompajler radi svoj posao jednom, generira p-code, i taj p-code putuje bilo gdje. Na odredištu čeka tanak sloj softvera — interpreter — koji čita te instrukcije i pretvara ih u ono što lokalni procesor stvarno razumije.

Zvuči poznato? Trebalo bi. To je virtualni stroj — zamišljeni procesor koji postoji samo kao softver, ali se prema njemu programi odnose kao prema stvarnom. Ista ideja koja će dvadesetak godina kasnije nositi naziv JVM (Javin virtualni stroj), dobiti logo s kavom i marketinški slogan koji zvuči kao da je Sun to izmislio u garaži dok je sunce zalazilo iza Silicijske doline. Nije. Wirth i njegovi ljudi su to sastavili u Zürichu jer im je trebalo praktično rješenje za sitan, dosadan problem prenosivosti, ne jer su sanjali o osvajanju svijeta softvera. Ironija je debela kao švicarski sir s rupama: čovjek koji je cijeli život bježao od kompleksnosti nesvjesno je posadio jednu od najutjecajnijih arhitektonskih ideja u povijesti računarstva, i to kao usputno rješenje, ne kao glavni proizvod.

Najveći dokaz da ideja radi stigao je iz San Diega, s projektom koji se zove UCSD Pascal — cijeli operativni sustav i razvojno okruženje izgrađeno oko p-code stroja, dovoljno kompaktno da stane na disketu, dovoljno prenosivo da isti softver radi na Apple II, na Teraku, na hrpi strojeva koji međusobno nisu imali gotovo ništa zajedničko osim toga da su svi znali odglumiti isti zamišljeni procesor. Za studenta koji je kupio Apple II za džeparac i htio programirati nešto ozbiljnije od igranja »Lemonade Stand«, UCSD Pascal je bio prozor u svijet u kojem tvoj kod nije zarobljen u kutiji koju si kupio.

Cijena te elegancije, doduše, postoji, i Wirth bi je prvi priznao jer je iskren do bola: interpretacija p-koda je sporija od izravno kompajliranog strojnog koda. Plaćaš prenosivost brzinom. To je razmjena koju danas svaki programer poznaje instinktivno, čak i kad ne zna da je Wirth prvi platio tu cijenu na velika vrata. Kad tvoj Java program radi malo sporije nego bi trebao, negdje u lancu uzročnosti stoji švicarski profesor koji je 1970. samo htio da studentov kod radi i na fakultetskom mainframeu — onom golemom, skupom centralnom računalu na koje se spajalo hrpu terminala, tipičnom prizoru na fakultetima i u firmama tog doba — i na susjednom terminalu, bez da mora prepisivati sve iznova.

Turbo trenutak
§ 04

Turbo trenutak

Prijeđimo desetljeće dalje, jer priča o Pascalu nije završila u švicarskim učionicama — tek je tamo dobila disciplinu. Godina je 1983., mjesto Kalifornija, a čovjek koji je taj strogi, pedagoški jezik iznio na tržište zvao se Philippe Kahn, Francuz koji je u Silicijsku dolinu došao s malo love i puno drskosti. Osnovao je firmu i dao joj ime koje zvuči kao nešto što bi lik iz akcijskog filma vikao dok upada kroz prozor — Borland — i onda napravio nešto što je Wirthu, sa svom njegovom urednošću, vjerojatno izmamilo osmijeh, iako pomalo zbunjen. Uzeo je njegov jezik-učionicu i naoružao ga.

Proizvod se zvao Turbo Pascal, i ime nije bilo marketinška fraza nabačena da zvuči brzo — bilo je doslovno istinito, što je u industriji softvera rijetkost vrijedna zapisivanja. Dok su drugi kompajleri tog vremena mljeli i mljeli, grickali memoriju i minute, Turbo Pascal je kompajlirao program u sekundama. Cijeli lanac — piši, kompajliraj, pokreni, gledaj gdje je puklo, popravi, pa opet — sažeo se u jednu petlju koja se osjećala kao razgovor, a ne kao slanje pisma pa čekanje odgovora. Danas to zovemo IDE-om, integriranim razvojnim okruženjem, kao da je to bila neka velika arhitektonska ideja. Nije bila. Bila je posljedica jednog čovjeka koji se toliko iznervirao na sporost da je napisao kompajler koji stane u jedan prolaz kroz kod, umjesto uobičajenih nekoliko.

I tu se jezik koji je nastao kao alat za disciplinu studentskog uma pretvara u jezik naroda — riječ koju ne koristim slučajno, jer je upravo taj osjećaj Turbo Pascal donio kućnim korisnicima osamdesetih. Wirth je htio da studenti misle prije nego što tipkaju; Kahn je htio da do tipkanja uopće dođe bilo tko, student ili ne, a da mu pri tom banka ne javi da je potrošio previše. Jezik je isti, disciplina je ista, strogi tipovi i čitljiva struktura nisu se maknuli ni za slovo — promijenio se samo kontekst, iz predavaonice u dnevnu sobu s kućnim računalom i disketom u ladici.

Ono što je slijedilo nakon toga — cijela era Borlanda, urednika koda u plavom ekranu, prozorčića koji se otvaraju i zatvaraju kao da razgovaraju s tobom, i konačno Delphija koji je tu istu filozofiju spakirao u nešto s gumbima i mišem — zaslužuje svoje poglavlje i dobit će ga. Ovdje je bitno samo zapamtiti trenutak preokreta: jezik osmišljen da nauči disciplinu postao je jezik u kojem se ta disciplina prodavala jeftino, brzo i svima. Wirth je gradio katedralu za tihu kontemplaciju; Kahn je u tu katedralu ubacio jukebox, i ispalo je da to nije bogohuljenje. Ispalo je da je to upravo ono što je katedrali trebalo da preživi.

Ostavština stroge ljubavi
§ 05

Ostavština stroge ljubavi

Sad, obrat koji nitko u Zürichu 1970. nije naručio: Wirthov najstroži, najasketskiji jezik postao je — pripremi se — komercijalni hit, a njegova unučad zove se Delphi. Isti kostur, samo obučen u odijelo za Windows, s vizualnim formama koje se slažu povlačenjem miša, i s produkcijskim timom koji je shvatio da disciplina prodaje ako joj daš lijepo sučelje.

Delphi je devedesetih bio ono što danas zovemo full-stack alat — dakle jedan program u kojem odradiš baš sve, od sučelja do baze podataka — prije nego je taj izraz uopće postojao: piši logiku, povuci gumb, spoji na bazu, kompajliraj za par sekundi, gotovo. Cijela jedna generacija programera u ovim krajevima — da, baš ovim, s ove strane Jadrana i dalje — učila je zanat na tom paketu, ne na nekom MIT-ovom skripti koju je vidjelo pet ljudi. Knjige su kolale, fotokopirane, s koricama koje su izgledale kao da su tiskane u podrumu.

E sad, dok se Delphi širio kao vatra po lako zapaljivom tržištu jeftinih PC-a, sam Wirth je otišao — kako bi rekli — u drugom smjeru, i to davno prije. Dok su drugi jezici, pogotovo devedesetih, dodavali i dodavali — nove klase, nove iznimke, sintaksu za sintaksu — on je već kroz sedamdesete i osamdesete dizajnirao Modulu, pa Modulu-2, pa Oberon. Svaki sljedeći manji od prethodnog. Ne zato što ne bi znao dodati stvari — znao je bolje od bilo koga u toj struci — nego zato što je i dalje vjerovao u onu istu rečenicu s početka poglavlja: jednostavnost je disciplina, a ne siromaštvo. Dok je industrija tumačila „više mogućnosti” kao sinonim za „bolji jezik”, on je i dalje brisao.

Tržište je, dakle, uzelo Turbo Pascal i Delphi, iscijedilo ih do kraja devedesetih, i onda prešlo dalje — na Javu, na C#, na sve što je nudilo isto obećanje uz bolji marketing. Borland je nestao, ime se prodavalo iz ruke u ruku kao stara kuća koju svi hoće srušiti i sagraditi nešto novo na parceli. Wirth nikad nije bio miljenik burze; njegovi jezici nisu osvojili tržište, i on to, koliko se zna, nije previše žalio.