C++ (1985)
Jezik koji je pola industrije zavolilo, a druga polovica prokletstvom nazvala — često oba mišljenja ima ista osoba.
Bell Labs, po treći put u ovoj priči. Netko bi rekao da je to previše slučajnosti, ali nije — kad si mjesto koje je izumilo tranzistor i jezik C, onda se tu jednostavno zadrže i sljedeći problemi, jer nema puno mjesta na svijetu gdje bi ih tko drugi mogao riješiti. Rane 1980-e. Kave se pije previše, kabineti su sivi, a projekti — projekti su prerasli ljude koji ih pišu.
To je novost o kojoj vrijedi zastati. Do sad je programiranje bilo pitanje jednog čovjeka i jedne mašine, poneki put desetak ljudi koji se međusobno poznaju po imenu. Sad su to stotine tisuća redaka koda, desetci inženjera koji se nikad nisu sreli, i sustav koji mora živjeti godinama, mijenjati vlasnike, nadživjeti autore. C je za sve to prekratka deka — brz je, gol do kosti, radi točno što mu kažeš, ali ne pamti ništa umjesto tebe. Napišeš strukturu podataka (jednostavno rečeno, način kako organizirati hrpu vrijednosti koje idu zajedno, tipa ime, prezime i godine jedne osobe u jednoj cjelini) i onda je moraš mentalno nositi kroz svaki sljedeći redak koda koji ju dotiče, jer C ne zna, i ne želi znati, tko smije što s njom raditi.
U tom istom Bell Labsu sjedio je Danac po imenu Bjarne Stroustrup, i imao je viziju koja danas zvuči skoro naivno kad je izgovoriš: uzeti disciplinu i organizaciju jednog akademskog jezika po imenu Simula — jezika koji je znao za pojam objekta prije nego što je to bilo pomodno — i zalemiti ga na brzinu i prizemnost C-a. Ne novi jezik. Ne revolucija. Nastavak. C, samo s malo više reda u glavi.
Ono što je Stroustrup zapravo napravio jest da je otvorio vrata i pustio unutra sva pitanja koja su se dotad rješavala šutke, po dogovoru, na papirčiću zalijepljenom na monitor. Što je zapravo objekt? Zašto ga zovemo klasom kad je to, u biti, isto što i struktura — samo pametnija? Je li ovo uopće nadogradnja C-a, ili je to sad drugi jezik koji se samo pretvara da je stari? Pitanja koja zvuče kao da ih postavlja netko tek na početku učenja, a ispada da su to pitanja na koja ni ljudi koji C++ pišu desetljećima nemaju jednoglasan odgovor.
Zato ćemo ovo poglavlje odraditi drukčije — kroz pitanja, jednostavna i pomalo bezobrazna, onako kako bi ih postavio čovjek koji ne zna ništa, a upravo zato pogađa u srž. Jer C++ je jezik koji je pola industrije zavoljelo do fanatizma, a druga pola prokleo do temelja — i, što je najzanimljivije, to je često bila ista polovica, samo u ponedjeljak naspram petka.
Dobro, kaže čitatelj, C je radio. Radio je Unix, radio je pola svijeta. Pa zašto je nekome 1979. trebalo sjesti i početi mu lijepiti nešto što se zove »objekt«? Nije li to malo kao da nekome dobrom autu dodaš — dušu?
Ne baš. Zamisli da pišeš program sam, u svojoj sobi. Ti znaš gdje ti je svaka varijabla, znaš da funkcija `izracunaj_platu()` čita globalnu varijablu `stopa_poreza` i da je nitko drugi ne dira, jer nitko drugi ne postoji — samo ti i tvoja kava. C je za taj svijet savršen: brz, direktan, bez cirkusa. Problem je što taj svijet nestaje negdje krajem sedamdesetih, kad softver prestaje biti tvoja soba i postaje zgrada s tri kata i sto ljudi koji ulaze i izlaze.
E sad zamisli da u toj zgradi sto ljudi ima pristup istoj varijabli `stopa_poreza`. Neki je čita, neki je mijenja, netko je slučajno postavi na minus pedeset posto jer je kopirao kod iz drugog projekta i zaboravio provjeriti, a program to — pusti da radi. C ne pita ništa. C je pristojan konobar koji ti donese što tražiš, pa i kad naručiš nešto što će te ubiti. Nema ograde, nema pitanja »jesi li siguran«. I upravo ta odsutnost ograde, koja je u sobi vrlina, u zgradi sa sto ljudi postaje katastrofa koja se dogodi u petak popodne, tri sata prije deadlinea.
Stroustrup je, s doktoratom iz Cambridgea u džepu, gledao upravo taj problem. Ne teoretski — stvarno, na stvarnim projektima gdje je C bio brz kao raketa i nezaštićen kao golo dijete na aerodromu. I sjetio se nečega što je vidio na doktoratu: jezika zvanog Simula, u kojem su podaci i funkcije koje ih koriste bili zajedno, u istoj kutiji, s vratima na koja se kuca.
To je, u suštini, klasa. Evo najjednostavnije moguće definicije, bez formula: klasa je struct koji zna što smiješ, a što ne smiješ s njim raditi. Struct u C-u je samo kutija s pretincima — staviš unutra ime, plaću, godine, i svatko tko dođe do kutije može posegnuti rukom i promijeniti bilo koji pretinac, bilo kad, bez pitanja. Klasa je ista kutija, ali s bravom na određenim pretincima i uputom zalijepljenom na poklopcu: ovo možeš čitati, ovo možeš mijenjati samo kroz ova dva vrata, a u ovaj pretinac — ne dodiruj, nije tvoj posao.
Zove se to enkapsulacija — riječ koja zvuči kao lijek za probavu, a znači nešto što svako dijete instinktivno razumije. Kad staviš novac u banku, ne ideš u trezor sam brojiti novčanice — ideš na šalter, kažeš koliko želiš podignuti, i banka (koja ima svoja pravila, provjere, limite) odradi posao iza zavjese. Ti ne moraš znati kako to radi, a što je još važnije — ne smiješ moći zaobići cijeli proces i sam si upisati saldo od milijun eura, koliko god ti to bilo zgodno u petak popodne.
Upravo je to nedostajalo C-u kad je zgrada narasla na sto katova. Ne brzina, ne moć — toga je C imao u izobilju. Nedostajala je brava na trezoru, ona ista brava o kojoj je bila riječ malo prije. Stroustrup nije htio ubiti C; htio je da isti jezik, ista brzina, isti strojni kod ispod haube, dobije bravu koju možeš staviti gdje god poželiš, a ne mora je svatko koristiti. I tu, dragi laiče, počinje priča koja će za nekoliko godina podijeliti programersku Zemlju na dva plemena — a oba će, iz različitih razloga, imati pravo.

"Zašto baš nadogradnja C-a, a ne novi jezik?"
Dobro, kaže laik, ako je C toliko dobar da vlada svijetom, i toliko loš da ljudi na velikim projektima poludiju — zašto Stroustrup nije jednostavno napisao potpuno nov jezik? Bez balasta, bez starih grešaka, čist list papira, pravi objekti od prve linije, sve ono što je Simula radila lijepo, samo brže. Logično pitanje. Odgovor je, međutim, razočaravajuće prizemljen: jer bi ga onda nitko koristio.
Evo problema koji svaki tvorac jezika mora riješiti prije nego napiše i jednu liniju kompajlera — programa koji tvoj napisani kod pretvara u strojni jezik, onaj niz nula i jedinica koji procesor stvarno razumije i izvršava — a taj problem nema nikakve veze s elegancijom sintakse. Zove se trošak prelaska. Imaš firmu s milijun redaka C koda, imaš programere koji dvanaest godina razmišljaju u zagradama i pokazivačima, imaš alate, debugere, biblioteke, cijeli ekosustav izgrađen oko jednog jezika. Netko dođe i kaže: bacite sve to, učite novi jezik, prepišite sve iznova, i vjerujte mi na riječ da je bolje. Tko će to prihvatiti? Nitko normalan. Akademska zajednica će pljeskati, konferencije će biti pune, i jezik će umrijeti tiho u nekom sveučilišnom repozitoriju dok ga zadnji doktorand ne izbriše.
Stroustrup je to skužio prije nego što je napisao i jedan red jezika 'C with Classes', kako se prvobitno zvao. Njegova genijalnost — i, budimo pošteni, njegov najveći kompromis u istom potezu — bila je odluka da nov jezik mora biti C. Ne sličan C-u. Ne inspiriran C-om. Mora se moći uzeti postojeći .c fajl, promijeniti ekstenziju u .cpp, i to mora raditi. Nula troška prelaska. Isti kompajlerski lanac, iste biblioteke, ista brzina, isti programer koji ujutro dođe na posao i ne mora ništa novo učiti da bi napisao staru rutinu — a onda, kad je spreman, polako počne dodavati klase, tu i tamo, bez da mora prekinuti sve što radi.
Dobro, kaže laik, to zvuči pametno. Gdje je kvaka?
Kvaka je da kompatibilnost nije besplatan ručak, samo je račun stigao kasnije, na drugu adresu. Kad naslijediš cijeli jezik, ne naslijediš samo njegove dobre strane. Naslijediš i pokazivače — varijable koje ne čuvaju samu vrijednost nego adresu u memoriji gdje se ta vrijednost nalazi, pa ako ta adresa postane nevaljana, program to ne primijeti, samo nastavi raditi s nečim što više nema smisla — i makronaredbe koje se ponašaju nepredvidivo, i tipkarske greške tipa = umjesto == koje kompajler nikad ne uhvati, i cijeli katalog grešaka koje su programeri C-a proklinjali još 1978. Sve to je automatski uvezeno u C++, jer inače kompatibilnost ne funkcionira — a onda si na to dodao nove slobode: klase, nasljeđivanje, preopterećenje operatora, i svaku od njih programer smije zloupotrijebiti na nov, kreativan način koji stari C nije ni omogućavao.
Drugim riječima: nisi naslijedio samo alat, nego i sve načine na koje se taj alat može zabiti u vlastitu nogu — a onda si na taj popis dodao još desetak novih, sofisticiranijih načina. C je bio motorna pila bez štitnika. C++ je ista motorna pila, samo sad s uključivim turbo-modom i bez uputstva za uporabu.
Zato ćeš čuti ljude kako kažu da je C++ najuspješniji kompromis u povijesti softvera i najveća pogreška u povijesti softvera — u istoj rečenici, o istom čovjeku, o istoj odluci. Oboje su u pravu. Stroustrup nije birao između čistog jezika i prljavog jezika. Birao je između jezika koji ga nitko ne bi koristio i jezika koji bi svi koristili, ali koji bi ga proklinjali svako jutro. Odabrao je drugo. Industrija mu je, htjela-ne htjela, zahvalna do danas — i psuje ga isto tako, do danas.

"Zašto ga svi zovu kompliciranim?"
— OK, ali zašto svi kad se spomene C++ prvo napravu grimasu? I baš developeri koji ga stvarno znaju, oni najviše grimase prave.
Dobro pitanje, i odgovor je pošten: C++ je jezik koji ti daje svaki alat koji postoji, uključujući i one koje bi normalan jezik zaključao u ormar i bacio ključ. Sjećaš se enkapsulacije iz prve sekcije — klase koja skriva svoje unutrašnje stanje da ga netko ne bi slučajno pipao? C++ ti daje tu istu klasu, ali ti uz nju gurne u ruke i čekić, i dinamit — ako baš hoćeš, možeš sve to razvaliti. Pitanje je samo koliko si pametan da to ne učiniš.
Uzmi, na primjer, višestruko nasljeđivanje. Kod jednostavnog nasljeđivanja imaš dijete koje naslijedi osobine od jednog roditelja — Pas naslijedi od Životinje, jasno, logično, obiteljsko stablo kakvo bi i baka razumjela. C++ je rekao: a što ako dijete ima dva roditelja? Tri? Šest? Klasa Amfibijsko-Vozilo-Koje-Također-Leti naslijedi istovremeno od Vozila, od Plovila i od Zrakoplova. Zvuči korisno, dok se ne dogodi da i Vozilo i Plovilo imaju metodu koja se zove isto — recimo pokreni() — i onda kompajler stoji tamo, gleda te i pita: pa koju od te dvije misliš, genije? To se zove »problem dijamanta«, ima svoj dijagram u obliku dijamanta i sve, i cijele su knjige napisane o tome kako ga zaobići.
— A templatei? To ime zvuči nevino, kao Wordovi predlošci.
Ha, nevino zvuči, dok ga ne vidiš u divljini. Template je u osnovi kalup za kod — napišeš funkciju koja zbraja dva broja, i umjesto da pišeš jednu verziju za int, jednu za float, jednu za svoj vlastiti tip Novac, kažeš kompajleru: napravi mi ovo za bilo koji tip koji stane unutra, ti to riješi. Genijalno u teoriji. U praksi, kad nešto puče, kompajler ti ispiše grešku koja ima, ne šalim se, dvije stranice teksta, s nazivima tipova umetnutim jedan u drugi kao ruska babuška, dok tražiš onu jednu riječ koja ti govori gdje je stvarni problem. Generacije programera su plakale nad tim porukama.
— A ono preopterećenje operatora, to zvuči kao nešto iz elektrotehnike, kao da će ti utikač eksplodirati u ruci.
Zvuči zastrašujuće, ali je zapravo simpatično na prvi pogled — i zlo na drugi. Preopterećenje operatora znači da znak + ne mora značiti samo zbrajanje brojeva; možeš definirati da + na tvojim vlastitim objektima radi što god hoćeš. Sabiranje dva vektora, spajanje dva teksta, čak i — vidio sam to — pokretanje raketa. Doslovno, netko je jednom napisao kod gdje je operator plus ispaljivao projektil, jer zašto ne. Ideja je lijepa: kod čitaš prirodno, vektor_a + vektor_b, umjesto zbroji(vektor_a, vektor_b). Problem je što, dok čitaš tuđi kod, nemaš pojma radi li taj plus ono što misliš da radi, ili nešto sasvim drugo. Moć bez kočnice. Baš kao i sve ostalo u ovom jeziku.
— Onda zašto ga uopće netko koristi ako je toliko opasan?
Zato što ta ista opasna moć, kad je u rukama nekoga tko zna što radi, proizvede stvari koje ništa drugo ne može proizvesti tako brzo. Otvori bilo koju veliku videoigru — Unreal Engine, cijela ta industrija koja u stvarnom vremenu renderira eksplozije, pisana je u C++u. Otvori Chrome ili Firefox — jezgra tih preglednika, C++. Photoshop, baze podataka koje pokreću banke, tvoj operativni sustav dobrim dijelom, letjelice koje šalju rovere na Mars. Sve to stoji na jeziku koji ti dopušta da si otpuhneš nogu, jer isti taj jezik ti dopušta da istisneš do zadnjeg takta procesora ono što ti treba, bez čekanja da to netko drugi obavi za tebe iza scene. Tu se ne pregovara — brzina i kontrola, protiv toga da idiotu u timu daš pilu bez zaštite. Industrija je odabrala pilu.

"Je li OOP uopće bio dobra ideja?"
Dobro pitanje, i zapravo pitanje koje bi trebalo pisati na zidu svake informatičke učionice velikim slovima. Kratki odgovor: OOP — kratica za „objektno orijentirano programiranje”, onaj pristup pisanju koda kroz objekte i klase o kojem smo pričali malo prije — bio je dobra ideja. Loša ideja je bilo ono što su ljudi 1990-ih napravili s tom idejom, a to je čitava druga priča, i ta priča je smješnija.
Zamisli desetljeće u kojem je „objekt” postao ono što je danas „AI” u nazivu proizvoda — riječ koju stavljaš svugdje, ne zato što tamo pripada, nego zato što bez nje zvučiš staromodno. Sredina devedesetih: konzultanti u odijelima s ukrasnim naramenicama prodaju seminare o „objektno orijentiranom razmišljanju”. Firme masovno prepisuju stare C programe u C++ ne zato što im treba nasljeđivanje ili polimorfizam (da ista naredba radi različite stvari ovisno o tome kojem objektu je uputiš), nego zato što je na naslovnici časopisa pisalo da je to budućnost. Rezultat? Klase koje omotavaju jednu varijablu u tri sloja apstrakcije. Sučelja za sučelja koja imaju tvornice koje prave druge tvornice.
I tu dolazimo do fore koju volim jer je toliko poštena da boli: čovjek koji je izmislio riječ »objektno orijentirano«, Alan Kay, taj isti Alan Kay iz Smalltalka [K2, poglavlje 4], gledao je kasnije tu manuru od enterprise Jave i C++-a i rekao, otprilike, da to nije ono što je on zamislio. Njemu su objekti bili o porukama koje se šalju između malih, autonomnih, gotovo živih jedinica — bliže biologiji nego arhitekturi. Ono što je ispalo je birokratija u kodu: hijerarhije klasa deset razina duboke, dizajnerski obrasci nalijepljeni na probleme koji ih nisu tražili, i inženjeri koji su UML dijagram — onu shemu kockica i strelica kojom se prije pisanja koda crta kako će sve te klase biti povezane — smatrali umjetničkim djelom vrijednim uokvirivanja.
Znači, izumitelj koncepta gleda vlastito dijete i kaže — ovo nisam ja odgojio ovako. To se ne događa svaki dan. Obično izumitelji umru uvjereni da su sve pogodili.
Pa što onda misliti o OOP-u danas, s ove distance? Isto što misliš o čekiću. Čekić nije loš izum. Čekić je odličan izum, ako ti treba zabiti čavao. Problem nastaje kad ti netko na treningu kaže da je čekić rješenje za sve, i ti počneš čekićem rezati kruh, otvarati konzerve i podešavati satove. Enkapsulacija, nasljeđivanje, polimorfizam — to su alati koji negdje idealno pašu (grafička sučelja, simulacije, igre s puno tipova objekata koji se ponašaju slično ali ne isto) i negdje potpuno ne pašu (jednostavan skript koji parsira jednu datoteku ne treba tri klase i interface).
Presuda, ako baš tražiš presudu: OOP nije religija koju treba prakticirati do zadnjeg atoma koda, niti hereza koju treba protjerati iz civiliziranog programiranja. To je alat u kutiji, jedan od desetak. Devedesete su ga uzele i pretvorile u sveti tekst, a onda su dvijetisućete potrošile popravljajući štetu — mikroservisi, funkcionalno programiranje, sve te reakcije dobrim dijelom postoje jer je netko negdje jednom prenapisao klasu s imenom dugim kao rečenica (tipa »AbstractSingletonProxyFactoryBean«) i cijela industrija je rekla: dosta, molim vas, dosta.

"Što bih trebao misliti o C++-u danas?"
Dobro, kaže laik, sve sam ovo skužio — objekte, kompatibilnost, tu nogu koju si sam sebi mogao otpucati. Ali sad me zanima praktično: sjedam za novi projekt 2026., trebam li C++? Ili je to kao da pitaš trebaš li faks za pisaću mašinu?
Ovisi gdje ti se ta pisaća mašina koristi. Ako pišeš web stranicu za frizerski salon, ne, zaboravi, C++ ti treba kao ribi bicikl. Ali ako pišeš igru koja mora iscrtati sto tisuća poligona (onih sitnih ravnih pločica od kojih se slaže 3D grafika) šezdeset puta u sekundi, ili operativni sustav, ili nešto što upravlja avionom dok on leti — onda je C++ i danas, četrdeset godina poslije, jedan od svega par jezika koji te ne gleda čudno kad kažeš »treba mi svaki nanosekundni takt procesora«. Photoshop, Chrome, PlayStation igre, dijelovi Windowsa — sve to duboko u utrobi govori C++.
Ali čuo sam da dolazi neki Rust, koji je sigurniji i ljepši, kaže laik sumnjičavo, kao da sam mu rekao da mu stari Fića ipak ima budućnost.
Dolazi. Kuca na vrata već desetak godina, i s pravom — Rust rješava baš onu manu koju smo spominjali, tu memoriju koju C++ pušta da curi kao slavina bez podloške. Veliki igrači (Microsoft, Google, sama Linux jezgra) polako uguravaju Rust tamo gdje mogu. Ali evo poante koju laici, iskreno, najbolje razumiju kad im je kažeš ovako: jezici ne pobjeđuju zato što su lijepi. Pobjeđuju zato što je jeftinije ostati nego otići.
I to je, zapravo, jedina stvar koju je Stroustrup shvatio prije svih ostalih dizajnera jezika — ne kako napisati najlogičniju sintaksu, nego kako napisati jezik koji nikoga ne tjera da baci ono što već ima. C je pobijedio jer je bio brz. C++ je pobijedio jer si mogao ostati u C-u i samo dodavati na njega. Rust će pobjeđivati polako, projekt po projekt, novi kod po novi kod, dok se stari C++ sustavi ne pogase sami od starosti — što će, budimo realni, potrajati duže nego što ćemo ti i ja biti ovdje da to gledamo.
Pa, presuda za laika: ne moraš voljeti C++. Ne moraš ga ni razumjeti do kraja. Ali svaki put kad ti se igra ne zamrzne, ili avion sleti, negdje duboko ispod, čudovište koje je Stroustrup strpljivo krotio četrdeset godina odradilo je svoj posao. Nezahvalno, nevidljivo, i — dovraga — još uvijek živo.