1.2 Računari i programski jezici - ★★ Fog Developer ★★

Najnovije

☆☆ Blog za ljude koji znaju šta žele ☆☆

28. 02. 2018.

1.2 Računari i programski jezici

1.2 - Računari i programski jezici

Kompjuteri su u današnje vreme veoma zastupljeni u svim sferama života. Kod nas se, umesto izraza kompjuter, paralelno koristi i reč računar. Poznavanje osnovnih pojmova u vezi računara je odavno izašlo iz domena nauke koja se naziva informatika u domen opšte kulture, pri čemu poznavanje pojmova te opšte kulture najčešće nema veze s' mozgom, tj usvojena su neka pogrešna shvatanja u vezi samih računara i njihovog funkcionisanja, čime se uspešno obavija velom tajnovitosti sve ono što je u današnjem vremenu svakodnevno kako sredstvo rada, tako i sredstvo za ostvarivanje bilo koje ljudske potrebe. A kompjuteri su danas svuda oko nas. Makar tako ljudi kažu, ja nisam zagledao 😀.

Najvažnije stvari o računarima koje se tiču nas

Računari su sastavljeni iz hardvera i softvera. Sama mašina, tj fizička komponenta računara se naziva hardver (od engleske reči hardware). Da bi ste shvatili šta to predstavlja potreban je jednostavan primer: to je ono što izlazi iz fabrike. Dakle, hardver je kućište računara, procesor, baterija na telefonu, ekran lap topa itd. Sam po sebi, hardver ništa ne znači, jer da bi taj hardver radio išta korisno potreban je softver, oko koga se ovaj tutorijal i vrti, pa ćemo o njemu malo kasnije više reći.
Najvažniji hardver u računaru su njegov procesor i memorija:
  • Procesor računara je njegov glavni i nezaobilazni deo - on je zadužen za obradu svih podataka, i naziva se CPU. Kako se tehnologija razvijala, tako su se procesori rasterećivali stvari vezanih za prikaz grafike, i stvarali su se procesori čiji je jedini zadatak da obrađuju grafičke elemente, i njih nazivamo GPU. U prvo vreme su se ovakvi procesori ugrađivali u grafičke kartice, ali sa pojavom mobilnih uređaja i procesora sa više jezgara, nastaju hibridni procesori koji su u stvari CPU, ali imaju u sebi ugrađen zaseban GPU.
  • Memorija je takođe glavni i nezaobilazni deo računara. U njoj se skladište svi podaci koji su potrebni procesoru da bi radio. Od podataka ona može da skladišti samo brojeve, i to 0 i 1. Ona je podeljena na blokove. Svaki blok može u sebi da sadrži neku informaciju i ima neku svoju numeričku adresu, koja počinje od 0 pa do broja koji označava njen kapacitet. Adrese blokova služe procesoru kako bi on u svakom trenutku mogao da pristupi bilo kojem bloku i informacijama koje se u tom bloku nalaze kako bi ih promenio. Ovo znači da su informacije koje se nalaze u memoriji prilično promenljive u vremenu.
Ranije sam napisao da ljudi vole da govore kako su "računari svuda". Pretpostavljam da time najčešće misle na neki vid procesora i memorije koji se danas stavljaju u sve i svašta. Zašto? Zato što je procesor onaj "glavni baja" koji pokreće i upravlja svim ostalim komponentama unutar računara a da bi radio potrebne su mu sluge. Te njegove sluge su u stvari samo informacije iz memorije. Dakle, procesori i memorije se nalaze, između ostalog, u računarima (u klasičnom smislu gde imate kućište, monitor, tastaturu, miš... Drugim rečima, vrsta koja isčezava), mobilni uređaji (telefoni, tableti, pametni satovi. Drugim rečima - vrsta čije vreme tek dolazi), pametni televizori, frižideri, pegle, automobili, roboti i sl. Da bi ste razumeli ovaj tutorijal, potrebno je da se modifikuje (i nadogradi) neko znanje opšte kulture sa (za neke ljude) novim informacijama.
U trenutku kada se odlučujete da li da kupujete neki uređaj prva stvar koju ćete pogledati je njegova brzina. U današnje vreme su procesori koji pokreću uređaje izuzetno brzi, a kako vreme bude prolazilo pojavljivaće se još brži (nasuprot toga, ono što ste kupili će postajati sve sporije - to je činjenica koju ni na koji način ne možete da utičete). Mnogo ljudi će prilikom upoređivanja računara kupovati onaj koji je u tom trenutku najbrži, jer se vode mitom "poznavanja opšte kulture" da je brzina ono što im treba. Pri tom često kupe neki stariji (i skuplji) tip uređaja, što ih u periodu od par godina može dovesti u jednu čudnu situaciju: računar koji je bio sporiji od njihovog, ali je bio noviji sad pokreće nešto, a njihov to ne može!!! Zapanjujuće? Zapravo nije, sasvim je očekivano. Brzina procesora jeste jedan od najbitnijih faktora, ali nije jedini. Sasvim suprotno mišljenje važi za memoriju, gde se ljudi vode izrekom "više je bolje", zaboravljajući da je i njena brzina prilično važan faktor.
Jedan od najvažnijih faktora nam je - skup instrukcija koji određeni tip procesora podržava. Šta ovo u stvari znači? Procesori mogu da razumeju samo ograničen skup naredbi (instrukcija), i njima je potrebno tačno naznačiti šta da rade, u suprotnom su prilično beskorisni (dobro, hajde... mogu služiti kao ukras).
Program, reč čiji su sinonimi aplikacija i softver, je skup instrukcija koje procesoru (i računaru) precizno govore šta treba da radi u nekom trenutku. Budući da želimo da radimo različite stvari, mi u nekim trenucima koristimo različite programe kako bi smo zadovoljili svoje potrebe.  Takođe, programe možemo da brišemo ili dodajemo. Zbog toga se za programe kaže da su promenljive komponente računara. Iz te osobine je proistekla reč softver (engl. software), Skup svih programa na računaru koji omogućavaju njegovu upotrebu nazivamo operativni sistem.
Iz svega ovoga treba da razumete samo da svaki računar, da bi mogao da radi i vrši interakciju sa korisnikom, mora biti sastavljen od nekog hardvera. Na primer, da bi ste čitali ovaj blog potreban Vam je uređaj koji ima ekran, internet karticu, procesor koji obrađuje podatke, memoriju u koju skladišti te podatke, uređaje za Vašu interakciju (tastatura, miš, tač skrin...) i neki vid grafičkog sistema koji obrađene podatke šalje na ekran. Takođe, taj hardver mora u sebi da sadrži neki operativni sistem i programe koji obrađuju informacije kako bi Vam ih prikazale.

Mašinski jezik

Procesori nisu u stanju da razumeju ljude. Možda će Vam delovati čudno ali oni ne mogu da razumeju ni programske jezike, pa samim tim ni C++. Oni su konstruisani i napravljeni tako da razumeju samo veoma mali i ograničen skup naredbi koji se naziva mašinski kod (sinonimi su mašinski jezik ili skup instrukcija). U ovom tutorijalu se nećemo baviti mašinskim jezikom, ali je bitno znati par stvari:
  • Svaka instrukcija mašinskog jezika je sastavljena od niza binarnih cifara, što znači da se sastoji od podataka od kojih svaki može biti samo 0 ili 1. Zašto je to tako? Zato što mašine mogu samo da konstatuju da li ima struje (1) ili nema struje (0), što ukratko znači da oni mogu samo registruje neko naelektrisanje. Kako je 1 ili 0 informacija, tj njen najmanji i osnovni deo, onda taj najmanji deo nazivamo bit (što je skraćenica od engleskih reči binary digit - binarna cifra). 
  • Procesori se međusobno razlikuju po načinu na koji su napravljeni i skupovima instrukcija koje su tom prilikom u njih ugrađeni (što se ukratko kaže da se razlikuju po arhitekturi procesora).  Procesori imaju različite arhitekture zato što su namenjeni za različite stvari. Nema potrebe da se na isti način prave procesori namenjeni za obične računare, mobilne telefone ili npr složene proračune (kao npr super kompjuteri). Ovo znači da različiti tipovi procesora mogu izvršavati različite skupove instrukcija.
  • Neki procesori imaju instrukcije koje su fiksne dužine (npr 16 ili 32 bita) ali većina savremenih CPU-ova ima instrukcije koje mogu biti promjenjive dužine. Primer instrukcije mašinskog jezika za x86 arhitekturu procesora je: 10110000 01100001. Kao što vidimo, ovako napisana instrukcija za nas, kao ljudska bića, nema nikakvo značenje niti ima nekog smisla.
  • Svaki takav skup binarnih cifara procesor razume kao naredbu koja mu govori da uradi tačno određeni posao. Na primer: instrukcija može da znači da procesor treba da preuzme broj iz neke lokacije u memoriji, sledeća instrukcija mu kaže da uporedi taj broj sa nekim drugim iz određene memorijske lokacije, zatim da sabere ta dva broja i da ostavi rezultat u navedenu memorijsku lokaciju.
  • Suštinski, sve što bilo koji procesor može da radi je da preuzima podatke iz memorije, da vrši neke matematičke operacije sa podacima i da vraća (skladišti) podatke u memoriju.
  • Kao što sam već napomenuo, različite vrste procesora obično imaju različite skupove instrukcija, tako da naredbe koje se mogu izvršiti na Intel Pentium CPU neće raditi na ARM procesoru. Nekada davno, u vremenu kada su se računari tek pojavili, programeri su morali pisati svoje programe u mašinskom jeziku, što je bio težak i dugotrajan proces.
  • Znaćete da ste pravi programer tek u trenutku kada budete mogli pomoću čekića i eksera da direktno ukucavate mašinske instrukcije u svoj procesor. Do tog trenutka ste običan amater 😀
  • Prethodna stavka je samo šala koja se pojavljuje kao odgovor na često pitanje koje umeju da postavljaju početnici: "Koji programski jezik koriste pravi programeri?"

Asemblerski jezik

Da bi se ljudima olakšalo programiranje računara izmišljen je asemblerski jezik. U njemu je svaka instrukcija označena pomoću nekog kratkog imena, koje je bilo kom čoveku mnogo lakše da koristi umesto besmislenog kucanja skupa brojeva 0 i 1 (tj bitova) u mašinskom jeziku. Takođe, u asemblerskom kodu je moguće davati i imena podacima koji se nalaze u memoriji, koji su po svojoj prirodi promenljivi. U mašinskom jeziku je to moralo biti tačno specifikovano upisivanjem digitalnog broja koji predstavlja lokaciju u memoriji. Za programere je to značajno jer se programi mogu lakše pisati i kasnije čitati.
Međutim, CPU ne razume asemblerski jezik. Zbog toga, asemblerski jezik mora biti preveden na mašinski jezik. Da bi se to postiglo osmišljen je program koji to automatski radi. Takvi programi, koji prevode program napisan u jednom obliku u program koji računar razume se nazivaju programi prevodioci ili kompajleri (od engleske reči compiler). Kompajler asemblerskog jezika se naziva prosto - asembler.
Asemblerski jezici imaju odličnu osobinu - veoma brzo se izvršavaju i zbog toga se asembler koristi i dan danas, naravno, u slučajevima kada je brzina od suštinske važnosti. Ako se pitate odakle potiče ta brzina programa pisanih u asemblerskim jezicima, treba da znate i jednu njihovu lošu osobinu: određeni asemblerski jezik je usko povezan sa tačno određenom arhitekturom procesora. To znači da programi koji su pisani za jedan CPU neće raditi na drugom CPU koji ima različitu arhitekturu. Osim ove, postoji još jedan veliki problem vezan za asemblerske jezike: čak i za najjednostavnije zadatke pisanje programa u asemblerskom jeziku zahteva unošenje velikog broja naredbi i zbog toga takvi programi nisu pregledni. Evo kako izgleda jedna instrukcija u asemblerskom jeziku: mov ah,4ch

Programski jezici višeg nivoa

Kako bi se dodatno olakšao proces pisanja softvera razvijaju se programski jezici višeg nivoa. C, Python, C++, Java, Perl i mnogi drugi su jezici višeg (visokog) nivoa (engl. high level). Ovi jezici omogućavaju pojednostavljen proces programiranja jer pomoću njih programer ne mora da misli na detalje koji nisu u njegovom domenu, pri čemu se to najviše odnosi na to da on ne mora da obraća pažnju na arhitekturu procesora na kom će se taj program izvršavati. Pisanje programa u jezicima višeg nivoa omogućava programeru i lakšu distribuciju programa, jer programi pisani u asemblerskim jezicima ne mogu da se izvršavaju na drugoj mašini, a oni koji su pisani višim jezicima se mogu izvršavati na bilo kojoj sličnoj mašini.
Sve ovo znači da kada želite da kreirate program dovoljno je da osmislite sve neophodne korake koje želite da računar radi, zatim upišete te korake pomoću sintakse programskog jezika i nakon toga je potrebno uraditi još par koraka pomoću kojih možete taj program prodavati, slati drugim ljudima ili prijateljima, bez bojazni da on kod njih neće raditi.
Programer koji piše programe u jezicima visokog nivoa, svoj rad upisuje u jedan ili više fajlova (datoteka). Sadržaj tog fajla (ili fajlova) su naredbe napisane na programskom jeziku a one su raspoređene u nekom logičkom redosledu koji je potreben da bi računar radio ono što se od njega traži. Od sada pa nadalje sadržaj tog fajla tj naredbe koje se nalaze u njemu ćemo nazivati kod, od engleske reči code, a sinonim će biti i izvorni kod od engleske reči source code.
Ovako napisani programi su razumljivi ljudima ali ne i mašinama. Zbog toga oni moraju biti prevedeni u oblik koji procesor razume, kako bi on mogao pratiti zadata uputstva i raditi neki posao. Postoji više načina na koji možmo da prevodimo naredbe pisane u višem programskom jeziku u kod koji razume procesor. Načini prevođenja zavise od samog jezika koji koristimo, i izdvajaju se dva: kompajliranje i interpretiranje. Po ovim načinima se dele i programski jezici visokog nivoa.

Princip rada kompajliranih programa

Već sam rekao da je kompajler (engl compiler - kod nas se koristi još i izraz programski prevodilac) program koji isčitava izvorni kod i od njega stvara program koji je sastavljen od instrukcija koje CPU razume. Proces izrade gotovih programa pomoću kompajlera se naziva kompajliranje. Nakon kompajliranja mi dobijamo izvršni fajl (engl. executable, a kao sinonim u običnom govoru se ovo jednostavno naziva - program).
Kada se izvorni kod jednom prevede u izvršni fajl, nama više nije potreban kompajler da bi smo pokretali dobijeni program. Ovako kreiran program možemo da prenesemo na neku drugu mašinu i on će i tamo da radi na isti način kao i na mašini na kojoj je kreiran. Postoji konvencija da se ovako dobijeni izvršni fajlovi (programi) prepoznaju putem njihove ekstenzije, kao kod Windows operativnih sistemima gde te fajlove prepoznajemo po ekstenziji .exe. Međutim, na drugim operativnim sistemima programima nisu potrebne ekstenzije.
Na slici je prikazan pojednostavljen prikaz postupka kompajliranja za koju kažemo da je prva faza ili izrada programa:
Program dobijen kompajliranjem se može distribuirati (prenositi) i pokretati na sličnim sistemima.  Ta distribucija i pokrećanje programa se naziva druga faza ili život programa. Pojednostavljeno pokretanje programa izgleda ovako:
Vidimo da je kod viših jezika kojima je potrebno kompajliranje razdvojeno kreiranje programa od njegovog izvršavanja. Kreiranje je posao programera, dok je proces izvršavanja predviđen za onoga ko konzumira program. Ukoliko se kod korisnika programa pojavi neka greška, programer mora da je otkrije u izvornim datotekama, a zatim da ih opet kompajlira kako bi dobio drugu verziju istog programa. Iako ovo deluje kao poteškoća prilikom izrade programa, to nije tako. Benefit se sastoji u više stvari: dobijeni izvršni fajl je razumljiv procesoru, pošto ga procesor razume, biće opterećen samo instrukcijama programa a samim tim se program brže izvršava. Sem ovoga, izvršni fajl nije razumljiv ljudima, što znači da ga ljudine mogu menjati ili otkriti način na koji ste nešto uradili. Naravno da postoje alatke koje mogu omogućiti ostatku sveta da saznaju kako ste napisali svoj program i taj proces se naziva dekompajliranje, ali to je domen stručnjaka iz sigurnosti sistema i nije predmet ovog tutorijala.
C++ spada u ovu grupu jezika. Sem njega tu su i C, Pascal, Fortrran, Ada, kao i mnogi drugi.

Princip rada interpretiranih jezika

Interpreter je program koji izvršava izvorni kôd u nekom trenutku. Kada programiramo u interpretiranim jezicima mi ćemo, umesto da kompajliramo naše izvorne datoteke u mašinski kod, da distribuiramo naš program u vidu tih izvornih datoteka, koje će krajnji korisnik da pokreće pomoću interpretera koji je instaliran na njegovoj mašini.
Interpreteri su mnogo fleksibilniji i zgodniji za rad jer programer može da promeni svoj izvorni kod (npr prilikom ispravljanja grešaka ili dodavanja novih mogućnosti), a pri tome ne mora da prolazi kroz proces kompajliranja (koji u složenim projektima ume da bude veoma dug). Ovo znači da programiranje u interpretiranim jezicima nije razdvojeno na faze.
Ovo je pozitivna osobina svih interpretiranih jezika, ali na žalost, ona dovodi do toga da je sam proces izvršavanja programa manje efikasan, jer se svaki put u vremenu u kom se program izvršava  mora raditi i interpretacija. Ovo znači da je procesor opterećen i interpreterom i našim programom u isto vreme. To znači da je procesoru potrebno više vremena da uradi isti posao nego u slučaju kada je opterećen samo izvršnim fajlom.
Takođe, loša osobina je i ta da, ukoliko distribuiramo naš rad, klijentu je uvek potreban adekvatan interpreter kako bi bio u mogućnosti da pokreće naš program. Sam klijent, tj čovek je u mogućnosti da vidi naš kod, te je u stanju da ga menja (ukoliko postoji potreba za tim). Mi ne možemo sakriti način na koji smo pisali program, niti naš način rešavanja problema u programu.
Na slici je predstavljen pojednostavljeni prikaz procesa interpretacije:
Obično jezike koji se interpretiraju nazivamo i scripting jezici jer se sa njima može mnogo postići u kratkom vremenu (npr podešavanje sistema, web sajta i sl.). Neki od interpretiranih jezika su Python, Perl, Basic, JavaScript i drugi.
Mnogi početnici mešaju "babe i žabe" misleći da su JavaScript i Java isti jezici. Oni sem sličnosti u imenu gotovo da i nemaju ništa zajedničko. Java je karakteristična po tome što je ona mešavina ove dve grupe jezika. Naime, izvorni kod u Javi se kompajlira, ali rezultat tog procesa je program koji ne može samostalno da se izvršava, već mora biti interpretiran kroz Java virtuelnu mašinu (kako zanimljiv naziv za interpreter, zar ne?). JavaScript je, sa druge strane, čisto interpretirani jezik koji se  danas najviše koristi prilikom izrade web sajtova. Njegov interpreter je sam internet brauzer!
Svi ovi jezici visokok nivoa imaju nekoliko pozitivnih osobina.
Prva je svakako ta da je čoveku lako da pročita ili napiše kod. Na primer, jedna naredba u C/C++ izgleda ovako: int meseci = 12;
Druga osobina je da za isti zadatak je u njima potrebno odkucati mnogo manje naredbi u odnosu na jezike nižeg nivoa. U C/C++ možemo pomoću samo jednog reda napisati nešto ovako: inflacija_proc = nova_cena * 100 / stara_cena;. U asemblerskom jeziku bi se  to isto moralo napisati pomoću 5-6 različitih naredbi.
Sledeća pozitivna osobina se tiče smeštanja podataka u memoriju. U jezicima visokog nivoa mi ne moramo da se zamaramo detaljima kao što su smeštanje podataka u CPU registar. O tome umesto nas brinu kompajler ili interpreter.
Ipak, najznačajnija osobina jezika višeg nivoa je da su programi kreirani u njima prenosivi tj da se mogu izvršavati na različitim arhitekturama procesora. Od ovog pravila postoje neki izuzetci: mnogi operativni sistemi (kao što je npr Microsoft Windows) sadrže neke specifične funkcije koje možemo koristiti u našem kodu, a koje nisu dostupne u drugim operativnim sistemima. Te funkcije omogućavaju programerima da mnogo lakše pišu specifične programe jer mogu da koriste resurse sistema predviđene za tražene zadatke. Ali tako napisan program će se moći izvršavati samo na tom sistemu! To znači da taj program više nije prenosan (portabl).
Ako u ovom tutorijalu, na nekom mestu budem morao da koristim neke specifične funkcionalnosti operativnog sistema, ispod primera će biti označeno na kojoj platformi se primer može pokretati.
Nadam se da su Vam sada mnoge stvari jasnije, da ste saznali nešto novo i da ste spremni za sledeći deo tutorijala.

Broj komentara: 10:

  1. What a stuff of un-ambiguity and preserveness of precious knowledge concerning unexpected feelings.

    OdgovoriIzbriši
  2. You actually make it seem so easy with your presentation but I find this matter
    to be actually something that I think I would never understand.

    It seems too complex and very broad for me.
    I am looking forward for your next post, I'll try to get the hang of it!

    OdgovoriIzbriši
    Odgovori
    1. I'm pretty busy right now, so I can't administrate blog in a few days.

      Izbriši
  3. Hmm it seems like your site ate my first comment (it was extremely long)
    so I guess I'll just sum it up what I wrote and say,
    I'm thoroughly enjoying your blog. I too am an aspiring
    blog blogger but I'm still new to the whole
    thing. Do you have any recommendations for inexperienced blog writers?
    I'd genuinely appreciate it.

    OdgovoriIzbriši
    Odgovori
    1. Yes, I have! Just write, write and write. There is no other way.

      Izbriši
  4. I got this website from my buddy who informed me concerning this web site and now this time I am visiting
    this site and reading very informative posts at this place.

    OdgovoriIzbriši
  5. Unquestionably imagine that which you stated. Your favorite reason appeared to be at the net the easiest thing to consider
    of. I say to you, I certainly get annoyed while other people consider worries that they just don't recognise
    about. You managed to hit the nail upon the top and also
    outlined out the whole thing with no need side-effects , folks could take a signal.
    Will probably be again to get more. Thanks

    OdgovoriIzbriši
  6. No matter if some one searches for his necessary thing,
    so he/she needs to be available that in detail,
    therefore that thing is maintained over here.

    OdgovoriIzbriši
  7. It's remarkable to go to see this site and reading the views of all colleagues regarding this article,
    while I am also zealous of getting experience.

    OdgovoriIzbriši