Ljubavno pismo učenju
Sredinom osamdesetih godina Unix je već pružao izuzetno moćno okruženje za rad sa tekstom, datotekama i procesima, ali se njegova snaga najčešće otkrivala kroz čitav niz međusobno povezanih alata. Administrator sistema mogao je da pretražuje sadržaj pomoću programa grep, da menja tekst pomoću sed-a, da izdvaja podatke i oblikuje izveštaje pomoću awk-a, a zatim da sve te korake poveže komandnim interpreterom. Takva kultura malih, pažljivo usmerenih programa predstavljala je jedno od velikih dostignuća Unixa, sve dok zadatak ne bi prerastao mogućnosti kratkog komandnog lanca. Tada su skripte postajale nepregledne, logika programa rasipala se na više mesta, obrada grešaka ostajala krhka, dok je svaka složenija struktura podataka gurala programera prema jeziku C.
C je donosio potrebnu snagu i kontrolu, zajedno sa obavezom da se vodi računa o memoriji, tipovima podataka, ulazu, izlazu, sistemskim razlikama i brojnim pojedinostima udaljenim od osnovnog zadatka. Za poslove koji su se sastojali od čitanja dnevničkih zapisa, izdvajanja podataka iz velikih tekstualnih datoteka, povezivanja informacija sa udaljenih računara i sastavljanja preglednih izveštaja, takav put često je bio nesrazmerno dug. Između kratke Unix komande i ozbiljnog programa u C-u prostiralo se široko područje svakodnevnih problema za koje još nije postojao dovoljno izražajan, prilagodljiv i pristupačan jezik. Upravo u tom prostoru pojavio se Perl.
Larry Wall suočio se sa tim nedostatkom 1987. godine, radeći na projektu koji je obuhvatao razmenu i obradu podataka između više Unix sistema. Postojeći alati mogli su uspešno da izvrše pojedinačne delove zadatka, ali je čovek morao neprestano da prelazi iz jednog načina mišljenja u drugi: awk je bio prirodan za rad sa redovima i kolonama, komandni interpreter za pokretanje i povezivanje procesa, sed za preobražavanje teksta, a C za sve što je zahtevalo složeniju organizaciju programa. Wall je zato počeo da oblikuje jezik koji bi njihove najbolje sposobnosti povezao u jedinstvenu izražajnu celinu, dovoljno sažetu za svakodnevnu automatizaciju i dovoljno snažnu da izraste u ozbiljan program.
Prva javna verzija Perla objavljena je 18. decembra 1987. godine. Njegova početna namena ogledala se u pretraživanju tekstualnih datoteka, izdvajanju podataka i oblikovanju izveštaja, ali je način na koji su ti poslovi objedinjeni odmah nagovestio znatno širi domet. Perl je preuzeo poznate elemente iz C-a, komandnih interpretera, sed-a i awk-a, povezujući ih prema novoj unutrašnjoj logici. Programer je u istom jeziku mogao da otvori datoteku, pročita je red po red, prepozna obrazac, sačuva rezultate u nizovima ili mapama, pokrene drugi proces, obradi grešku i oblikuje završni izlaz. Posao koji je ranije bio rasut između više alata dobio je zajedničku gramatiku.
Najsmelija Wallova odluka odnosila se na pitanje kome programski jezik treba da bude prilagođen. Dok su mnogi dizajneri eleganciju tražili u malom broju strogo uređenih pravila, Perl je prihvatio raznovrsnost ljudskog izražavanja kao vrednost. Ljudi istu misao mogu da iskažu sažeto ili opširno, neposredno ili posredno, oslanjajući se na kontekst ili izgovarajući svaku pojedinost. Wall je želeo jezik koji će razumeti takve razlike i programeru pružiti više puteva do ispravnog rešenja. Iz tog poverenja izraslo je čuveno načelo zajednice: „Postoji više od jednog načina da se to uradi”, poznato po skraćenici TMTOWTDI.
Takva sloboda bila je pažljivo promišljena posledica Wallovog lingvističkog obrazovanja. Program je za njega predstavljao tekst koji istovremeno čitaju računar i čovek, pa značenje izraza nije zavisilo samo od pojedinačnih simbola nego i od njihovog položaja, okruženja i očekivanog rezultata. Oznake promenljivih nagoveštavale su vrstu podatka, operatori su prizivali poznate Unix konvencije, a pojedine operacije prilagođavale su svoje ponašanje kontekstu u kojem se koriste. Perl je pokušavao da prepozna nameru autora i oslobodi ga obaveze da svaku zamisao rastavi na zamoran niz mehaničkih koraka.
Posebno mesto u toj gramatici zauzeli su regularni izrazi, formalni opisi obrazaca u tekstu. Oni su postojali mnogo pre Perla, ali ih je Wall uveo u samo središte jezika, gde su mogli prirodno da postanu deo uslova, zamene, izdvajanja podataka ili petlje. Program je sa malo koda mogao da prepozna datum, adresu, broj, zaglavlje poruke, deo sistemskog dnevnika ili nepravilno oblikovan zapis, a zatim da pronađene podatke odmah preuredi i prosledi daljoj obradi. Time je Perl programerima pružio gotovo čitalačku moć: računar više nije samo prolazio kroz niz znakova, već je u njima prepoznavao strukture koje je čovek smatrao značajnim.
Ugrađeni skalari, nizovi i asocijativne mape omogućili su da se pronađeni podaci organizuju prema prirodi samog problema. Mapa, u Perlu poznata kao hash, mogla je da poveže korisničko ime sa nalogom, naziv računara sa njegovim stanjem, reč sa brojem pojavljivanja ili oznaku proizvoda sa čitavim skupom podataka. Za mnoge privremene i istraživačke zadatke programeru više nisu bili potrebni posebna baza ili ručno oblikovana struktura u C-u. Perl je stvarao neposredan put od neuređenog teksta do smisleno povezanih informacija.
Jezik je brzo prerastao prvobitni projekat zahvaljujući Wallovoj odluci da njegov izvorni kod učini dostupnim drugima. Korisnici su ga prenosili na različite sisteme, prijavljivali greške, slali zakrpe i predlagali sposobnosti koje su im bile potrebne u stvarnom radu. Wall je dugo zadržavao presudnu ulogu u oblikovanju jezika, ali je razvoj Perla od početka predstavljao razgovor između tvorca i zajednice. Taj razgovor bio je važan koliko i sama sintaksa, jer je pokazivao da stabilnost otvorenog sistema može da se gradi prihvatanjem tuđeg iskustva, uz pažljivo očuvanje programa koje ljudi već koriste.
Velika prekretnica stigla je sa Perlom 5, objavljenim 1994. godine posle obimnog preoblikovanja jezika i interpretatora. Reference, leksički opseg promenljivih, moduli, podrška za objektno programiranje i povezivanje sa bibliotekama napisanim u C-u omogućili su da se kod organizuje u pouzdane celine koje se mogu ponovo koristiti. Perl je time izrastao iz praktičnog jezika za administrativne skripte u platformu sposobnu da podrži mrežne programe, rad sa bazama podataka, automatizovano testiranje, naučne alate i složene aplikacije.
Modularnost je promenila razmeru saradnje. Kada jedan programer napiše pouzdano rešenje za određeni format datoteke, mrežni protokol, bazu podataka ili matematički postupak, hiljade drugih ljudi mogu da ga upotrebe, provere i unaprede. Iz takve kulture nastao je 1995. godine Comprehensive Perl Archive Network, poznat kao CPAN, čije je pokretanje predvodio Jarkko Hietaniemi uz pomoć brojnih saradnika. CPAN je objedinio izvorni kod, dokumentaciju, testove, podatke o verzijama i zavisnostima, a alati za automatsko preuzimanje i instaliranje modula pretvorili su ga u jedan od najuticajnijih uzora za kasnija spremišta programskih paketa.
Značaj CPAN-a prevazilazio je veličinu arhive. Otvorenost koda dobila je infrastrukturu koja je ljudima omogućavala da taj kod pronađu, razumeju, provere, instaliraju i uključe u sopstveni rad. Perl zajednica rano je negovala praksu da uz programski modul putuju dokumentacija i testovi, čime su znanje o upotrebi i dokaz o ispravnosti postajali deo samog softvera. Wallova duhovita pohvala „lenjosti” dobila je zajednički oblik: kada je jedan čovek već pažljivo rešio neki problem, sledeći programer mogao je da gradi dalje umesto da ponavlja isti posao.
Širenje interneta dalo je Perlu novu istorijsku ulogu. Rane veb-stranice bile su uglavnom nepokretni dokumenti, dok je potreba da server primi podatke iz obrasca, pretraži katalog, upiše poruku ili u trenutku sastavi stranicu otvorila prostor za Common Gateway Interface, CGI. Perl je već vladao tekstom, datotekama, procesima, promenljivama okruženja i mrežnim podacima, pa je postao prirodan izbor za takve programe. Formulari, knjige gostiju, brojači poseta, diskusioni sistemi, pretraživači, administrativni paneli i rane elektronske prodavnice često su nastajali upravo u njemu.
Njegova dostupnost pomogla je demokratizaciji ranog weba. Perl se nalazio na mnogim Unix serverima, mogao je slobodno da se preuzme i nije zahtevao skupo razvojno okruženje. Student, istraživač, sistemski administrator, mala organizacija ili tek osnovana internet kompanija mogli su pomoću običnog serverskog naloga da pretvore statičnu stranicu u interaktivnu uslugu. Programiranje weba tako je dospelo u ruke ljudi koji nisu raspolagali velikom infrastrukturom, ali su imali problem, radoznalost i spremnost da uče.
Iz Perl ekosistema nastali su pouzdani alati za baze podataka, mrežne protokole, elektronsku poštu, kompresiju, kriptografiju, obradu slika, naučne podatke i sistemsku administraciju. Zbog sposobnosti da čita izlaz jednog sistema, preoblikuje ga i preda drugom, Perl je dobio nadimak „lepljiva traka interneta”. Ta slika je precizno opisivala njegovu vrednost u digitalnom svetu sastavljenom od starih programa, novih baza, tekstualnih konfiguracija i tehnologija nastalih u različitim epohama. Umesto zamene čitave infrastrukture, Perl je između njenih delova gradio pokretljive i delotvorne mostove.
Otvorena zajednica razvila je i značajnu kulturu provere softvera. CPAN distribucije, testovi koji su putovali zajedno sa modulima i kasnija mreža automatskih testera omogućavali su proveru istog paketa na različitim operativnim sistemima i verzijama interpretatora. Izveštaji sa udaljenih računara otkrivali su probleme koje autor na sopstvenoj mašini nije mogao da vidi. Tako je Perlova zajednica stvarala distribuiranu laboratoriju kompatibilnosti mnogo pre nego što su servisi za neprekidnu integraciju postali uobičajen deo profesionalnog razvoja.
Izražajna sloboda Perla nosila je i ozbiljnu odgovornost. Pažljiv autor mogao je da napiše jasan, razgovetan i elegantan program, dok su sažeti izrazi, implicitne promenljive i oslanjanje na kontekst omogućavali i veoma zamršen kod. Zajednica je na taj izazov odgovorila pravilima stila, upozorenjima, režimom strict, opsežnom dokumentacijom i testovima. Sloboda je tako dobijala oslonac u disciplini, jer je moć jezika mogla da traje jedino ako napisani program ostane razumljiv i ljudima koji će ga kasnije održavati.
Rani CGI programi otvorili su i važna pitanja bezbednosti. Podatak koji stiže preko mreže može postati opasan ako bez provere dospe u naziv datoteke, argument sistemske naredbe ili upit bazi. Perl je razvio režim praćenja nepoverljivih, „zagađenih” podataka, upozoravajući programera kada spoljašnji unos ulazi u osetljivu operaciju. Takav mehanizam nije mogao da zameni znanje i oprez, ali je izražavao načelo koje danas pripada osnovama bezbednog programiranja: poreklo podatka mora se razumeti jednako pažljivo kao i njegova vrednost.
Sa rastom veb-aplikacija, jednostavni CGI model postajao je nedovoljan, dok su Python, PHP, Ruby, Java i kasnije JavaScript na serverskoj strani privlačili nove generacije programera. Istovremeno je dug razvoj Perla 6 stvarao neizvesnost o budućnosti Perla 5. Projekti su vremenom jasno razdvojeni: novi jezik je 2019. godine dobio ime Raku, a Perl je nastavio sopstveni razvoj. To razgraničenje omogućilo je obema zajednicama da sačuvaju svoj identitet i pokazalo da poštovanje zajedničkog porekla može da prati izbor različitih puteva.
Perl je danas manje vidljiv nego tokom prvih decenija weba, ali njegova prisutnost traje u sistemskim distribucijama, administrativnim alatima, mrežnoj infrastrukturi, naučnim i bioinformatičkim obradama, finansijskim sistemima, izdavačkim procesima i velikim zbirkama poslovnog koda. Mnogi programi nastavljaju da pouzdano rade zahvaljujući dugoj brizi zajednice o kompatibilnosti. Digitalna civilizacija počiva i na takvim tihim slojevima: na softveru koji se retko pojavljuje u naslovima, a svakodnevno obavlja posao za koji je izgrađen.
Perlovo nasleđe prisutno je i daleko izvan njegovog izvornog koda. Regularni izrazi kao svakodnevni deo programiranja, bogate strukture za obradu teksta, kratki programi iz komandne linije, javna spremišta paketa, automatsko rešavanje zavisnosti, dokumentacija uz izvorni kod i distribuirano testiranje postali su očekivani delovi savremenih razvojnih ekosistema. Kasniji jezici nisu jednostavno preslikali Perl, ali su nastajali u svetu koji je već naučio koliko zajednički alat postaje moćan kada njegovi korisnici mogu da dele znanje, kod i odgovornost.
Najdublja Wallova zamisao odnosila se na vezu između jezika i čoveka koji ga koristi. Računar zahteva preciznost, dok ljudska misao bira između sinonima, skraćuje poznato, menja naglasak i prilagođava iskaz okolnostima. Perl je pokušao da pomiri te dve prirode, pa su i njegove vrline i njegove slabosti izrasle iz poverenja da programeru treba pružiti izražajnu slobodu. Larry Wall je iz konkretnog problema izgradio jezik, iz jezika je nastala zajednica, a iz zajednice ekosistem koji je pokazao koliko znanje postaje plodnije kada se može slobodno preuzeti, proveriti, dopuniti i predati drugome.