Programski jezici
Programski jezik je veštački jezik koji se koristi za kontrolisanje rada računara. Prema nekim autorima, programski jezik je samo onaj jezik kojim se može predstaviti svaki mogući algoritam.
Kao i prirodni jezici, svaki programski jezik ima određena pravila:
- sintakse (gramatike) - pravila koja određuju način pisanja programa i
- semantike (smisla) - pravila kojima se definiše da ono što je napisano ima neko značenje.
Pogledajmo primer naredbe kojom se proizvod promenljivih X i Y smešta u promenljivu A. Pravila sintakse programskog jezika Pascal nam zabranjuju da tu naredbu napišemo npr. kao:
a = *(x,y).
Prethodni red ima veliki broj grešaka (naredba dodele nije isto što i operator jednakosti, operator množenja se mora naći između dva operanda, posle naredbe se ne stavlja tačka, itd). Sintaksno ispravan način zapisa ove naredbe bio bi:
a := x * y;
Međutim, šta ako promenljive X i Y nisu numeričke već tekstualne? U tom slučaju, iako smo napisali sintaksno ispravnu naredbu, ona nema smisla, jer ne postoji stvar kao što je proizvod dva teksta.
Tokom godina, razvijeno je nekoliko stotina programskih jezika, namenjenih rešavanju specifičnih grupa problema. Neki od njih su u širokoj upotrebi, dok se neki koriste samo u posebne svrhe.
Nivo programiranja
Programske jezike možemo podeliti na više načina. Verovatno najosnovnija bila bi podela prema prilagođenosti jezika čoveku odnosno računaru, pa tako programske jezike delimo na:
- jezike niskog nivoa, koji su bliski radu računara i
- jezike visokog nivoa, koji su bliski ljudskom načinu razmišljanja.
Programi pisani u jezicima niskog nivoa (mašinski jezik, asembler, jezik C) su veoma brzi, ali teški za pisanje i pronalaženje grešaka. Sa druge strane, u jezicima višeg nivoa, programiranje i podela posla su mnogo lakši, ali su i programi pisani u njima sporiji. Što je jezik na višem nivou to je više prilagođen rešavanju specifičnih zadataka, dok je rešavanje opštih problema teže i proizvodi mnogo sporiji program. Primeri ovakvih jezika su Flash ActionScript, VBA (Visual Basic for Applications) i slični.
Napredak programskih jezika i orijentacija programera ka višim jezicima i moćnijim radnim okruženjima postaje neminovna, pošto se fokus u poslovnim aplikacijama prebacuje sa „brzina po svaku cenu“ na „upotrebljivost pre svega“. Tako programi postaju sve kompleksniji pošto bivaju prilagođeni sve većem broju korisnika koji ne moraju imati informatičko znanje. Takođe, potrebno je osigurati što brži razvoj kvalitetnih aplikacija, te tako programeri koriste svaku mogućnost da što pre kreiraju aplikaciju koja zadovoljava potrebe naručioca. Srećom, razvoj računara i povećanje njihove brzine i memorije omogućio je da i ovakvi programi zadovoljavajuće funkcionišu.
Danas se veoma retko pristupa programiranju u asembleru (koji je veoma blizak mašinskom jeziku računara). Moderni kompajleri su veoma napredovali u optimizaciji prevedenih programa, a procesori su postali veoma kompleksni. U najvećem broju slučajeva kompajler će napraviti bolji mašinski program u odnosu na čoveka – programera.
Način izvršavanja
Prema načinu izvršavanja, programske jezike možemo podeliti na:
- jezike koji se prevode (kompajliraju) - programi pisani u ovim jezicima se prvo prevode na mašinski jezik, a onda se mogu izvršavati;
- jezike koji se interpretiraju – programi se odmah izvršavaju tako što se svaka pojedina naredba prevodi i izvršava.
Programi prevedeni na mašinski jezik su veoma brzi, ali su prilagođeni samo jednom tipu procesora, odnosno operativnog sistema. Sa druge strane, interpretirani programi se izvršavaju daleko sporije, ali su mnogo fleksibilniji po pitanju platforme na kojoj se izvršavaju – mogu funkcionisati gde god postoji njihov interpreter.
Većina komercijalnih programa i igara za računare prevodi se na mašinski jezik, pošto se od njih zahteva maksimalna brzina (npr. jezici C, Pascal, Delphi, C++). Međutim, i interpretirani jezici imaju svoju upotrebnu vrednost, budući da postoje situacije u kojima brzina nije od presudnog značaja, a zahteva se mogućnost da se neki manji posao automatizuje ili da se ostvari neka interaktivnost. Tipičan primer bili bi skript jezici koji se koriste na Internet prezentacijama (JavaScript) i koji se izvršavaju unutar web stranice bez obzira na to koji sistem koristi posetilac sajta.
Danas postoji posebna, naprednija klasa interpretiranih jezika, koji omogućuju veću brzinu programa, uz istovremenu fleksibilnost izvršavanja na različitim platformama. U pitanju su programi koji se izvršavaju preko tzv. virtuelne mašine. Virtuelna mašina predstavlja simulaciju računara u računaru. Tako se programi prevode, ali ne na mašinski jezik, već u „bajtkod“ (bytecode), koji u stvari predstavlja „mašinski“ jezik virtuelnog računara. Ovakav program može se pokrenuti na svakom računaru na kome postoji virtuelna mašina.
Ovakvi programi se izvršavaju brže od obično interpretiranih programa, ali ipak i dalje sporije od programa kompajliranih u originalni mašinski jezik. Jedna od optimizacija kojima se ubrzava rad programa u virtuelnoj mašini je „prevođenje u poslednjem času“ (JIT – Just In Time compilation), kada se bajtkod neposredno pre izvršavanja prevede u mašinski jezik.[1]
Programski jezik Java je tipičan primer ove strategije u razvoju programskih jezika. Tako se programi pisani u Javi mogu izvršavati na različitim računarima, ali i na mobilnim telefonima ili drugim uređajima. Po ugledu na Javu i njenu virtuelnu mašinu, Microsoft je razvio sopstvene .NET (dot-net) programske jezike – pandan Javi za .NET platformu je jezik C# ("see sharp").
Većina programskih jezika omogućava rad sa podacima. U trenutku pisanja programa, programer određuje kakvi će biti podaci sa kojima program radi. Tipovi podataka i njihove strukture mogu biti brojni, međutim, osnovnih tipova ima relativno malo, pa tako programi obično operišu sa celim brojevima, racionalnim (decimalnim) brojevima, tekstom i logičkim podacima (tačno – netačno).
Tipizacija podataka
Prema načinu na koji rade sa tipovima podataka, programski jezici se mogu podeliti na:
- netipizirane i
- tipizirane, koji se dele na
- slabo tipizirane i
- strogo tipizirane.
Netipizirani su jezici kod kojih ne postoji nikakva provera tipova podataka. Podaci se posmatraju onako kako programeru odgovara u tom trenutku. Primer ovakvog jezika jeste asembler, kod koga je moguće npr. sabrati znak i broj (uglavnom zato što na toliko niskom nivou svi podaci i jesu brojevi).
Većina modernih programskih jezika su tipizirani, te kod njih nije dozvoljeno mešanje različitih tipova podataka u izrazima. Kod strogo tipiziranih jezika uvek se mora vršiti tzv. „konverzija“ tipova. Sa druge strane, ukoliko je jezik slabo tipiziran, utoliko je moguće jedan tip podatka proslediti kao drugi. Iako se čini da je ovakav način lakši za programera, postoji opasnost od sasvim neočekivanih i teško uočljivih grešaka.
Pogledajmo sledeći primer. U jeziku JavaScript je sasvim legalno u aritmetičkim izrazima navoditi brojeve u obliku teksta. JavaScript interno vrši izjednačavanje tipova, ali ponekad će nas rezultat iznenaditi.
"10" + 7 // rezultat je "107"
"10" * 7 // rezultat je 70
U prvom slučaju oba podatka su tretirana kao tekst, pošto operacija "dodavanja" takođe služi da dva teksta povežu u jedan, dok su u drugom oba tretirana kao brojevi. Ako programer ne bi vodio računa o tipovima, onda bi program funkcionisao bez prijavljenih grešaka, ali bi rezultati bili pogrešni.
- Eckel, B. (2002), Misliti na Javi, prev. 2. izd. Beograd: Mikro knjiga