Programski jezik često se definira kao: „umjetni jezik osmišljen kako bi omogućio čovjeku da daje upute računalu“. Računala ne mogu razumjeti engleski, arapski ili kineski jezik, a premda ljudi u teoriji mogu naučiti binarni kod (osnovni jezik računala), gotovo nitko ga ne zna. Zato nam je potreban nekakav posrednik za komunikaciju, koji zovemo programski jezici.
Kao što smo vidjeli u prvom poglavlju, programeri stvaraju programske jezike i softverska rješenja od samih početaka računalnih sustava. U ovom dijelu saznat ćete kako su se programski jezici razvijali i što možete s njima učiniti.
Programski jezici niske razine
U samim počecima računala, asemblerski kod i binarni kod bili su glavni jezici za komunikaciju s računalima. Oni su im govorili da izvrše naredbe pretvarajući podatke u jedinice i nule, odnosno binarni kod.
Strojni kod, koji se još naziva i binarni jezik, niz je jedinica i nula koji predstavlja naredbu za procesor računala (CPU). Asemblerski jezik je čitljiviji od binarnog jezika. Asembler koristi mnemoničke kodove za označavanje uputa strojnog koda, umjesto da izravno koristi numeričke vrijednosti uputa.
Mogli bismo pomisliti da ovi jezici više nisu važni jer nisu vidljivi većini korisnika računala, ali suvremena računala zapravo još uvijek koriste te jezike. To su osnove svakog računala. Svaki procesor može izvršiti određeni niz uputa koji odgovara marki ili arhitekturi tog procesora.
Ali zašto bi netko uopće htio naučiti jezike niske razine i programiranje niske razine? Iz različitih razloga, uključujući ove:
Neki dijelovi operativnih sustava, pa čak i virusa, pisani su asemblerskim jezikom.
Ako se želite baviti programiranjem GPU-a s pomoću jezika visoke razine kao što je CUDA ili OpenCL, morate znati programiranje niske razine.
Ako želite postati bolji u strojnom učenju, možete optimizirati svoj kod s pomoću asemblerskog jezika kako biste učinkovitije upravljali memorijom.
Ako želite detaljno naučiti kako funkcioniraju operativni sustavi, koristit će vam poznavanje asemblerskog jezika. Asemblerski jezik obično se koristi u kodu za pokretanje sustava, odnosno kodu niske razine koji pokreće i testira hardver sustava prije pokretanja operativnog sustava.
Asemblerski jezik koristan je u obrnutom inženjeringu. Mnogi programi distribuiraju se samo u obliku strojnog koda koji se lako može prevesti u asemblerski jezik s pomoću programa za dohvaćanje asemblerskog koda (engl. disassembler), ali se teže prevodi u jezik više razine s pomoću dekompilatora.
Sada kada smo vidjeli kako i zašto možete naučiti više o jezicima niske razine, spremni smo za učenje o jezicima visoke razine.
Programski jezici visoke razine
Znamo da računalo razumije binarni kod, ali ne razumijemo ga mi sami ili ga razumije samo šačica ljudi na svijetu.
Krajem 1950-ih korisnici računala (uglavnom znanstvenici i velika poduzeća) često su morali sami izraditi vlastiti softver. Nedostatak tog procesa bio je da su svako poduzeće ili laboratorij morali imati osobu koja zna računalno programiranje, a softver se izrađivao samo za jedan točno određeni računalni sustav, zbog čega je bilo nemoguće prodati taj softver drugima jer nisu bili kompatibilni. Izumljeni su kompilatori, i to je potaknulo razvoj , apstraktnijih jezika koji se lakše mogu razumjeti.
Kompilator prevodi kod pisan na jednom računalnom jeziku u drugi računalni jezik.
Prvi jezici visoke razine koji su razvijeni 1950-ih godina bili su FORTRAN, COBOL i BASIC. Oni su omogućavali programima da budu određeni na apstraktan način, neovisno o preciznim pojedinostima hardverske arhitekture računala. (Wolfram, 2002.).
Takvi se jezici koriste pri izradi programa, potpunih i funkcionalnih nizova uputa koje računala koriste za izvršavanje zadataka, poput učitavanja internetske stranice, stvaranja statističkih analiza i izračunavanja zbroja dvaju brojeva. Međutim, ne prepoznaje izravno kod. On se mora na jezik niske razine.
Budući da bi prevođenje velikog koda oduzelo mnogo vremena, programeri su izumili tumače.
Tumač izravno izvršava upute pisane na programskom jeziku te nema potrebe da ih kompilator prevede na program na strojnom jeziku.
Neki programski jezici koriste i kompilatore i tumače. Ako ste htjeli u uređivaču teksta izraditi program pisan u Javi, kada ste ga trebali prevesti s pomoću kompilatora za Javu, zapravo biste stvorili nešto što se naziva bajtni kod. Bajtni kod može se smatrati prijelaznom fazom između izvornog koda i objektnog koda. Kada računalo pokreće program u Javi, programi iz knjižnice na tom uređaju tumače bajtni kod. To omogućuje Java jeziku da bude neovisan o platformi. Korisnik treba samo imati ispravne izvršne knjižnice za Javu na svojem uređaju da bi mogao pokrenuti programe.
Koje su razlike između jezika niske i visoke razine?
Glavna razlika je ta da programeri mogu lakše razumjeti ili tumačiti ili prevesti jezik visoke razine u usporedbi sa strojnim kodom. S druge strane, računala mogu razumjeti jezik niske razine lakše nego ljudi. Pogledajmo ostale razlike:
Jezik visoke razine | Jezik niske razine |
---|---|
Jezik prilagođen programerima | Jezik prilagođen računalima |
Jezik visoke razine manje je memorijski učinkovit | Jezik niske razine je memorijski učinkovitiji |
Jednostavniji za ispravljanje pogrešaka | Relativno složeniji za ispravljanje pogrešaka |
Jednostavniji za održavanje | Relativno složeniji za održavanje |
Prijenosan | Nije prijenosan |
Može se izvoditi na bilo kojoj platformi | Ovisi o računalu |
Zahtijeva kompilator ili tumač za prijevod | Zahtijeva asembler za prijevod |
Najčešće se koristi za programiranje | Danas se ne koristi često za programiranje |
Izrada vlastitih programa/softvera
Postoji cijelo područje posvećeno izradi softvera (proizvoda) koje se naziva softversko inženjerstvo. Prvo ćete ponešto naučiti o softverskom inženjerstvu, a kasnije o programskim jezicima.
Što je softversko inženjerstvo?
Kada pomislite na softver, obično vidite sučelje koje vam omogućuje da nešto učinite s računalom, poput pisanja teksta. Softversko inženjerstvo definira se kao proces analiziranja korisničkih zahtjeva (potreba korisnika u vezi s pisanjem teksta) da bi se izradio željeni softverski proizvod. Sljedeći su koraci dizajniranje, izrada i testiranje softverske aplikacije koja će zadovoljiti te zahtjeve.
Pogledajmo različite definicije softverskog inženjerstva:
IEEE, u okviru svoje norme 610.12-1990, definira softversko inženjerstvo kao primjenu sustavnog, discipliniranog i mjerljivog pristupa razvoju, upravljanju i održavanju softvera.
Fritz Bauer definira ga kao „uspostavu i uporabu standardnih inženjerskih načela. Ono vam pomaže da na ekonomičan način dobijete softver koji je pouzdan i radi učinkovito na stvarnim strojevima.“
Prema Boehmovoj definiciji, softversko inženjerstvo uključuje „praktičnu primjenu znanstvenog znanja u svrhu kreativnog dizajniranja i izrade računalnih programa. Ono također uključuje popratnu dokumentaciju koja je potrebna za njihovo razvijanje, upravljanje i održavanje.“
Ali uključuje li softversko inženjerstvo više od samog kodiranja?
Da, izrada softvera sastoji se od mnogo koraka, kako prije, tako i poslije kodiranja. To zovemo životni ciklus razvoja softvera (engl. Software Development Life Cycle, SDLC). SDLC je strukturiran prema točno određenom redoslijedu faza koje čine proces dizajna i razvoja učinkovitim. SDLC uključuje sljedeće korake:
Komunikacija je prvi korak. Obično potencijalni klijent softverske tvrtke upućuje zahtjev za željenim softverskim proizvodom.
Prikupljanjem zahtjeva nastoji se prikupiti što više informacija o zahtjevima klijenta.
Studija izvedivosti je faza u kojoj tim izrađuje okvirni plan za proces razvoja softvera.
Analizom sustava projektni tim analizira opseg projekta i u skladu s time planira raspored i resurse.
Dizajniranje softvera je faza u kojoj tim uzima u obzir informacije iz faze prikupljanja zahtjeva i analize sustava te dizajnira softverski proizvod.
Faza kodiranja ili programiranja je kada tim počinje pisati programski kod u prikladnom programskom jeziku i učinkovito razvija izvršne programe bez pogrešaka.
Testiranje je važan dio procesa za otkrivanje i otklanjanje potencijalnih pogrešaka.
Faza integracije potrebna je ako se softver treba integrirati s vanjskim jedinicama poput baza podataka ili drugih programa.
Faza implementacije nastupa kada je novi softver spreman i instaliran na korisnikovim uređajima.
Upravljanje i održavanje je potvrđivanje učinkovitosti softvera u stvarnom životu. Provjeravaju se i otklanjaju moguće pogreške.
Razvoj utemeljen na metodologiji vodopada (engl. waterfall development) naspram agilnog razvoja (engl. agile development)
Sve gore navedene faze ili aktivnosti u SDLC-u mogu se izvoditi različitim redoslijedom prema različitim postojećim pristupima. Osim toga, kod različitih pristupa potrebno je odvojiti više ili manje vremena za različite faze SDLC-a. Te faze mogu se odvijati naizmjence, kao u pristupu utemeljenom na metodologiji vodopada, ili se mogu ponavljati više puta naglašavajući inkrementalnu isporuku softverskog proizvoda, kao u .
Tradicionalne metode softverskog razvoja koriste takozvani razvoj utemeljen na metodologiji vodopada. Prije nego što je internet omogućio lako preuzimanje softverskih nadogradnji ili njihovu automatsku provedbu, proces razvoja utemeljen na metodologiji vodopada bio je osmišljen tako da pokuša osigurati da softverski program prilikom isporuke naručitelju sadrži sve značajke koje su potrebne, uz sve poznate poteškoće koje su testirane i otklonjene, do objave sljedeće verzije softverskog programa. Taj je proces vrlo rizičan i dugotrajan jer se testiranje proizvoda vrši na samom kraju procesa, nakon što razvojni inženjeri i dizajneri provedu jako puno vremena na dizajniranje i izradu čitavog programa. Ova vrsta razvojnog procesa ide u korist inženjerske učinkovitost naspram iskustva krajnjeg korisnika, što može dovesti do problema koje inženjeri ne mogu predvidjeti. To dovodi do nezadovoljstva krajnjih kupaca, koji ne sudjeluju u razvojnom procesu nakon početne studije o zahtjevima. Nezadovoljstvo krajnjeg korisnika može dovesti do potencijalnog gubitka posla ili skupe ponovne izrade softvera.
Agilan pristup je najbolja suvremena praksa za razvoj softvera u kojoj timovi i klijenti surađuju te uz neprestano planiranje, učenje i komunikaciju isporučuju inkrementalni softver umjesto da se softver isporuči odjednom u cijelosti na kraju projekta. Krajnji korisnici (pojedinci koji će zapravo koristiti softver) određuju zahtjeve za dizajniranje i značajke te sudjeluju u testiranju tih malih koraka razvoja tijekom čitavog projekta. Na taj način, ako se uoči pogreška procesa za koji se dizajnirao proizvod, odmah se mogu napraviti izmjene prije nastavka izrade. Podjela procesa na manje dijelove i neprestano testiranje i integriranje značajki softvera u serijama raspoređuje rizik ulaganja u razvoj i ubrzava implementaciju softvera korisnicima
Sada kada znamo cijeli proces stvaranja softvera, vratit ćemo se na kodiranje i programske jezike.
Do sada već znate da je većina računalnih programa pisana u programskom jeziku visoke razine. Međutim, verzija programa koju mogu čitati ljudi zove se izvorni kod. Vi i razvojni inženjer softvera možete stvarati i uređivati u jeziku visoke razine s pomoću softvera ili čak s pomoću osnovnog uređivača teksta.
Što je softver IDE?
Softver IDE označava „integrirano razvojno okruženje“ (engl. integrated development environment). To je aplikacija koju razvojni inženjeri koriste za izradu računalnih programa. U ovom slučaju „integrirani“ označava to da je više razvojnih alata kombinirano u jedan program. Primjerice, IDE obično uključuje uređivač izvornog koda, program za ispravljanje pogrešaka (engl. debugger) i kompilator. Većina IDE-ova ujedno pruža i sučelje projekta koje omogućuje programerima da prate sve datoteke vezane uz projekt. Mnogi IDE-ovi podržavaju kontrolu verzije.
Neki IDE-ovi pružaju „okruženje za izvođenje programa“ (engl. runtime environment, RTE) za testiranje softverskih programa. Kada se program izvodi u RTE-u, razvojni inženjer može pratiti svaki događaj koji se odvija u testiranoj aplikaciji. To može biti korisno za pronalaženje i ispravljanje pogrešaka te pronalaženje izvora curenja memorije. Budući da IDE-ovi pružaju centralizirano korisničko sučelje za pisanje koda i testiranje programa, programer može napraviti brzu izmjenu, ponovno prevesti program i zatim ponovno pokrenuti program. Programiranje je u svakom slučaju naporan posao, međutim, IDE softver pojednostavljuje razvojni proces.
Postoji iznimno mnogo računalnih programskih jezika koje koriste programeri, , i drugi stručnjaci iz područja računarstva. Ali koliko ih zapravo ima?
Wikipedia navodi da postoji oko 700 programskih jezika, uključujući ezoterične kodne jezike. Ostali izvori koji navode samo značajne jezike došli su do impresivne brojke od 245 jezika. Drugi popis, koji se naziva HOPL, a koji tvrdi da uključuje sve programske jezike koji postoje, navodi ukupan broj od 8945 jezika. Neki čak procjenjuju da postoji ukupno 25 000 jezika.
Ali kako odabrati koji ćete programski jezik učiti? I možete li stvarno naučiti kodirati? Odgovor je da! Možete i trebate, jer je potreba za poznavanjem kodiranja za različite poslove sve veća.
Carlcheo je napravio korisnu infografiku koja će nam pomoći da odaberemo programski jezik koji ćemo učiti. Prikupio je i dobre materijale za početak učenja nekih od spomenutih jezika.
Ako želite odabrati jezik koji će učiti vaša djeca, preporučamo vamScratch, a kada završite s njim, preporučamo vam da se prebacite na .
Ako želite naučiti jezik s kojim možete raditi u Facebooku ili Googleu, najbolje bi bilo da odaberete Python. Naime, općenito je dobro odabrati Python jer se smatra jednim od relativno laganih jezika za naučiti.
Prema razvojnim inženjerima, ako želite naučiti „lagani“ jezik, možete birati između Pythona, i . Navedeni jezici mogu vam pružiti čvrste temelje za programersku logiku i sintaksu. A čim budete imali čvrste temelje, lakše ćete moći savladati bilo koji drugi jezik.
Ako želite razvijati računalne igre, jezik koji se uglavnom koristi je C++.
Ako želite kodirati na relativno niskoj razini, možete odabrati C i C++ jer se oni uglavnom prevode izravno u strojni jezik platforme na kojoj se koriste. Osim toga, C i C++ omogućuju vam da pišete na način koji je vrlo sličan većini strojnih kodova (povećanje pokazivača itd.). Rust je noviji jezik u ovom području.
Ako želite raditi na iPhoneovim projektima, odnosno projektima povezanim s iOS-om, odaberite Swift.
Ako želite raditi na projektima povezanim s Androidom, odaberite Javu ili Kotlin.
Ako vas privlači ljepota web-mjesta, velika je vjerojatnost da će vam biti zanimljivo učenje kodova namijenjenih korisniku (razvoj pristupnog (engl. front-end) dijela internetskih stranica) pa odaberite jezik JavaScript.
Ako vas zanimaju poslužitelji (razvoj pozadinskog (engl. back-end) dijela internetskih stranica) i baze podataka, odaberite Ruby ili Python.
Ako već znate dio tehničkog područja koji vas zanima, odabrat ćete razvoj pristupnog (front-end) dijela ili razvoj pozadinskog (back-end) dijela.
I naš posljednji savjet: Budući da mogućnosti za odabir jezik ima napretek, bilo bi dobro da si postavite dva ključna pitanja prije donošenja bilo koje odluke.
ü Što vas je privuklo programiranju?
ü Što želite raditi kao programer?
Postoji mnoštvo mogućnosti za napredovanje u vašoj karijeri. Iskoristite prvi jezik da biste naučili kako programeri razmišljaju te da biste naučili osnove programerske logike. I nemojte zaboraviti da je cjeloživotno učenje iznimno važno da biste mogli pratiti jezične i tehnološke trendove.