Izbor prvog programskog jezika
Uvod
Često se postavlja pitanje u vezi sa tim kakve odlike treba da ima programski jezik koji je pogodan za savladavanje osnova programiranja, odnosno, postavlja se pitanje: koji od postojećih programskih jezika u navedenom kontekstu predstavlja (ili ne predstavlja) dobar izbor.
U opštem smislu, moglo bi se reći da odgovor zavisi od uzrasta polaznika, zatim, od količine vremena na raspolaganju i, pre svega, od toga da li neko želi da se bavi programiranjem iz hobija ('usputno'), ili zapravo želi da od programiranja napravi 'karijeru'.
U opštem smislu, takođe deluje da postoji veliki broj opcija kada su u pitanju sami programski jezici (budući da je u "svetu programiranja" trenutno u opticaju između 10 i 20 programskih jezika visokog nivoa, visokog kvaliteta i velike zastupljenosti u industriji), međutim, pošto se diskusija pred nama odnosi na sam početak bavljenja programiranjem, situacija je ipak "malo drugačija".
U nastavku (osim kada je drugačije navedeno), većina primedbi odnosiće se na to kako problematici treba da pristupe - polaznici koji imaju sklonost prema programiranju, žele da nauče programiranje sa namerom da se programiranjem (profesionalno) bave "na duže staze", shodno svom uzrastu već imaju prirodnih sposobnosti da savladaju bilo koji od uobičajenih programskih jezika i, što je najvažnije - žele da steknu što bolju osnovu za dalji razvoj.
Još nekoliko napomena
Ako ste čitalac koga zanima veoma kratak odgovor na glavno pitanje iz uvoda, mogli bismo reći da većina relevantnih, kvalitetnih programskih jezika (koji se trenutno koriste u industriji) - nisu jezici koji su pogodni za savladavanje osnova programiranja (neki od njih - ni iz daleka :)), i mogli bismo navesti da su C i Python jedini pravi kandidati (pri čemu vam dužina članka verovatno može sugerisati koji od dva navedena jezika zapravo smatramo pravim izborom).
Ako vas zanima samo kraća diskusija (ali ipak malo duža od prethodnog pasusa), napisali smo o svemu nekoliko reči u završnim poglavljima uvodnog članka o Python-u.
Međutim, ako vas zanima nešto opširnija (ali, nadamo se, za vas korisna), diskusija o tome šta je prava svrha programskih jezika visokog nivoa, šta se dešava pri prevođenju programskog koda i zašto neki programski jezici mogu biti bolji izbor od drugih - u fazi učenja - nastavljamo ....
Opšta uloga programskih jezika visokog nivoa
Prvo pitanje kojim se treba pozabaviti je sledeće: šta je (uopšte) svrha programskih jezika (odnosno kompajlera) koje koristimo, to jest - šta kompajleri rade sa programskim kodom koji programeri napišu?
Počnimo od toga da je jedini jezik koji računari (zapravo) razumeju - jezik mašinskih naredbi, iz čega proizilazi (u velikoj meri), da je jedini "suštinski" oblik "obraćanja čoveka računaru" - pisanje programa preko mašinskih naredbi, međutim, u današnje vreme (u ~99% slučajeva), programeri ni ne pomišljaju na to da koriste mašinski jezik (za razvoj programa), već se oslanjaju na programske jezike visokog nivoa, ali - to nikako nije moderan trend.
Programski jezici visokog nivoa zapravo su uvedeni u upotrebu još u ranim fazama razvoja računarske industrije, * jer je već tada postalo jasno da direktno zadavanje mašinskih naredbi (bez obzira na to što verovatno jeste u pitanju "jedini suštinski način obraćanja čoveka računaru"), u praktičnom smislu ne omogućava kreiranje većih i ozbiljnijih projekata.
Konstatacija iz gornje napomene, ne odnosi se (u praktičnom smislu), na projekte sa samog početka razvoja računarske industrije, kada su programi (tj. projekti) ** bili znatno jednostavniji (bar iz današnje perspektive :)) - i zato je "nekako" bilo moguće pisati ih preko mašinskog jezika, ali (naravno), odmah je bilo i ambicioznijih planova za budućnost, i stoga je postalo jasno da je potrebno osmisliti mehanizam koji će "posredovati" između ljudske logike i mašinskih naredbi.
I upravo to je uloga programskih jezika: prevođenje programskih kodova koji približno odgovaraju ljudskoj logici - u nizove mašinskih instrukcija.
Da bismo još bolje razumeli "raskol" između ljudske logike i računarske logike, u nastavku ćemo detaljno razmotriti jedan jednostavan primer.
Ako zanemarimo "hello world/zdravo svete" programe koji samo ispisuju poruke, teško se može zamisliti primer koji je jednostavniji od programa koji sabira dva unapred zadata broja, međutim, kada se ovakav program prevede na mašinski jezik, nije više 'skroz trivijalan' ....
Primer jednostavnog programa za sabiranje dva broja, koji je preveden na mašinski jezik
Program za sabiranje dva broja, tipično podrazumeva: deklaraciju tri promenljive (a
, b
i c
(dva sabirka i zbir)), i naredbu preko koje se računa zbir promenljivih a
i b
- i smešta u memorijsku lokaciju koja je vezana za promenljivu c
.
Pre nego što se osvrnemo na to kako navedeni program "izgleda i funkcioniše" pošto se prevede na mašinski jezik, bitno je razumeti da računar ("ispod haube" / nakon prevođenja programskog koda), ne izvršava direktno one naredbe koje su zapisane u C-u, Python-u, ili nekom drugom jeziku, jer (u najvećem broju situacija), naredbe programskih jezika višeg nivoa - ne odgovaraju direktno mašinskim naredbama.
Na sledećoj slici možemo videti (pomalo uprošćeni) asemblerski pseudokod * programa za sabiranje dva broja (u kome sabiranju prethodi deklaracija i inicijalizacija promenljivih a
, b
i c
):
Verujemo da mnogi stariji i iskusniji čitaoci mogu razumeti ovakav kod "na prvu loptu", ali, svakako ćemo napraviti kraću analizu.
Detaljnija analiza asemblerskog (pseudo)koda
Deklaracija promenljivih (bilo da se tip podatka zadaje eksplicitno, kao u C-u, ili implicitno, kao u Python-u), tumači se pri prevođenju kao naredba preko koje treba rezervisati određeni memorijski prostor za navedene podatke (u gornjem slučaju: tri memorijska bloka od po četiri bajta, što je standardna veličina celobrojnih promenljivih u ovom trenutku i duži niz godina unazad).
Na početku izvršavanja programa, RAM memorija ne sadrži nikakve podatke * i CPU je u neutralnom stanju (na slici: memorijske lokacije promenljivih a
, b
i c
označene su belom bojom, dok su lokacije koje nemaju veze sa izvršavanjem programa zatamnjene).
Nakon deklaracije promenljivih, sledi inicijalizacija (vrednosti 7 i 3 upisuju se u memorijske lokacije koje su rezervisane za promenljive a
i b
).
Nakon upisivanja u RAM memoriju sledi priprema za sabiranje, što podrazumeva da se vrednosti iz RAM memorije prvo kopiraju * u registre ** procesora:
Potom se poziva naredba za sabiranje unutar procesora, a rezultat izvršavanja smešta se u treći registar. *
Na kraju, vrednost iz registra R3
kopira se u memorijsku lokaciju koja je rezervisana za promenljivu c
.
Kroz prethodnu analizu jasno se može razumeti situacija koju smo prethodno opisali: iako instrukcije programskih jezika visokog nivoa bar približno odgovaraju ljudskom načinu razmišljanja - sa mašinskim jezikom to (očigledno) nije slučaj - što znači da se mnogo toga "ne vidi" kada se programi pišu u programskim jezicima koje odlikuje visok nivo apstrakcije.
Ako prethodni mašinski pseudokod uporedimo sa pseudokodom visokog nivoa (koji se može implementirati u bilo kom konkretnom programskom jeziku koji podržava proceduralno programiranje) ....
.... nije teško uvideti zašto mašinski jezik nije praktično koristiti: ni u projektima iole većeg obima (nije nemoguće, ali je veoma, veoma teško, komplikovano i nepraktično) - niti kao prvi jezik preko koga se polaznici upoznaju sa programiranjem.
Svrha prvog programskog jezika
U širem kontekstu, dalja diskusija svodi se na pitanje: koliko tehnologija treba da pomaže programerima pri kreiranju programa?!
Smatramo da pre svega treba razlikovati programiranje u procesu učenja (sa jedne strane), i produkcijsko programiranje kojim se bave profesionalci koji su već savladali osnove (sa druge strane), i stoga ćemo kontekst diskusije svesti na prvu situaciju.
Moglo bi se reći ('hipotetički'), da bismo o izvršavanju računarskih programa najviše naučili kada bismo sve programe pisali na mašinskom jeziku (od samog početka, pa sve do trenutka kada prestanemo da se bavimo pisanjem programa), međutim, to nećemo raditi (ne zato što zaista ne želimo, nego zato što je izrazito komplikovano), i stoga treba naći "zlatnu sredinu" između dve krajnosti:
- mašinskog koda, koji je za ljude izuzetno komplikovan (i, takođe - budimo iskreni - prilično neprirodan) :)
- programskih jezika (suviše) visokog nivoa apstrakcije, kod kojih programski kod deluje jednostavnije, ali je ipak (previše) udaljen od računarske logike (tj. od svega onoga što računar zapravo radi)
Tražimo, dakle, programski jezik koji početnike neće odmah "ubiti u pojam" svojom kompleksnošću, * ali ih takođe - što je još važnije - neće navoditi na netačan zaključak da je programiranje "jednostavnije nego što jeste".
Predstavljanje kandidata
Kao što smo još na početku naveli, smatramo da su programski jezici C i Python, daleko najbolji "kandidati" kada je u pitanju izbor prvog programskog jezika (i manje-više jedini koje zapravo treba uzeti u obzir). *
Iz perspektive početnika koji se tek susreću sa programiranjem, C previše "naginje" prema kompleksnosti, dok iskusniji programeri koji se bave i pedagoškim radom, često zameraju Python-u na suviše visokom nivou apstrakcije, odnosno, na sklonosti ka "skrivanju" delova koda o kojima svaki programer (ipak) treba da razmišlja - pogotovo kada su u pitanju programeri koji tek savladavaju prve korake.
Međutim (kao što smo takođe ranije naveli), u pitanju je situacija koja zavređuje podrobniju analizu, i stoga ćemo se u nastavku pozabaviti najvažnijim karakteristikama dva navedena jezika.
Kandidat #1 - programski jezik C
Programski jezik C pojavio se pre nešto malo manje od 50 godina, kao odgovor na pitanje, kako premostiti jaz između: (dotadašnjih) programskih jezika visokog nivoa (BASIC, Fortran, Cobol ....), koji nisu bili pogodni za sistemsko programiranje, i (sa druge strane), različitih implementacija asemblera (tj. mašinskog jezika), koji jeste podoban za pisanje programa bilo kog nivoa kompleksnosti, ali - kao što smo već videli - takođe je i prilično komplikovan (kako za učenje, tako i za razvoj kompleksnog softvera).
Sintaksa C-a je bliska ljudima (to doduše nije bio nedostatak ni jezika kao što su Pascal, Fortran, Cobol i sl; njihova sintaksa je možda i bliža govornom engleskom jeziku u odnosu na C), ali, za razliku od prethodno navedenih jezika (i drugih sličnih jezika), C je omogućio programerima upotrebu pokazivača, specijalizovanih promenljivih koje pružaju direktan pristup memorijskim lokacijama.
Nije bilo teško uvideti da jezik - moćan skoro kao asembler i ne mnogo kompleksniji od drugih tadašnjih jezika - predstavlja krajnje elegantno rešenje za pisanje operativnih sistema i drugog sistemskog softvera (kao i bilo kog softvera opšte namene).
Prosto rečeno, "to je bilo to" (što do tada nije postojalo i "što se čekalo"), i C je u godinama koje su dolazile postao svojevrstan standard, stekao je zasluženu popularnost, a dobio je i više objektno orijentisanih naslednika sa sličnom sintaksom (C++, Java, C# .... da pomenemo samo "najočiglednije").
Iz današnje perspektive, C svakako nije "poslednja reč tehnike", ali, kao i svaka suštinski dobra zamisao koja je takođe i dobro izvedena - odoleva "zubu vremena", i dalje je "živ i zdrav", dobro se drži, i dalje se koristi u industriji, i naravno (što nas u ovom trenutku najviše zanima) - koristi se kao jezik za učenje.
Primer jednostavnog programa u programskom jeziku C
Da bismo se upoznali sa tim kako izgledaju programi u C-u, uzećemo za primer ("ponovo"), jednostavan program koji sabira dve zadate celobrojne vrednosti i ispisuje rezultat:
Instrukcije u C-u (pogotovo iz perspektive početnika), mogu se podeliti u dve kategorije:
- instrukcije koje direktno služe "onome što treba uraditi" (sabiranje dva broja i prikaz rezultata)
- instrukcije koje "mladim programerima nisu previše zanimljive, ali, 'eto', i one se moraju zapisati"
Instrukcije iz druge kategorije često "dosađuju" polaznicima svojom "nepotrebnom" pojavom, ali, takav utisak skoro u potpunosti izbledi već posle nekoliko nedelja bavljenja C-om (eventualno posle nekoliko meseci), a da bismo dodatno ubrzali proces početnog upoznavanja, osvrnućemo se na nekoliko "spornih" jezičkih konstrukcija.
Analiza programskog koda
Direktiva #include
sugeriše prevodiocu da treba u program uvesti određenu biblioteku (da bismo mogli da koristimo naredbe koje navedena biblioteka sadrži).
Deklaracija int a, b, c;
sugeriše da nabrojane promenljive pripadaju celobrojnom tipu.
Pored navedenog, prisutna je i obavezna upotreba funkcije main
(sa zaglavljem void main()
i vitičastim zagradama koje uokviruju telo funkcije).
Možda je u pitanju 'previše informacija' za sam početak, ali, kao što rekosmo, polaznici se veoma brzo i lako naviknu na C-ovski pristup, pri čemu postoji i prilika da se svašta nauči:
- biblioteka
stdio.h
uvozi se zato što, u C-u, funkcije ulaza i izlaza nisu deo osnovne specifikacije jezika, već se nalaze u bibliotekama (što naprednim korisnicima koji imaju puno slobodnog vremena, daje mogućnost da samostalno implementiraju čak i elementarne funkcije, i time prošire osnovne mogućnosti jezika) - podaci u svakom slučaju pripadaju određenom tipu (i u jezicima sa dinamičkom tipizacijom, a pogotovo u jezicima sa strogom tipizacijom, kao što je C), i stoga (pomalo slikovito) - nekako je "najpoštenije" da sami izaberemo tip podatka pri deklaraciji promenljivih (u gornjem primeru, za tip podatka je izabran
int
- celobrojna vrednost) - funkcije takođe postoje u većini programskih jezika (i Python spada u navedenu većinu), a specifičnost C-a je da ("eto"), insistira na tome da se funkcije koriste uvek, čak i kada se pišu izrazito jednostavni programi koji koriste samo jednu funkciju
Ispis preko funkcije printf()
jeste malo komplikovaniji za razumevanje na samom početku, i stoga ćemo instrukcijama za formatiranje ispisa posvetiti dodatnu pažnju u nastavku (pošto predstavimo način pisanja programa u Python-u).
Sve što smo do sada naveli "nije baš trivijalno" (iz perspektive početnika), ali, može se ipak zaključiti da C nije ni "previše komplikovan" (ni iz daleka). :)
Programskom kodu koji se direktno tiče zadatka koji rešavamo, moraju se doda(va)ti i druge (obavezne) instrukcije, međutim, instrukcije su (kao što smo videli), prilično jednostavne za razumevanje (iza svega stoje krajnje logične ideje) - i zaista nije teško navići se na "C-ovski" pristup.
Kandidat #2 - Programski jezik Python
Programski jezik Python (takođe programski jezik visokog nivoa), pojavio se pre ~30 godina, pri čemu nije baš pokrenuo revoluciju kakvu je izazvala pojava C-a, ali, svakako je na sebe skrenuo pažnju, i postao je u međuvremenu jedan od najpopularnijih jezika.
Ako je C bio odgovor na pitanje: kako napraviti čitljiv programski jezik visokog nivoa koji je skoro na nivou asemblera po pitanju mogućnosti i brzine izvršavanja koda, Python je bio odgovor na pitanje: kako napraviti skriptni jezik (sa jednostavnom, preglednom sintaksom) - koji nudi većinu mogućnosti koje su svojstvene ozbiljnijim, 'kompajliranim' programskim jezicima kao što su C i C++.
Međutim, pored dobrih strana, upotreba programskog jezika koji ne podrazumeva kompajliranje programskog koda pre pokretanja, svakako povlači pitanje brzine izvršavanja programa.
U početku, brzina izvršavanja skripti jeste bila jedna od glavnih "boljki" Python-a (tj. da budemo precizni - nedostatak brzine :)), ali, u praktičnom smislu, "brzina" već duže vreme ne igra iole bitnu ulogu u diskusijama koje se tiču mogućnosti ovog jezika.
Pogledajmo kako izgleda jednostavan program za sabiranje dva broja, napisan u Python-u.
Primer jednostavnog programa u programskom jeziku Python
Ako tražimo 'suštu jednostavnost' (makar u kontekstu elementarnih programa :)), Python nas neće izneveriti:
Kada smo napisali sličan program u C-u, usledila je analiza koda, a svrha analize bila je - da pomogne oko nejasnoća u programskom kodu.
Ovoga puta nema potrebe za detaljnom analizom (sav kod staje u nekoliko linija, nema vitičastih zagrada i (bar za sada), importovanja biblioteka).
Umesto analize koda u Python-u, posmatraćemo šta se događa (u oba programska jezika), kada kompleksnost programa počne da raste.
Razlike između C-a i Python-a u implementaciji kompleksnijih kodova
Pre svega, ako zanemarimo obavezne, "uokvirujuće" delove koda u C-u, primetićemo da su programi koje smo već pisali u dva programska jezika koje proučavamo, gotovo istovetni, a kako kompleksnost programa raste - razlika uglavnom ostaje u granicama koje smo već 'dostigli', a ponekad postane i manja.
Prvo čime ćemo "zakomplikovati kodove", biće naredbe ulaza.
Dodavanje naredbe ulaza
I ovoga puta, prvo ćemo razmotriti (izmenjeni) C kod ....
.... pri čemu ćemo napraviti i kratak osvrt na funkciju printf
(što smo prethodno ostavili "za kasnije").
Funkcija printf
("print formatted" - ispis sa formatiranjem podataka), omogućava ispis podataka u terminalu.
Ako funkciji predamo nisku "Dobar dan! :)" ....
.... i pokrenemo program, u terminalu će biti ispisano "Dobar dan! :)"
.
Za ispis podataka kao što su vrednosti brojčanih i znakovnih promenljivih, naredba printf
koristi tzv. specifikatore konverzije ....
%c
- za znakovne promenljive%d
- za celobrojne vrednosti%f
- za decimalne brojeve
.... što podrazumeva da se pojava navedenih niski (u okviru glavne niske koja je ograničena znacima navoda), tretira kao poziv za ispis vrednosti promenljivih, pri čemu se identifikatori promenljivih navode posle zareza (zarez sledi posle tzv. komandnog stringa, što je zvaničan naziv za "glavnu nisku" koja sadrži ispis običnih znakova i specifikatora konverzije):
Pokretanjem gore navedenog koda - dobija se ispis 54
.
U Python-u je situacija po pitanju jednostavnih naredbi ispisa - još bolja (kao što smo već videli) ....
.... i, u ovom slučaju, gornji kod predstavlja ceo program.
Što se tiče naredbe scanf()
u programskom jeziku C (koju ste takođe mogli zapaziti), u komandnoj niski navode se specifikatori konverzije; posle zareza dolaze adrese promenljivih (operator &
predstavlja operator adresiranja u C-u), a adrese redom odgovaraju navedenim specifikatorima:
U python-u se učitavanje rešava preko naredbe input()
, ali, kada se učitavaju celobrojne vrednosti, potrebno je koristiti i funkciju int()
, koja prihvata nisku (u svojstvu argumenta), i pretvara je u celobrojnu vrednost. *
Kod za učitavanje vrednosti promenljivih u Python-u, u očima početnika i dalje (verovatno) deluje jednostavnije od programskog koda iz C-a (koji smo ranije prikazali), međutim, već na ovako jednostavnom primeru vidimo da nije više u pitanju 'skroz jednostavan kod', a vidimo i to da u Python-u takođe moramo voditi računa o tipovima podataka pri unosu (bez obzira na to što tip promenljivih nigde nije eksplicitno deklarisan).
Kombinovani ispis unapred zadatih niski i vrednosti promenljivih
Za kraj, poredićemo kodove za kombinovani ispis unapred zapisanih (tj. "hardkodiranih") niski, i vrednosti promenljivih.
Funkcija printf
, koja možda jeste 'pomalo zbunjujuća' za sam početak (dok polaznik ne napiše ~desetak programa), na ovom mestu će pokazati svoju pravu vrednost.
Kada je potrebno kombinovati unapred zadati ispis i vrednosti promenljivih, printf
nudi elegantno rešenje (veoma nalik rešenjima koja smo predstavili u članku o šablonskim niskama): *
Osnovni ispis u Python-u više nije toliko jednostavan (jer podrazumeva upotrebu dodatne funkcije str
, preko koje se brojevi i drugi netekstualni podaci pretvaraju u niske), i takav ispis - u slučaju kada je u nisku potrebno uvrstiti veći broj promenljivih - u praksi ume da deluje prilično "nezgrapno" ....
.... ali, Python nudi i drugi način formatiranja podataka u ispisu ....
.... koji (u idejnom smislu i po pitanju kompleksnosti), deluje gotovo istovetno kao zapis u C-u i, u takvoj situaciji, razlike između C-a i Python-a (u smislu kompleksnosti koda) - gotovo da ne postoje. :)
Zašto smo "preskočili" Javu, C# i JavaScript
Iako uvažavamo Javu, C# i JavaScript kao krajnje relevantne jezike, smatramo da ih (ipak) treba izbeći na samom početku.
JavaScript je jezik koji se izvršava u browseru (što nije najzgodnija okolnost za početnike), a pri tom je takođe u pitanju jezik koji "naginje" prema pojednostavljenim načinima za zapisivanje koda (po čemu 'podosta' podseća na Python).
Nasuprot navedenom, Java i C# "pretežu" na drugu stranu.
Java i C# nalažu obaveznu upotrebu klasa (Java pri tom zahteva da svaka klasa bude u zasebnoj datoteci), a tu je i obaveza kreiranja programa preko projekata koji su smešteni u zasebne foldere (za razliku od C-a i Python-a, koji dozvoljavaju kreiranje i pokretanje programa preko pojedinačnih izvornih datoteka).
Usudili bismo se da pretpostavimo, da nijedan mlađi polaznik koji nema dovoljno prethodnog iskustva (a bogme ni stariji), nije u stanju da "na prvu loptu" razume sledeći kod ....
.... kao ni sledeći kod ....
.... i to je sasvim u redu (ako se potrudite oko razvoja sopstvene programerske veštine i "ne preskačete gradivo", neće proći mnogo vremena do trenutka kada ćete razumeti, ne samo prethodno navedene kodove, već - i znatno kompleksnije kodove). :)
Ako je sa C-om problem to što se od početnika zahteva da odmah usvoje veći broja ideja (#include
, funkcije, printf
i scanf
sa specifikatorima konverzije i sl), jasno je da Java i C# pred početnike postavljaju još više zahteva.
Učenici koji žele da se odmah upuste u izučavanje Jave ili C#-a (što, da ponovimo - nikako ne preporučujemo), zahtevima koje pred njih na početku postavlja programski jezik C, moraju dodati i sledeće zahteve:
- ili moraju naprečac usvojiti principe OOP-a, da bi mogli razumeti šta rade
- ili mogu nekritički prihvatiti da ("eto", "onako"), funkcije treba pisati unutar klasa
Usvajanje principa objektno orijentisanog programiranja naprečac - gotovo je nemoguće izvesti (najbolje je da ni ne pokušavate :)), i veoma je neprirodno i pedagoški štetno da prilično kompleksnu tematiku OOP-a savladavate pre nego što ste dobro savladali same osnove programiranja!
Što se tiče toga da prihvatite da neko vreme (u praksi, bar nekoliko meseci), pišete kodove koji moraju biti uokvireni telom klase, reći ćemo da takav pristup ponekad uspe, ponekom starijem polazniku (15+), ali, i dalje ne preporučujemo da pokušavate, jer, iako ponekad uspe, u velikoj većini slučajeva - navedeni pristup samo dovodi do velike zbrke!
Ima li još opcija?
Zarad opšte informisanosti, navešćemo "još koji" programski jezik (iz skupa programskih jezika koji .... 'ikako' .... mogu doći u obzir). *
Reklo bi se da su najočigledniji primeri iz kategorije 'ostalih kandidata' - BASIC i Pascal, jezici koji nisu igrali 'preveliku ulogu' u razvoju softvera koji se koristi u industriji, ** ali su zato u 'starija vremena' veoma često bili korišćeni u obrazovne svrhe i na izvestan način su i dalje deo 'kolektivnog sećanja' (upravo zbog svoje nekadašnje uloge u obrazovanju starijih generacija programera).
BASIC je tipično bio namenjen najmlađim početnicima, a Pascal, učenicima i studentima (autor ovog članka takođe je svoje prve (prave) 'programerske korake' načinio upravo uz Pascal, i svega se seća sa simpatijama :)).
Međutim, u današnje vreme, navedeni 'trenažni' jezici koriste se vrlo retko i smatraju se prevaziđenim.
Sa druge strane, postoje moderni jezici kao što su Go i Rust, koje takođe treba izbegavati, ali - iz sasvim 'suprotnih' razloga.
"Teška srca" savetujemo pojedince da na početku izbegavaju Go ili Rust, ali, sintaksa ova dva jezika (u iole praktičnom smislu) - nije "blagonaklona" prema početnicima (u pitanju su jezici namenjeni zadacima kao što je sistemsko programiranje (drajveri za uređaje, komponente operativnih sistema i sl), ili, kreiranje visoko optimizovanih backend komponenti web aplikacija, što, da ponovimo - nikako nisu poduhvati za početnike). :)
Vreme je da polako završimo diskusiju o izboru prvog programskog jezika ....
C vs. Python - "Može biti samo jedan" (na samom početku)
Pretpostavljamo da čitaocima neće biti teško da zaključe koji od dva jezika (kojima smo posvetili najviše pažnje), predstavlja našu preporuku za izbor prvog programskog jezika - u pitanju je C.
Međutim, želimo da dodatno pojasnimo (za svaki slučaj): 'navijamo' za C, a ne protiv Python-a (prema Python-u zapravo gajimo izvesne simpatije, iako smo i dalje svesni određenih realnih nedostataka ovog jezika).
Ako "baš mora" da bude Python za početak, i ako bi odricanje od Python-a ugrozilo vašu ljubav prema programiranju i želju da se ovom veštinom dalje bavite - nemojte se odreći Python-a i počnite učenje upravo uz Python.
Ali, vodite računa o sledećem ....
Python je programski jezik čiji se pravi smisao ogleda u tome da je u stanju da iskusnim programerima olakša (ili, neko bi možda rekao - ulepša), posao izrade skripti za rešavanje svakodnevnih zadataka (i mnogo šta još), a pri tom je pogodan i za najmlađe polaznike kojima C objektivno može predstavljati preveliki "zalogaj" na samom početku, pogotovo ako programiranje savladavaju sami (što se danas dešava mnogo češće nego ranijih godina).
Svrha Python-a nije, da stariju omladinu, koja može da savlada C ili bilo koji drugi jezik, "poštedi napora" - pogotovo ne pojedince koji razmišljaju o karijeri u programiranju.
Ako ste neko ko ima 9 ili 10 godina (recimo da bi to bila donja starosna granica za ulazak u svet programiranja), i pri tom zamišljate kako bi bilo lepo započeti upoznavanje sa programiranjem uz Python, kažemo - samo napred. :)
Ako ste malo stariji, verujemo da ćete najbolje rezultate postići (pod uslovom da ne želite odmah da se bacite na C, što i dalje preporučujemo), tako što ćete prve korake napraviti preko Python-a, i potom, već posle izvesnog broja nedelja (ili posle nekoliko desetina napisanih programa i sl), preći na izučavanje C-a.
Međutim, ako ste neko ko je skoro duplo stariji od prve kategorije (tj. neko čija se sposobnost da savlada osnove C-a ne dovodi u pitanje), pri tom već znate da želite da se bavite programiranjem, odnosno, učite programiranje da biste postali programer, a ne iz puke razonode .... razmislite dobro o tome da li zaista želite da programiranje učite, uz jezik koji će previše toga raditi umesto vas (odnosno, razmislite o tome koliko zapravo možete naučiti uz 'olakšani' pristup).
Primetili ste verovatno, da (iole ozbiljniji) sportski treneri "vole da dosađuju" mladim sportistima time što insistiraju na napornim fizičkim vežbama i trčanju - pre nego što se uopšte započne sa razvojem sportske veštine (i pri tom osnovne vežbe (za)uvek ostaju deo treninga). "Možda" je tako - zato što je jasno da bez kondicije nema uspešnog bavljenja sportom?!
Otkrićemo vam "tajnu" - za programiranje je takođe potrebna kondicija! Ne ista kondicija koja je potrebna sportistima (mada, ako nas pitate, i sportska kondicija sasvim dobro dođe :)), već mentalna kondicija, koja se stiče trudom, radom, sagledavanjem i pisanjem velikog broja programa (pri čemu se izazovi ne izbegavaju, već - savlađuju, i pri čemu se radnje ne obavljaju mehanički, već, sa razumevanjem) - što sve proističe iz ljubavi koju neko gaji prema programiranju.
Ako ne spadate u mlađe kategorije - nemojte sebe previše štedeti. Nikako se nemojte naprezati preko mere (nema svrhe; morate se takođe i 'odmarati i obnavljati'), ali - prosto rečeno - nemojte dozvoliti da vas lenjost prevlada! :)
Krajnji izbor (naravno) - ostavljamo vama.