
Da li je funkcionalno programiranje paradigma budućnosti? Razgovarali smo sa profesorom Matematičkog fakulteta
Dr Ivan Čukić, stručnjak iz oblasti funkcionalnog programiranja i docent na Matematičkom fakultetu, govorio je za Netokraciju o prednostima funkcionalne paradigme i njenoj implementaciji u objektno-orijentisane programske jezike.
Funkcionalno programiranje je paradigma koja postoji već šest decenija, ali do sada nije prevazišlo široko rasprostranjenu upotrebu objektno-orijentisanog programiranja.
Međutim, funkcionalno programiranje poslednjih godina postaje sve popularnije jer, zahvaljujući “čistim” funkcijama koje koristi, pokazuje impresivne rezultate u oblastima mašinskog učenja i analize podataka.
U skladu sa time, mnogi programski jezici (na primer, C++, Pyhton i Java) koji su ukorenjeni u objektno-orijentisanom programiranju implementirali su u sebe funkcionalne karakteristike.
Znači li ovo da se približavamo kraju objektno-orijentisanog programiranja i koje su sve prednosti funkcionalne paradigme, razgovarali smo sa dr Ivanom Čukićem, docentom na Matematičkom fakultetu Univerziteta u Beogradu čija doktorska disertacija nosi naziv “Funkcionalno i imperativno reaktivno programiranje zasnovano na generalizaciji monade nastavka u programskom jeziku C++”.
Za početak, ujedno ste i programer i predavač. U kojoj meri se ove dve instance podudaraju i kako utiču jedna na drugu?
Ivan: Kada su u pitanju računarske teme, ove dve instance odlično idu zajedno. Mislim da je aktuelno iskustvo u privredi čak i neophodno za kvalitetnu nastavu i većinu kurseva u oblasti računarstva. Što se same nauke tiče, stvari dosta zavise od oblasti nauke kojima se ljudi bave. “Normalno programiranje” tu i nije toliko popularno kao neke druge oblasti poput mašinskog učenja, veštačke inteligencije ili numeričkih optimizacija.
U kojoj kompaniji ste zaposleni kao programer, čime se ona bavi i koja je vaša pozicija?
Ivan: Generalno radim kao “slobodnjak” (freelancer) – treninzi, radionice, savetovanje i razvoj softvera. Trenutno najviše sarađujem sa kompanijom KDAB koja većinom razvija softver za medicinske uređaje drugih kompanija, mada ima i drugih tipova projekata. Trenutno, moja primarna okupacija je vođenje projekta na kome razvijamo infrastrukturu za FAIR (Facility for Antiproton and Ion Research).
Kao docent na Matematičkom fakultetu, kako vidite trenutno stanje u obrazovnom sistemu? Da li je usklađen sa svetskim standardima?
Ivan: Ovo je dosta problematično pitanje, i pravi odgovor teško može da stane u nekoliko rečenica. Mislim da je kod nas visoko školstvo mnogo kvalitetnije nego što bi se očekivalo kad se uzme u obzir koliko se u njega ulaže.
Ono što mogu da kažem iz svoje perspektive je da se na Katedri za računarstvo i informatiku Matematičkog fakulteta trudimo da budemo aktuelni i da unapređujemo kvalitet studija iz godine u godinu. Da su ova unapređenja vidljiva dobijam potvrde sa vremena na vreme iz različitih IT kompanija u koje naši diplomci odu na intervjue za zaposlenje.
Za “svetske standarde” ne znam šta da kažem, a da ostanem politički korektan. Naravno da postoje stvari koje možemo da unapredimo, ali mislim da ne moramo nužno da kopiramo druge da bismo bili dobri.
Stručnjak ste iz oblasti funkcionalnog programiranja. Po čemu se ova paradigma razlikuje od proceduralnog i objektno-orijentisanog programiranja?
Ivan: Prvo bih napomenuo da programske paradigme nisu međusobno isključive. Ovo je nešto što ljudi često misle – ako koristim objektnu paradigmu, nemam šta da tražim u funkcionalnoj. I obrnuto.
Na ovo možemo da gledamo kao na muzičke žanrove – postoje bendovi koji su se učaurili u jednom žanru i iz godine u godinu izbacuju skoro iste pesme (koliko god da volim AC/DC…). Ali najbolji bendovi su uvek bili neka mešavina različitih muzičkih pravaca.
Kao što su muzički žanrovi mešani u zavisnosti od toga koji smisao kompozicija treba da ima, tako se i programske paradigme mogu mešati u zavisnosti od toga kakav problem rešavamo.
Ovo je i glavni razlog zbog kog mislim da nikad nećemo videti neki tradicionalni funkcionalni programski jezik na vrhu indeksa najpopularnijih programskih jezika Tiobe. Umesto da funkcionalni programski jezici postanu primarni, ostali jezici će dobiti sve korisne funkcionalne osobine.
Ljudi već sad često koriste funkcionalne koncepte, a da nisu toga ni svesni.
Ono što je mene privuklo funkcionalnom programiranju nisu ni “čiste” funkcije (funkcije koje nemaju nuspojave – koje ne menjaju nikakvo stanje programa, nego samo računaju rezultat na osnovu vrednosti koje su im prosleđene kroz argumente), ni imutabilne strukture podataka, nego sama moć apstrakcije koju ono pruža.
Sećam se kad je davno Java dobila petlju foreach, da je to reklamirano kao neverovatno unapređenje. Naravno, foreach jeste veoma korisna stvar, ali u funkcionalnim programskim jezicima ovo nije nešto što je moralo da se doda u sam kompajler.
Čak i u programskom jeziku LISP, koji je najstariji funkcionalni programski jezik, bilo je moguće implementirati funkcionalnost poput petlje foreach u jednoj liniji bibliotečkog koda bez izmene samog jezika.
Dakle, umesto da programer mora da sačeka kompaniju ili organizaciju koja upravlja nekim programskim jezikom (za Javu je u to vreme ta kompanija bila Sun Microsystems) da odluči da je neka novina korisna, pa da je implementira i doda u taj programski jezik, najzad da se nova verzija jezika raširi dovoljno po svetu da bi ljudi mogli bez brige da koriste tu novinu, u funkcionalnom svetu je dodavanje ovako nečeg bilo pitanje minuta.
Da li funkcionalna paradigma u budućnosti preti da potisne onu objektno-orijentisanu?
Ivan: Svet programskih paradigmi nije toliko turbulentan koliko bi čovek pomislio kad vidi koliko se novih programskih jezika stvori svake godine.
Svi kukaju na objektno-orijentisanu paradigmu jer je veoma zastupljena. Da parafraziram Bjarna Strostrupa, postoje paradigme na koje se ljudi stalno žale i paradigme koje niko ne koristi (originalna izjava je bila za programske jezike, ne za paradigme).
Funkcionalna paradigma ima veliku stigmu da je previše akademska. Tom utisku umnogome doprinosi i činjenica da zajednica funkcionalnih programera obožava da jednostavnim konceptima daje kreativna imena poput “monada”, “aplikativ” i “prizma”.
Rekao bih da će funkcionalno programiranje postati veliki deo budućnosti, ali neprimetno. Funkcionalni koncepti će biti deo svakodnevice i programeri neće ni razmišljati o tome iz koje paradigme je nešto što koriste.
Koji alati su po vašem mišljenju must have kada je u pitanju funkcionalno programiranje?
Ivan: Ne znam da li je neki baš alat bitan, ali bih mogao da izdvojim jedan funkcionalni jezik koji jeste – Haskell.
Mislim da je korisno naučiti ga i implementirati u njega nekoliko programa srednje veličine (običnih konzolnih, ali i programa sa grafičkim okruženjem) jer je jezik dosta striktan i zahteva drugačiji pogled na svet da bi se koristio.
Taj drugačiji pogled ume kasnije da bude veoma koristan pri razvoju softvera u “uobičajenim” programskim jezicima.
Možete li nam ukratko objasniti kako korišćenje ‘čistih’ funkcija unapređuje C++ programe?
Ivan: Kao što sam maločas napomenuo, “čiste” funkcije nisu ono što bih izdvojio kao najbitniju karakteristiku funkcionalnih programskih jezika.
Funkcije višeg reda – funkcije koje kao argumente mogu da primaju druge funkcije, ili da vrate novu funkciju kao svoj rezultat – su ono što prema mom mišljenju daje moć funkcionalnim programskim jezicima jer su one te koje bezgranično povećavaju izražajnost programskog jezika.
“Čistoća” funkcija, sa druge strane, sužava izražajnost. U jezicima koji zahtevaju čistoću (poput Haskell-a) mnogi ispravni konstrukti koje bismo pisali u drugim jezicima postaju nevalidni. Ovo, naravno, ima svoje prednosti (čistoća je veoma korisna u višenitnim sistemima) ali nije zabavno.
Zabavnije je igrati se Lego kockama, nego nekom unapred sklopljenom igračkom koja može da radi samo jednu stvar. Barem meni.
U skladu sa prethodnim pitanjem, koje to funkcionalne karakteristike C++ ima implementirane u sebi?
Ivan: Sve.
Šalu na stranu, C++ od svoje prve standardizovane verzije iz 1998. godine ima funkcije višeg reda. Algoritmi koji su implementirani u standardnoj biblioteci poput std::sort, std::partition i std::count_if svi kao neki od argumenata primaju druge funkcije. Takođe, postoje i stvari u standardnoj biblioteci koje prave nove funkcije (std::bind, std::not_fn).
Jedan od poznatih kolega C++-aša, Džejson Tarner (Jason Turner), kad je čitao moju knjigu se našalio da ne zna šta je tu funkcionalno programiranje, da je ono što piše u knjizi samo “C++ best practices“.
Ono što je bila ogromna mana C++-a u kontekstu funkcionalnog programiranja je sintaksa upotrebe ovih funkcija višeg reda.
Ovo je rešeno lambdama u C++11, a dodatno poboljšano intervalima (range) u C++20 i C++23 koji olakšavaju komponovanje algoritama i transformacija nad kolekcijama podataka.
Kada su u pitanju čiste funkcije, C++ ne proverava da li smo nešto implementirali kao čisto ili ne, ali postoje neke stvari poput ključne reči const koje olakšavaju pisanje čistog koda. Takođe, kad smo već kod čistoće, C++ nema ugrađene imutabilne strukture podataka, ali postoje eksterne biblioteke koje ih veoma efikasno implementiraju.
Od ostalih osobina koje ljudi često povezuju sa funkcionalnom paradigmom (prvenstveno jer su to osobine koje Haskell ima), kroz eksterne biblioteke je moguće koristiti i poklapanje oblika (pattern matching), lenjo izračunavanje, i mnoge druge.
Kakva je budućnost C++ i u kom pravcu se kreće razvoj ovog programskog jezika?
Ivan: Trenutno glavni problem C++-a je njegov imidž nebezbednog programskog jezika.
Dok je u C++-u relativno lako pisati korektan kod, mnogi ljudi imaju mentalitet “bolje ja znam od kompajlera” pa neke stvari koje bi mogle da se implementiraju na bolji način upotrebom viših konstrukata C++-a odluče da implementiraju ručno što često kao posledicu prouzrokuje sigurnosne propuste.
Kada se uzme u obzir činjenica da je infrastruktura na kojoj se vrti ceo svet implementirana u C++-u (web pregledači Firefox i Chromium, virtuelne mašine za Javu i .NET…), ovo predstavlja veliki problem zbog kog je C++ u nekim krugovima na lošem glasu.
Budućnost nije moguće predvideti, ali ne verujem da će C++ nestati dok ja odem u penziju, a ni posle toga. Koliko će biti zdrav tada zavisi od toga koliko C++ zajednica uspe da edukuje nove programere da pišu bezbedan kod.
Što se tiče razvoja samog jezika, ne odvija se preterano brzo, ali je značajno bolja situacija nego što je bila ranije. Sada se na svake tri godine javi novi standard koji uvek donese nešto lepo i korisno.
Želiš da podeliš svoje mišljenje o ovoj temi? Komentari su otvoreni na našoj Facebook i LinkedIn stranici!