Rezime
- Kompjuter je uređaj koji je sposoban da izvrši proizvoljan broj aritmetičkih i logičkih operacija.
- Program je skup instrukcija koje kompjuteru govore šta je potrebno da uradi.
- Proces stvaranja kompjuterskih programa naziva se programiranje.
- Kompjuterske programe kreiraju programeri, ljudi koji poseduju neophodna znanja kako bi bili u mogućnosti da kreiraju instrukcije koje diriguju kompjuteru.
- Prvim kompjuterskim programerom na svetu smatra se Ada Lovelace.
- Mašinski jezik je maternji jezik kompjutera, odnosno jedini jezik koji kompjuter razume.
- Asembler, odnosno asemblerski jezik, predstavlja programski jezik niskog nivoa, kod kojeg se osnovne programske naredbe pišu korišćenjem unapred utvrđenih reči, koje simbolizuju naredbu koju predstavljaju.
- Mašinski i asemblerski jezik u potpunosti su zavisni od fizičkih osobina procesora na kojima se izvršavaju, te od programera u velikoj meri zahtevaju poznavanje same fizičke arhitekture računara.
- Programski jezici višeg nivoa u znatno većoj meri koriste elemente prirodnih jezika, uglavnom reči i skraćenice preuzete iz engleskog jezika, te na taj način unapređuju čitljivost i olakšavaju kreiranje programskog koda.
- Kompajler i interpreter su kompjuterski programi čija je osnovna svrha generisanje drugih kompjuterskih programa.
Uvod
Više od milion godina, ljudska rasa je u konstantnom razvoju. Čovek je intelektualno, spoznajno i fizički prevalio ogroman put od pećinskih skloništa do moderne civilizacije kakvu poznajemo. Iako se o smislu i opravdanosti korišćenja svih blagodeti koje su modernom čoveku na raspolaganju može diskutovati, evidentan je ogroman napredak ljuske vrste, koji se ubrzava eksponencijalnom proporcijom.
Prvih milion godina postojanja, čovek je utrošio na osmišljavanje i kreiranje raznih alata i mašina, koje su mu omogućile da se kreće brže i postigne više. Tako je čovek postao sposoban da uruši planine, ukroti reke i otputuje sa jednog kraja planete Zemlje na drugi za manje od jednog dana. Može se reći da je čovek na taj način svoju fizičku snagu uspeo da uveća nekoliko hiljada puta.
Ono što, ipak, čoveka izdvaja od drugih vrsta jesu alati koje je razvio kako bi proširio i pojačao moć svog intelekta. Prvi takav „alat” jeste jezik (govor i pismo). Govor je čoveku omogućio prenos saznanja i artikulaciju intelekta, a pismo uvid u znanja koja su formirana i razvijana od strane desetina prethodnih generacija. Redovi koje vi upravo čitate idealan su primer moći pisane reči, koja vam omogućava da saznate nešto što do sada niste znali, te da na taj način pokušate da moć svog intelekta iskoristite na potpuno novim poljima.
Artikulisanje govora i pojava pisama omogućili su čovečanstvu da još većom brzinom nastavi napred. Poslednje u nizu velikih dostignuća ljudske vrste jesu kompjuteri – mašine koje su čoveku omogućile proširivanje umne snage do neslućenih granica.
Svet kompjutera
Pojava kompjutera u potpunosti je promenila svet, kao i način života ljudi. Kompjuteri su danas svuda oko nas, unutar desktop i laptop računara, pametnih telefona, tableta, pametnih časovnika, televizora, automobila, aviona, veš-mašina, šporeta, klima-uređaja, bankomata...
Većina svakodnevnih aktivnosti danas se ne može zamisliti bez kompjutera. Iako toga možda niste ni svesni, veliki broj uobičajenih dnevnih operacija u potpunosti zavisi od kompjutera. Oglašavanje alarma na digitalnom budilniku, podgrevanje doručka u mikrotalasnoj pećnici, putovanje modernim automobilom do posla ili škole, podizanje novca na bankomatima, gledanje omiljenog filma na TV-u, samo su neki od primera najobičnijih aktivnosti koje ne bi bile moguće da kompjuteri ne postoje. Tako se sa pravom može reći da je današnji svet – svet kompjutera.
Pored svakodnevnih čovekovih aktivnosti koje su u potpunosti podržane kompjuterima, i ostale oblasti današnjeg modernog sveta se ne mogu zamisliti bez računara. Tako praktično ne postoji oblast tehnologije, umetnosti, niti nauke, koja u većoj ili manjoj meri ne koristi kompjutere. Laserska operacija oka, projektovanje saobraćajnice, analiza uzorka krvi, štampanje novina, sklapanje automobila na proizvodnoj traci, samo su neki od primera intenzivnog korišćenja kompjutera u svim oblastima poslovanja.
Šta je kompjuter?
Uobičajena definicija kompjutera bi glasila – kompjuter je uređaj koji je sposoban da izvrši proizvoljan broj aritmetičkih i logičkih operacija. Ukoliko se ova rečenica razloži na više delova, može se reći da je kompjuter uređaj koji može da:
- prihvati neke ulazne podatke
- izvrši obradu podataka
- proizvede izlaz koji može biti razumljiv čoveku ili nekoj drugoj mašini
Iako se pojam kompjutera poistovećuje sa desktop i laptop računarima, veoma je bitno razumeti da kompjuteri postoje u veoma širokom spektru oblika. Na hiljade kompjutera skriveno je u uređajima oko nas iako toga u nekim situacijama nismo ni svesni. Takvi kompjuteri se mogu nazvati specijalizovanim, s obzirom na to da su namenjeni obavljanju unapred utvrđenih operacija. Na primer, kompjuteri u modernim automobilima namenjeni su kontroli funkcionisanja motora i ostalih uređaja. Tako je primarni kompjuter u automobilu namenjen kontrolisanju ubrizgavanja goriva, rada ventila i slično. Takav kompjuter, razumljivo je, ne može se koristiti za pretraživanje interneta. Stoga su nama mnogo bliži kompjuteri koji se mogu nazvati univerzalnim. Oni su namenjeni obavljanju širokog skupa univerzalnih operacija, koje isključivo zavise od potreba korisnika. Univerzalni kompjuteri danas primarno postoje u obliku desktop, laptop i tablet računara, kao i u obliku pametnih telefona. Takvi uređaji se mogu koristiti za obavljanje najrazličnijih operacija, od jednostavnog surfovanja internetom, pisanja teksta, pregleda audio i video zapisa, pa sve do upravljanja i kontrolisanja ostalih vrsta digitalnih uređaja.
Šta su programi?
Pored sve mistike koja okružuje kompjutere u celini, bitno je razumeti da oni nisu nikakve magične mašine, odnosno da samostalno nisu u stanju da urade baš ništa. Svaki kompjuter kontroliše program, što je zapravo skup instrukcija koje kompjuteru govore šta je potrebno da uradi. Bez takvih instrukcija, kompjuter bi bio mašina koja ne bi imala nikakvu praktičnu upotrebu (slika 1.2).
Sa odgovarajućim skupom instrukcija, objedinjenim unutar programa, kompjuter može postati alat koji je moguće koristiti za međukontinentalnu komunikaciju, lansiranje nuklearnog projektila, istraživanje novih molekula koji mogu izlečiti najteže bolesti itd. S obzirom na to da se kompjuteri rađaju kao uređaji bez ikakve svesti, jasno je da se procesom pisanja instrukcija, objedinjenih unutar programa, kompjuterima udahnjuje život. Takav proces drugačije se naziva programiranje, što je i primarna tematika ovog kompletnog programa.
Šta je programiranje?
Ono što kompjutere izdvaja od ostalih mašina koje je čovek tokom vremena napravio jeste mogućnost programabilnosti. To praktično znači da je kompjuter, uopšteno posmatrano, jedna univerzalna alatka koja u zavisnosti od instrukcija koje joj se proslede može obavljati različite poslove. Upravo u ovoj činjenici krije se i najveća moć ovih mašina – potpuna proizvoljnost programabilnosti.
Proces stvaranja kompjuterskih programa naziva se programiranje. Tako je programiranje čin pisanja instrukcija koje omogućavaju da kompjuter obavi neku operaciju. Iako uopšteno vlada drugačije mišljenje, programiranje je veoma kreativan proces, koji u velikoj meri sadrži razne aspekte umetnosti, inženjerstva i nauke.
Ko su programeri?
Kompjuterske programe kreiraju programeri, ljudi koji poseduju neophodna znanja kako bi bili u mogućnosti da napišu instrukcije koje diriguju kompjuterom. Moderno kompjutersko programiranje može se smatrati relativno novom profesijom, starom tek nešto više od pedesetak godina. Ipak, prvi oblici programiranja zabeleženi su znatno ranije, u vreme postojanja mehaničkih računara, značajno drugačije konstrukcije od onih kakve danas poznajemo.
Prvim kompjuterskim programerom na svetu smatra se Ada Lovelace (slika 1.3), ćerka pesnika Lorda Bajrona (engl. Lord Byron).
Ada Lovelace je 1840. godine na prevod dobila stručni tekst Charles Babbagea, pionirskog kompjuterskog konstruktora. Tekst je sadržao prezentaciju dizajna i funkcionisanja njegovog novog mehaničkog kompjutera koji se zvao Analytical Engine. Tokom prevođenja ovog teksta sa francuskog na engleski, Ada Lovelace je napisala prvi skup instrukcija, čiji je cilj bio da omogući računanje Bernulijevih brojeva na mehaničkom kompjuteru. U čast ovoj inovativnoj ženi, Ministarstvo odbrane Sjedinjenih Američkih Država je 1980. godine novokreirani jezik za internu upotrebu nazvalo Ada.
Programski jezici
Kompjuter, program, programer i programiranje su međusobno povezani, zavisni pojmovi. Programer procesom koji se naziva programiranje stvara program koji kompjuteru govori šta je potrebno da uradi. Ipak, ovom zaokruženom procesu, kako bi bio potpun, nedostaje još jedan element. Reč je o jeziku kojim se programer tokom procesa stvaranja programa obraća mašini.
U svakodnevnom životu, ljudi se međusobno sporazumevaju korišćenjem prirodnih jezika (engl. natural languages), kao što su engleski, ruski, srpski itd. Jezik je ništa drugo do unapred utvrđen skup pravila, koja se primenjuju kako bi se misli artikulisale i prezentovale nekoj drugoj osobi. Na identičan način obavlja se i proces komunikacije sa kompjuterima. Ipak, kompjuteri ne razumeju nijednu vrstu prirodnih jezika koje ljudi koriste, te je stoga neophodno kompjuteru se obratiti na njegovom maternjem jeziku.
Srce svakog kompjutera jeste centralna procesorska jedinica (engl. Central Processing Unit, CPU) ili jednostavno procesor. Tokom svog rada, procesor koristi i razne druge komponente koje su sastavni deo računara, ali je ipak procesor komponenta sa kojom se direktno komunicira prilikom prosleđivanja instrukcija koje je potrebno da kompjuter izvrši. Tako je komunikacija sa kompjuterom zapravo razgovor sa centralnom procesorskom jedinicom.
CPU
Centralna procesorska jedinica srce je svakoga računara. Ona obavlja osnovne aritmetičke i logičke operacije koje su definisane instrukcijama unutar programa.
Tokom vremena, dizajn kompjuterskih procesora se umnogome menjao, ali je osnovni način njihovog funkcionisanja ostao nepromenjen. Svaki procesor ciklično obavlja aritmetičke i logičke operacije nad operandima. Tako su kompjuterski procesori, i pored ogromne strukturalne kompleksnosti, namenjeni obavljanju veoma jednostavnih operacija, kao što su sabiranje ili poređenje dva broja. Ipak, moderni procesori mogu obaviti milione takvih operacija u samo jednom deliću sekunde.
Kompjuterski procesor nije u stanju da razume jezik kojim se ljudi svakodnevno služe. Štaviše, procesor ne može razumeti ni bilo kakve kompleksnije naredbe. Sve što procesor razume jeste serija bitova, odnosno nula i jedinica, koji se prevode u određene instrukcije. Takva serija bitova, koja se interpretira u različite naredbe, naziva se mašinski jezik.
Mašinski jezik
Mašinski jezik je maternji jezik kompjutera, odnosno jedini jezik koji kompjuter razume. Programski kod ovakvog jezika sačinjen je iz niza nula i jedinica, a svaka od takvih cifara naziva se bit.
Binarni brojni sistem
U svakodnevnom životu, za predstavljanje brojeva koristi se dekadni brojni sistem, koji se sastoji iz deset cifara (1, 2, 3, 4, 5, 6, 7, 8, 9 i 0). Kombinovanjem ovih deset cifara formiraju se svi ostali brojevi. Ipak, pored decimalnog brojnog sistema, na koji smo svi navikli, u matematici postoji još nekoliko brojčanih sistema, odnosno načina na koje je moguće predstaviti brojeve. Jedan od takvih sistema posebno je značajan za digitalnu elektroniku i kompjutere. Reč je o binarnom brojnom sistemu.
Binarni brojni sistem poseduje samo dve cifre, 0 i 1. Zbog ove činjenice, često se kaže da je baza ovakvog sistema 2, dok je baza, na primer, decimalnog brojnog sistema 10.
Binarni brojni sistem osnovni je sistem za predstavljanje podataka u kompjuteru. Kompjuterski procesor rukuje isključivo binarnim podacima, dok se identičan format koristi i za čuvanje podataka unutar bilo koje vrste kompjuterske memorije. Korišćenje ovakvog brojčanog sistema u digitalnoj elektronici uslovljeno je osobinama samih elemenata od kojih su sačinjene kompjuterske komponente, prevashodno procesori. Moderni procesori sastavljeni su od stotina miliona poluprovodničkih elemenata (tranzistora), koji se ponašaju kao prekidači, koji mogu imati dva stanja (uključeno-isključeno, tačno-netačno, nula-jedan). Upravo zbog ovakvih strukturalnih osobina kompjuterskih elemenata, digitalna elektronika se zasniva na binarnom brojnom sistemu.
Iako možda na prvi pogled izgleda kao da je binarni brojni sistem prilično ograničen postojanjem samo dve cifre, to zapravo nije tako. Štaviše, bilo koji broj decimalnog brojnog sistema može se predstaviti kao binarni, i obrnuto.
Jedan broj predstavljen binarnim brojnim sistemom izgleda ovako:
1101
Kada biste prikazani broj videli izvan konteksta ove lekcije, verovatno biste ga pročitali kao hiljadu sto jedan. Zbog toga se često, prilikom pisanja brojeva specifičnih brojnih sistema, pribegava naznačavanju baze koju takav brojni sistem koristi. Da bismo naglasili da gore navedeni broj pripada binarnom sistemu, potrebno je napisati:
1101(2-subskript)
Kao što možete videti, unutar subskripta navodi se osnova brojnog sistema koji se koristi. Naravno, kao što je već rečeno, za binarni brojni sistem baza je 2, zbog postojanja samo dve cifre.
Prikazani binarni broj može se veoma lako prevesti u decimalni, odnosno u oblik koji je mnogo razumljiviji svima nama:
1101(2) = 1*20 + 0*21 + 1*22 + 1*23 = 13
Iz prikazanog računa lako se može razumeti logika koja se koristi pri konverziji binarnih brojeva u decimalne. Svaka cifra binarnog broja, počevši od krajnje desne, množi se sa brojem 2, stepenovanim u zavisnosti od pozicije koju takva cifra poseduje unutar kompletnog binarnog broja. Tako se prva cifra u prikazanom primeru množi se 20, druga sa 21, treća sa 22 i tako dalje. Nakon obavljanja računanja na ilustrovani način, utvrđuje se da binarni broj 1101 u decimalnom brojnom sistemu ima vrednost 13.
Brojeve decimalnog brojnog sistema takođe je moguće na lak način pretvoriti u binarne. Za obavljanje takvog posla koristi se nešto drugačija logika, koja podrazumeva deljenje decimalnog broja brojem dva i beleženjem ostataka. Kompletan postupak pretvaranja decimalnog broja 13 u binarni izgledao bi ovako:
13:2 = 6 i ostatak 1
6:2 = 3 i ostatak 0
3:2 = 1 i ostatak 1
1:2 = 0 i ostatak 1
Kao što možete videti iz ilustrovanog primera, decimalni broj koji je potrebno pretvoriti u binarni deli se brojem dva. Zatim se i svaki dobijeni količnik deli brojem dva. Ostatak prilikom deljenja bilo kojeg broja brojem dva može biti ili 0 ili 1. Tako dobijeni ostaci prilikom deljenja formiraju binarni broj. Vrednost binarnog broja se sklapa zdesna nalevo. Na kraju se može napisati sledeće:
1101(2) = 13(10)
Korišćenje mašinskog jezika za upućivanje instrukcija računaru, kao što i sami možete pretpostaviti, može biti veoma zahtevan i dugotrajan posao. Na primer, kako bi se obavilo jednostavno sabiranje brojeva 1234 i 4321 korišćenjem mašinskog jezika, neophodno je napisati kod ilustrovan slikom 1.5.
Prikazani set naredbi napisanih mašinskim jezikom predstavlja programiranje na najnižem mogućem nivou, odnosno direktno obraćanje kompjuterom procesoru. Prikazani skupovi bitova, odnosno nula i jedinica, predstavljaju sve neophodne instrukcije koje se upućuju kompjuteru kako bi on obavio posao koji je programer zamislio. U ovom trenutku se može postaviti sledeće pitanje – na koji način je programer znao kako izgledaju naredbe koje je potrebno da uputi kompjuteru kako bi on obavio sabiranje dva broja iz prikazanog primera?
Odgovor na ovo pitanje leži u pojmu set instrukcija (engl. instruction set). Svaki procesor poznaje unapred utvrđeni set instrukcija, koji je hardverski upisan specifičnom kombinacijom tranzistora unutar dela procesora koji je namenjen dekodiranju instrukcija. Ukoliko se procesoru uputi instrukcija koju ne poznaje, on je naravno neće izvršiti. Iz ovoga se može zaključiti da je mašinski jezik u potpunosti zavisan od procesora na kojem se izvršava. Jedan isti program napisan mašinskim kodom ne može se izvršiti na dva procesora različitih osobina.
Kako programer ne bi morao da svoj program piše iznova i iznova za svaki procesor koji postoji na tržištu, tokom vremena su razvijene različite arhitekture setova instrukcija (engl. instruction set architecture, ISA). Arhitektura seta instrukcija je samo apstrakcija, odnosno ugovor ili standard koji definiše kakve instrukcije je potrebno da kompjuter poznaje. Reč je o jednom od najznačajnijih ugovora u kompjuterskom svetu, koji omogućava izvršavanje identičnih programa na širokom spektru različitih tipova kompjutera. Postojanje arhitekture seta instrukcija, na primer, omogućava izvršavanje identičnog kompjuterskog programa na računaru sa 486 procesorom, ali i na modernom računaru sa Intel i7 procesorom poslednje generacije.
Arhitektura seta instrukcija i mikroarhitektura
S obzirom na to da je arhitektura seta instrukcija samo apstrakcija, odnosno standard, ona ni u kojoj meri ne određuje samu mikroarhitekturu, što je način na koji je procesor interno dizajniran, kada su u pitanju njegove fizičke komponente. U prilog ovome ide i činjenica da se jedan isti kompjuterski program bez ikakvih problema može izvršiti i na računaru sa AMD Ryzen, ali i na računaru sa Intel Kaby Lake procesorom. I pored velikih razlika u mikroarhitekturi između dve navedene familije procesora, obe dele identičnu arhitekturu seta instrukcija – x86.
U prethodnim redovima zaronili smo dublje u samu suštinu mašinskog jezika i načina na koji se procesoru u izvornom obliku upućuju instrukcije. Sve što je rečeno umnogome će vam pomoći u razumevanju pojmova koji slede. Nešto ranije, slikom 1.5. prikazan je primer koji ilustruje mašinski kod za obavljanje sabiranja dva broja. Zamislite sada situaciju u kojoj biste morali korišćenjem mašinskog jezika da napišete nešto složeniji program ili čak program koji bi se izvršavao na modernim kompjuterima. Sa pravom se može reći da bi takav posao iscrpeo i najupornijeg i najsmirenijeg programera, pa bi ishod uglavnom bio odustajanje. Stoga je do prvog koraka u uprošćavanju programerskog posla došlo 1949. godine, kada su različitim binarnim naredbama dodeljeni nešto razumljiviji nazivi koji su oslikavali njihovu svrhu. Na taj način stvoren je asemblerski jezik ili skraćeno asembler (engl. assembly language or assembler).
Koji je osnovni brojni sistem računara?
Asembler
Asembler, odnosno asemblerski jezik, često skraćeno imenovan kao asm, predstavlja programski jezik niskog nivoa, kod kojeg se osnovne programske naredbe pišu korišćenjem unapred utvrđenih reči, koje simbolizuju naredbu koju predstavljaju. Takve asemblerske jezičke konstrukcije veoma često se nazivaju i simboli, a sam asembler simboličkim jezikom. Korišćenjem naziva za pisanje programskih naredbi, asemblerski jezik omogućio je znatno ugodnije pisanje programa, s obzirom na to da korišćenjem asemblera programer nije morao pamtiti serije nula i jedinica, od kojih su sačinjene naredbe. Ipak, i pored toga što je značajno jednostavniji za razumevanje, asemblerski jezik funkcioniše na identičan način kao i mašinski, s obzirom na to da između asemblerskih i mašinskih naredbi skoro uvek postoji odnos jedan prema jedan.
Posao sabiranja brojeva 1234 i 4321, čije obavljanje je nešto ranije ilustrovano korišćenjem mašinskog jezika, ovoga puta upotrebom asemblerskog jezika može biti postignuto kao na slici 1.6.
Kao što možete videti, kod asemblerskog jezika značajno je razumljiviji od mašinskog. Umesto skupova nula i jedinica, sada su za upućivanje naredbi procesoru korišćene naredbe napisane engleskim rečima. Na primer, MOV znači premesti, odnosno upiši, a ADD saberi. AX, BX, CX i slično označavaju memorijske lokacije, odnosno procesorske registre koji se koriste za čitanje i upisivanje podataka. Kao što i sami možete zaključiti, pojava asemblerskog jezika predstavljala je ogroman korak napred za programersku profesiju.
Nešto ranije je rečeno da kompjuteri, odnosno procesorske jedinice, mogu da razumeju isključivo mašinski jezik. U prethodnim redovima smo govorili o asembleru, pa je pitanje koje se samo nameće sledeće – kako je to kompjuter preko noći naučio jedan novi jezik i postao sposoban da, pored mašinskog, razume i asemblerski kod?
Naravno, kompjuter nije naučio asemblerske naredbe, već se one, kako bi procesor bio u stanju da ih razume, pre izvršavanja prevode u oblik mašinskog koda. Svaka asemblerska naredba prevodi se u odgovarajući skup nula i jedinica. Takav posao obavlja program koji se naziva asembler. On je zadužen da asemblerske naredbe prevede u mašinski kod (slika 1.7).
Sa slike 1.7. možete videti na koji način asemblerski program obavlja pretvaranje instrukcija napisanih asemblerskim jezikom u mašinski kod procesora. Jasno je da je kompletna magija asemblerskog jezika smeštena u parčetu softvera koji se naziva asembler.
Baš kao i mašinski jezik, i asembler je u potpunosti zavisan od seta instrukcija koje procesor podržava. To znači da procesori različite arhitekture instrukcija zahtevaju postojanje različitih asemblerskih programa.
Pojava asemblera u velikoj meri je olakšala posao programerima. Ipak, to jednostavno nije bilo dovoljno kako bi se posao pisanja kompjuterskih programa još više uprostio, ubrzao i standardizovao. Stoga je apstrakcija podignuta jednu lestvicu više, stvaranjem programskih jezika višeg nivoa.
Jezici višeg nivoa
Obe vrste programskih jezika kojima su posvećeni redovi za nama ubrajaju se u jezike niskog nivoa. Mašinski i asemblerski jezik u potpunosti su zavisni od fizičkih osobina procesora na kojima se izvršavaju, te od programera u velikoj meri zahtevaju poznavanje same fizičke arhitekture računara. Zbog toga su jezici niskog nivoa veoma zahtevni za učenje i iziskuju dosta vremena za pisanje programa. Upravo zbog toga je tokom vremena kreiran veliki broj programskih jezika višeg nivoa, koji su apstrahovanjem fizičkih detalja kompjutera znatno uprostili i ubrzali posao pisanja programa.
Za razliku od jezika niskog nivoa, programski jezici višeg nivoa, u znatno većoj meri koriste elemente prirodnih jezika, uglavnom reči i skraćenice preuzete iz engleskog jezika, te na taj način unapređuju čitljivost i olakšavaju kreiranje programskog koda. Kako biste u najboljoj meri razumeli prednost jezika višeg nova, pogledaćemo kako bi izgledao jednostavan program za sabiranje dva broja, napisan jednim od jezika višeg nivoa (slika 1.8).
Realizacija identičnog problema, koja je već ilustrovana korišćenjem mašinskog i asemblerskog jezika, u prikazanom primeru je postignuta korišćenjem programskog jezika C, jednog od jezika višeg nivoa. Ono što odmah možete primetiti jeste značajno kraći, jednostavniji i razumljiviji programski kod.
Pored redukovanja kompleksnosti, jezici višeg nivoa poseduju i različite sisteme koji u potpunosti oslobađaju programera potrebe rukovanja određenim aspektima izvršavanja programa. Na primer, većina programskih jezika višeg nivoa automatski upravlja alokacijom i oslobađanjem memorije koju program tokom izvršavanja koristi.
Odnos između kompjutera i jezika nižeg i višeg nivoa može biti ilustrovan kao na slici 1.9.
Kao što sa slike 1.9. možete videti, kretanjem od hardvera ka jezicima višeg nivoa, povećava se apstrakcija, a smanjuje kompleksnost. To praktično znači da jezike višeg nivoa karakteriše viši stepen apstrakcije, a mašinski jezik značajno veća kompleksnost.
Tokom vremena napravljen je veliki broj programskih jezika višeg nivoa. Ukoliko danas počinjete da učite programiranje, gotovo sigurno će to biti učenje nekog od jezika višeg nivoa. Takođe, različiti jezici višeg nivoa se umnogome međusobno razlikuju, po mogućnostima, performansama, sintaksi i nivou apstrakcije. Neki jezici višeg nivoa omogućavaju i izlet u low-level programiranje, tako što dozvoljavaju da delovi kompjuterskog programa budu napisani asemblerskim jezikom konkretnog tipa procesora.
Sve prednosti koje jezici višeg nivoa donose na neki način moraju biti realizovane. S obzirom na to da je jedini jezik koji kompjuter razume mašinski, jasno je da programi napisani jezicima višeg nivoa na neki način moraju biti prevedeni u mašinski jezik pre nego što ih kompjuter izvrši, baš kao što je to bio slučaj i sa asemblerskim kodom. Programski jezici višeg nivoa za obavljanje takvog posla koriste dve veoma značajne komponente modernog programiranja – kompajlere i interpretere.
Kompajleri i interpreteri su međusobno nezavisne komponente programskih jezika višeg nivoa, koje identičan posao prevođenja koda viših jezika u mašinski obavljaju na različite načine.
Kompajler (engl. compiler) je kompjuterski program čija je osnovna svrha generisanje drugih kompjuterskih programa. Kompajler prevodi izvorni kod programa napisanih jezicima višeg nivoa u mašinski, kako bi takav kod mogao kompjuter da izvrši. Posao koji kompajler obavlja drugačije se naziva kompajliranje, a jezici koji koriste kompajler - kompajlirani jezici. Posao kompajliranja obavlja se odjednom, pre nego što je potrebno da se određeni program napisan višim jezikom izvrši na nekom računaru. Rezultat kompajliranja jeste izvršni fajl sa sadržajem napisanim mašinskim kodom.
Interpreter obavlja identičan posao kao i kompajler, ali na nešto drugačiji način. Za razliku od kompajlera, interpreter obavlja prevođenje manjih delova izvornog koda, i to u toku njegovog izvršavanja. Tako korišćenjem interpretera nije potrebno prevesti kompletan program, već se prevođenje obavlja u delovima, prilikom izvršavanja.
Razlike između kompajliranja i interpretiranja ilustrovane su slikom 1.10.
Kao što možete videti, procesom kompajliranja vrši se generisanje potpuno novog fajla koji u sebi sadrži kompletan mašinski kod prevedenog programa. Jednom kompajliran, program se može izvršavati proizvoljan broj puta na različitim računarima. Sa druge strane, procesom interpretiranja, ne proizvodi se mašinski kod koji predstavlja kompletan program koji je potrebno izvršiti. Interpretiranje se obavlja iz više koraka, instrukciju po instrukciju, tako da se mašinski kod generiše iz delova, koje odmah nakon prevođenja izvršava kompjuter.
Proces interpretiranja omogućava brže inicijalno pokretanje programa, zato što se ne obavlja prevođenje kompletnog izvornog koda odjednom. Sa druge strane, kada se jednom obavi proces kompajliranja izvornog koda jezika višeg nivoa u mašinski, svako sledeće pokretanje i izvršavanje je značajno brže, s obzirom na to da program već postoji u mašinskom obliku. Proces kompajliranja poseduje još jednu prednost u odnosu na interpretiranje. S obzirom na to da se kompletan izvorni kod prevodi pre izvršavanja, kompajler poseduje mogućnost provere napisanog izvornog koda. Ukoliko izvorni kod sadrži neku sintaksnu grešku, kompajler neće biti u stanju da takav program prevede, pa samim tim program neće ni biti izvršen. Na taj način se sprečava izvršavanje programa koji u svom izvornom kodu poseduju neku grešku. Sa druge strane, detekcija sintaksnih grešaka nije moguća prilikom procesa interpretiranja, s obzirom na to da interpreter prevodi kod iz delova, instrukciju po instrukciju, i to tokom njegovog izvršavanja. Ukoliko izvorni kod koji se interpretira sadrži grešku, do nje će sasvim sigurno doći tokom izvršavanja samog programa.
Programski jezik je samo specifikacija
Moderni programski jezici teško se mogu podeliti na kompajlirane i interpretirane. S obzirom na to da je određeni programski jezik samo specifikacija, konkretnim procesom implementacije jezika utvrđuje se način na koji će on biti preveden u mašinski. To praktično znači da skoro svaki jezik može biti i interpretiran i kompajliran, a da konkretna metoda prevođenja zavisi od onoga ko bude kreirao implementaciju konkretnog jezika. Programski jezik nije ništa drugo do skup određenih pravila koja su unapred dogovorena. Takav skup pravila određuje sintaksu jezika, koja na kraju definiše izgled i strukturu koda koju će programeri pisati. Da bi programski jezik višeg nivoa uistinu i postao živ, neophodno je napisati programsku komponentu koja će obavljati prevođenje koda takvog jezika u mašinski. Prilikom realizacije takve komponente potrebno je konkretno realizovati sva ona jezička pravila koja su prethodno dogovorena specifikacijom, objedinjenom programskim jezikom.
Prevođenje modernih programskih jezika višeg nivoa često se obavlja kombinovanjem dve opisane tehnike, odnosno kombinovanjem kompajliranja i interpretiranja. Implementacije nekih jezika, sa druge strane, zasnivaju se isključivo na jednoj od dve pomenute metode prevođenja izvornog koda. Na primer, programski jezik C dizajniran je prevashodno kako bi bio kompajliran, što je i najčešći slučaj kod njegovih implementacija. Ista situacija postoji i kod programskih jezika Objective C i Swift, jezika koji se koriste za kreiranje programa za uređaje kompanije Apple. S druge strane, veoma popularan programski jezik višeg nivoa koji se zove JavaScript jeste primer interpretiranog programskog jezika. Jezici kao što su C#, Java i PHP su primarno kompajlirani, ali proces njihovog prevođenja takođe uključuje i neke osobine interpretiranja.
Programski jezici za rukovanje podacima
Programski jezici koji su spomenuti na kraju prethodnog poglavlja mogu se smatrati jezicima opšte namene (engl. general-purpose programming language). To su jezici koji se mogu koristiti za rešavanje širokog skupa problema. Pored ovakvih jezika, postoje i jezici specifične namene (engl. domain-specific language). Takvi jezici namenjeni su rešavanju određenog skupa problema prilikom kreiranja kompjuterskih programa. Idealan primer takvih jezika jesu jezici koji se danas intenzivno koriste za rukovanje podacima. Najpopularniji jezik takve vrste je SQL (engl. Structured Query Language). Danas ovaj jezik postoji u obliku velikog broja različitih implementacija (MySQL, Microsoft SQL, PostgreSQL, Oracle SQL, SQLite), pa se može reći da je jedan od najznačajnijih specifičnih jezika, namenjenih rukovanju podacima. Teško da postoji osoba koja se danas smatra programerom a da dobro ne poznaje ovaj jezik.
Moderni programski jezici u širokoj upotrebi
U prethodnim redovima spomenuti su neki od programskih jezika višeg nivoa koji su danas u širokoj upotrebi. Veoma zahtevan posao jeste izmeriti popularnost nekog jezika, s obzirom na to da se takva karakteristika može posmatrati kroz prizmu mnogih različitih parametara (broja napisanih programa, veličine programerske zajednice, količine dostupnih pozicija novih radnih mesta itd.). Stoga ćemo se u ovom trenutku uzdržati od spekulacija o tome koji je programski jezik najpopularniji i najkorišćeniji, jer tako nešto jednostavno nije moguće utvrditi. Ono što ipak sa sigurnošću možemo reći jeste koji su to sve jezici danas u intenzivnoj upotrebi, bez namere da bilo koji jezik ni na koji način rangiramo. Pregled najpopularnijih jezika današnjice dat je u tabeli 1.1.
Kako bismo rekapitulirali sve ono što je u ovoj lekciji rečeno o programskim jezicima, data je slika 1.11, koja ilustruje njihov razvoj tokom vremena.
Početak uzbudljivog putovanja
Čitajući ovu lekciju, mogli ste da naslutite samo delić uzbudljivosti koju krije svet programiranja. Naravno, posle ovolike količine informacija, možda se osećate zbunjeno. Takav osećaj je potpuno normalan i karakterističan za svakoga ko ulazi u lavirintni svet programiranja. Ipak, razloga za brigu nema s obzirom na to da je nastavak ovog programa koncipiran tako da vam na sistematičan i postupan način omogući upoznavanje sveta programiranja. Uzbudljivo putovanje može da počne!
-
Izvor: https://en.wikipedia.org/wiki/Ada_Lovelace ↩