Računarski sistem se sastoji od hardvera i softvera. Hardver čine delovi računara, a softver programi koje računar izvršava. Računar je mašina bez inteligencije, on izvršava samo ono što mu je zadato  i to na način kako mu je zadato. Programom zadajemo računaru način na koji izvršava poslove. Da bismo rešili  neki problem korišćenjem računara, moramo računaru precizno opisati sve korake- instrukcije (naredbe) koje on izvršava zadatim redosledom. Skup instrukcija napisan za rešavanje nekog problema naziva se program, a pisanje instrukcija programiranje.

Programiranje je značajna komponenta, prisutna u gotovo svim granama računarstva.  Često izjednačavanje računarske nauke sa programiranjem zanemaruje druge bitne aspekte računarstva kao što su projektovanje hardvera, arhitektura sistema, projektovanje nivoa operativnih sistema, struktuiranje baza podataka za specifične aplikacije, validacije modela, itd. Programiranje je  u najopštijem smislu aktivnost izrade programa za elektronsku  računsku  mašinu (računar).

Programiranje, pored izučavanja važnih klasa algoritama i programa  koji se, kao česte komponente drugih programa mogu primmeniti u rešavanju novih zadataka, mora da uključi i metode razvoja algoritama i programa sa unapred poznatim ponašanjem, tj. Metode koje omogućuju da se, zajedno sa izvođenjem programa izvodi  i dokaz njegove korektnosti (njegova semantika), što približava razvoj programa dokazu teoreme u matematici.Ponašanje programa sada se izvodi  iz samog teksta programa, bez interpretacije izvršnog koda, tj. bez  testiranja. Poslednjih decenija, programski sistemi kod kojih je kritična bezbednost  (npr. kontrola leta), razvijaju se upravo korišćenjem ovakvih metoda. One (za razliku od testiranja) mogu egzaktno  da dokažu  korektnost programa, ali i da pomognu  u otkrivanju eventualnih grešaka.

Koliko je značajan ovaj pristup programiranju ilustruje i sledeći primer (R.Sethi: Programming Languages – Concepts and Constructs). Jula 1962. Godine, raketa koja je nosila Mariner I (Venerinu sondu bez posade), morala je da bude uništena 290 sekundi posle lansiranja. Gubitak je procenjen na 18-20 miliona dolara. Uzrok je bio greška u programskom fragmentu koji je trebao da ima oblik:

if not (raketa u kontaktu sa radarom) then

ne korigovati putanju leta

Reč „ne“ (not) je greškom ispuštena pa je glavni računar nastavio sa korekcijom putanje i kada je raketa izgubila kontakt sa radarom. Program je prethodno bio korišćen bez problema u četiri lansiranja na Mesec.

Glavni argument koji je korišćen u odbrani ovog slučaja bila je čijenica da je program uspešno prošao tri stotine nezavisnih testiranja. To, očigledno, nije bilo dovoljno  pouzdano, pa je zaključak o neophodnosti  „da se nešto preduzme da se slične greške nikada više ne bi ponovile“ pretočen u primene metoda dokazivanja korektnosti programa iz njegove interne (tekstualne) strukture, bez potrebe za testiranjem.

Izuzetno je važan izbor programskog jezika na kome se izlaže  i uči veština rešavanja problema i programiranja, s obzirom da sredstva koja se u tom procesu koriste imaju veliki uticaj na način na koji razmišljamo i samu sposobnost razmišljanja. Minimalni zahtev koji se postavlja  pred programski jezik jeste da mora da pomogne da se napiše dobar program, tj. program koji se lako čita, lako razume i lako modifikuje.

Pregled razvoja i klasifikacija programskih jezika

Ljudi za međusobnu komunikaciju koriste jezik. Jezik je sredstvo za predstavljanje i prenošenje informacija. Čovek morana neki način da saopšti računaru  instrukcije koje treba da izvrši. Programski jezik je sredstvo kojim čovek saopštava računaru program. Čovek i računar komuniciraju pomoću programskog jezika. Priridni jezici dopuštaju nejednoznačnost i nepreciznost. Računar  može „razumeti“ samo formalni zapis, ne tolerišući ni najmanje nepreciznosti. Zapisi niza instrukcija u programskom jeziku ne mogu se višeznačno protumačiti. Programski jezik je skup pravila kojim se računaru predstavljaju instrukcije i opisuju podaci. Delimo ih po stepenu zavisnosti programskog jezika i računara na:

  • Mašinski jezik
  • Simbolički jezik
  • Jezici višeg nivoa

Mašinski, simbolički i makro jezici su zavisni od računara –mašinski zavisni jezici. Oni su tesno povezani za konkretnu mašinu  i uzimaju u obzir specifičnosti arhitekture odgovarajućeg procesora. To su jezici  niskog nivoa.

Jezici višeg nivoa pripadaju grupi mašinski nezavisnih jezika. Grade se nezavisno od računara na kome će se izvršavati. Oni su sredstvo u kome programer  zapisuje svoje ideje ne upuštajući se u detalje arhitekture računara. Mašinski nezavisni jezici su namenjeni  primenama u različitim delatnostima i za svaku od tih primena grade se posebne klase programskih jezika visokog nivoa.

Mašinski zavisni jezici

Najjednostavniji programski jezik je interni jezik računara – mašinski jezik. Konkretan računar sa operativnim sistemom „razume“ mašinski jezik bez pomoći druge programske opreme. Svaki računar ima svoj mašinski jezik koji je izgrađen nad binarnom azbukom (Simboli binarne azbuke su 0 i 1. Jedan znak prestavlja bit, a grupa od 8 bita  bajt). Operacije i podaci predstavljeni su nizovima bitova koji imaju različita tumačenja u  zavisnosti od arhitekture računara.

Pošto se mašinski program sastoji od niza nula i jedinica, te zahteva dobro poznavanje načina rada i arhitekture određenog računara, vrlo je teško programirati na njemu.

Programi na prvim računarima bili su zapisani mašinskim jezikom što je uslovilo da  uzak krug ljudi piše i održava programe. Programiranje na mašinskom jeziku omogućilo bi maksimalno korišćenje mogućnosti računara, ali njegova binarna forma čini mašinski jezik praktično neupotrebljivim za čoveka.

Da bi se premostile teškoće u pisanju programa na mašinskom jeziku, dolazi do razvoja simboličkih jezika. Umesto instrukcija pisanih nizom bitova, uvedene su mnemotehničke skraćenice za operacije i simboličke oznake podataka, npr. naredbom

ADD a, b

vrši se sabiranje podataka a i b. Na taj način se olakšava proces programiranja ali i dalje je zavistan od konkretnog procesora, tj. i dalje je potrebno  poznavati tehničke karakteristike konkretnog računara za koji pišemo program.

Da bi  se program napisan na simboličkom jeziku izvršavao na računaru, mora se prethodno  prevesti na mašinski jezik. Kako svakoj naredbi simboličkog jezika odgovara jedna  naredba mašinskog jezika, posao je automatizovan tako što je napisan program koji kao ulaz dobija program napisan u simboličkom jeziku, a kao izlaz odgovarajući program na mašinskom jeziku. Program koji vrši prevođenje iz simboličkog u mašinski jezik naziva se asembler (translator). Zato se simbolički jezik često naziva asemblerski jezik ili kraće asembler. Napomenimo da skup naredbi simboličkog jezika zavisi od  arhitekture računara, pa program napisan u simboličkom jeziku za jedan računar ne može se koristiti za računar druge arhitekture, već se mora ponovo pisati. Često za mašinske i simboličke jezike kažemo da su mašinski zavisni jezici. Važno je istaći da pri programiranju na mašinski zavisnim jezicima programer mora vrlo detaljno, u malim koracima opisati rešavanje problema.

Makro jezici predstavljaju proširenja simboličkih jezika makro naredbama. To su imenovane grupe naredbi simboličkog jezika koje se izdvajaju u posebne celine i pozivaju po imenu (sa odgovarajućim parametrima) iz glavnog programa na mestima gde je to potrebno. Makro naredbe skraćuju zapis programa, omogućavaju jednostavnije i pouzdanije programiranje, ali ne smanjuje zauzeće memorije jer se pri prevođenju, prevedeni oblik makro naredbe „umeće“ u glavni program gde god je ona pozvana (za razliku od procedura u višim programskim jezicima).

Programski jezici višeg nivoa

Da bi se premostile teškoće u programiranju na asemblerskim jezicima, veoma rano počinju da se razvijaju mašinski nezavisni jezici, odnosno jezici višeg nivoa. Korišćenjem jezika višeg nivoa opis naredbi i podataka vrši se na način blizak prirodnom (engleskom) jeziku. U ovim jezicima jednoj naredbi odgovara više naredbi simboličkog jezika. Važno je napomenuti da ovi jezici imaju visok stepen nezavisnosti u odnosu na arhitekturu računara i operativni sistem na kojem se izvršavaju.

S obzirom na to da računar razume samo program napisan na mašinskom jeziku, svaki program pisan jezikom višeg nivoa mora se prevesti na mašinski jezik. Na osnovu načina prevođenja i izvršavanja, jezike višeg nivoa delimo na kompajlerske i interpreterske jezike. Najpre su nastali kompajlerski jezici Algol, Fortran, Cobol, PL/I… Kod ovih jezika izgrađuju se programi za prevođenje (kompajleri) kojim se ceo program napisan na višem programskom jeziku prevodi u njemu ekvivalentan, mašinski program koji se može izvršavati na računaru. Kod interpreterskih jezika, program na višem programskom jeziku se prevodi i izvršava instrukcija po instrukcija. Primeri interpreterskih jezika su Lisp, Prolog, Basic, …

Savremeni programski jezici mogu se koristiti ravnopravno u svim oblastima. Nekada se primena računara u oblasti poslovanja  razlikovala od primene računara u nauci i tehnici.  Prvu je karakterisao veliki broj ulazno/izlaznih podataka i relativno jednostavan opis obrade podataka, pa su i jezici namenjeni toj primeni zadovoljavali te karakteristike (Cobol…).Za primenu u nauci i tehnici karakterističan je mali broj ulazno/izlaznih podataka, ali i veoma složen opis obrade, pa su razvijani jezici za te namene poput Fortrana, Algola,… U to vreme programski jezik PL/I bio je dovoljno dobar za primenu u poslovanju kao i za primenu u oblasti složenih numeričkih izračunavanja.

Prema načinu rešavanja problema, možemo izvesti podelu viših programskih jezika na proceduralne i deklarativne programske jezike.

U proceduralnim jezicima jezikom dajemo računaru kompletan skup instrukcija kojim se rešava problem, tj. dajemo mu algoritam za rešavanje zadataka. Ovim jezicima opisujemo kako se rešava dati problem. Manje-više svi poznatiji viši programski jezici su ovog tipa: Fortran, Cobol, Basic, Pascal, C kao i mašinski zavisni jezici. Kasnije, u razvoju programskih jezika dolazi se do ideje da se problemi opisuju, a da sam interpreter ima ugrađene postupke kako da reši opisani problem što dovodi do razvoja deklarativnih jezika.

Deklarativnim jezicima opisujemo šta znamo o problemu i šta želimo da dobijemo rešavajući ga, a sistem (interpreter) sam dolazi do postupka za rešavanje problema. Primeri deklarativnih jezika su Prolog i SQL. Sistem ima ugrađen algoritam koji dovodi do rešenja. Postojanje i pisanje opšteg algoritma za nalaženje rešenja je glavna poteškoća u razvoju ovih jezika, pa su zato deklarativni jezici obično specijalizovani za određene vrste problema. Koliko god da je ova ideja napredna, u praksi je vrlo teško u potpunosti sprovesti deklarativnost.

Neke deklarativne jezike možemo podeliti na relacijske i funkcijske. Osnovni objekti u prvima su relacije, a u drugima su funkcije. Ideja razvoja funkcijskih jezika je u spajanju unapred definisanih funkcija, koje imaju svoje ulaze i izlaze, u cilju dobijanja rešenja problema. Programer koji koristi takav programski jezik gleda na razvoj programa kao na način spajanja elementarnih funkcija, čime se dobija sistem koji zračunava željeni rezultat. Primeri funkcijskih jezika su LISP, LOGO, ML.

Posebnu klasu čine objektno orijentisani jezici, kod kojih su prisutni i proceduralni i neproceduralni elementi. U proceduralnim jezicima isticani su postupci, način realizacije (procedura), neke više ili manje složene akcije. Podaci su na neki način u podređenom položaju u odnosu na algoritam. Moramo priznati da su podaci razlog postojanja programa. Svaki postupak obrađuje neke podatke (čita ih, prikazuje, menja…). Podaci i akcije koje se izvode nad njima predstavljaju jednu nerazdvojnu celinu, jer nam podaci bez postupaka kojim ih obrađujemo, kao i postupci za obradu bez podataka, ne znače puno. Kod objektno orijentisanih jezika podaci i postupci su objedinjeni u jednu celinu i čine aktivan objekat, za razliku od podataka u proceduralnim jezicima koji su krajnje pasivni. Svaki takav objekat izgleda kao mali računar: on ima unutrašnje stanje i ima operacije koje možemo zahtevati da izvrši. Jasno možemo uočiti analogiju između takvih objekata i objekata u realnom svetu.

Mnoštvo različitih objekata možemo uočiti u okruženju grafičkih operativnih sistema (GUI, Graphic User Interface). Ikone su objekti. Svakoj je pridružen skup osobina i akcija koje opisuju kako reaguju na spoljašnje događaje, šta se dešava kada jednom kliknemo, kada dva puta kliknemo, kad pritisnemo desni taster, kako se ponašaju kada držimo pritisnut taster na mišu i slično. U objektno orijentisanom programiranju cilj programera je da sakupi podatke i akcije u neku vrstu „kutije sa alatom” koju će koristiti za brzi razvoj aplikacija. Primeri objektno orijentisanih jezika su SmallTalk, Java, C#. C++ je hibridni jezik; jeste iz klase objektno orijentisanih jezika ali nije čisto objektno orijentisan.

Iz ovog kratkog prikaza razvoja programskih jezika možemo uočiti da objektno orijentisanim pristupom na prirodan način opisujemo realan svet. Ipak, prirodnost opisa nije glavni razlog ozbiljnijeg razvoja objektno orijentisanih jezika, već je to „softverska kriza” nastala osamdesetih godina. U to vreme, razvoj hardvera doveo je do znatnog povećanja primene računara u raznim oblastima, pa su samim tim čitavi timovi programera morali da rade na razvoju jednog projekta. Svaki deo tima razvijao e relativno nezavisne module, a zatim su se ti moduli uklapali u funkcionalnu celinu, korisničku aplikaciju. Svaki od modula moguće je koristiti u različitim aplikacijama.Na taj način dolazi se do standardizacije aplikativnog softvera.


S druge strane, pored razvijanja objektno orijentisane metodologije u programiranju, razvojem interneta javila se i potreba da napisani projekti rade identično na različitim platformama (operativnim sistemima…). Razvojem programskog jezika Java, koji je primer objektno orijentisanog pristupa, na neki način se prevazilaze različite platforme na kojima bi se softver izvršavao. Java tehnologija izvorno je bila zamišljena za prenos multimedije mrežom raznovrsnih uređaja

.

Rešavanje problema pomoću računara

U procesu rešavanja problema uz pomoć računara može se izdvojiti nekoliko etapa. Neke   etape  se mogu preskočiti ili proći nezapaženo,a vreme predviđeno za realizaciju svake od njih zavisi od složenosti i specifičnosti problema koji se rešava.

Etape su:

  1. Postavka problema – problem se formuliše na prirodnom jeziku. Važno je da naručilac programa  zatraži od programera. Statistički, 60 do 90% grešaka u  složenim programskim  projektima potiče od nepotpune i pogrešne formulacije zahteva.
  2. Analiza problema – uključuje definisanje ulaznih i izlaznih podataka, mogućih ograničenja njihovih vrednosti i završava se formalnim opisom problema.
  3. Izbor ili razrada algoritma – algoritam podrazumeva konačan uređen niz precizno formulisanih pravila kojima se rešava jedan ili čitava klasa problema. U ovoj etapi, posle analize svih varijanti i izbora optimalne, algoritam se izražava na nekom od jezika za zapis algoritma ili u vidu blok šeme. Kreiranjem algoritma program je sveden u oblik pogodan za rešavanje na računaru.
  4. Projektovanje opšte strukture programa – bira se programski jezik najpogodniji  za kodiranje. Pristupa se razradi arhitekture programa i definiše način čuvanja informacija (skup promenljivih, nizova podataka, drugih struktura)
  5. Kodiranje – zapis algoritma na programskom jeziku.Vreme potrebno za kodiranje i verovatnoća pojave grešaka zavise od preciznosti  algoritma, strukture podataka i strukture programa.
  6. Testiranje služi za otklanjanje grešaka u programu. Testiranje se radi na osnovu unapred pripremljenih kontrolnih parametara za koje je poznato rešenje problema. Testiranje mora da obuhvati sve moguće grane programa  uključujući i situaciju kada nema rešenja problema.Program radi ispravno kada se rešenja poklapaju sa očekivanim. U toku izrade programa  moraju se obuhvatiti i specijalne situacije kao i “zaštitu od gluposti” (fool tolerance), koja podrazumeva sposobnost programa da reaguje na nestručna obraćanja korisnika.
  7. Analiza rezultata izvršavanja programa, njihova interpretacija i eventualna modifikacija modela – kada je program proveren, greške otklonjene i bez obzir a što se smatra da program radi korektno, neophodno je  da se dobijeni  rezultati  stave “pod lupu”. Ako se radi o modeliranju nekog prirodnog procesa treba uporediti rezultate programa sa rezultatima posmatranja. Ako nisu u granicama koje se mogu tolerisati model se modifikuje da bi bio što realniji.
  8. Publikovanje ili isporuka naručiocu – predstavlja trenutak kada se program iznosi na tržište, stavlja na ftp server radi slobodne distribucije ili predaje naručiocu.
  9. Održavanje i modernizacija programa – podrazumeva obuku korisnika i konsultacije o radu programa. Nedostaci i uočene greške se obično otklanjaju besplatno. Kod tiražnih programa vrši se stalna analiza reakcije korisnika i izrada novih modifikacija i verzija na osnovu primedbi i želja korisnika.

Algoritmi i algoritmizacija

Algoritam je jedan od osnovnih pojmova savremene matematike.

Algoritam se koristi da bi se precizirao sistem pravila i instrukcija kojim se od poznatih veličina dobijaju traženi rezultati.

Grfički prikaz  algoritma

Algoritam može biti napisan na jeziku ljudske komunikacije, ali može nastati problem kod složenijih problema gde bi takav algoritam postao težak za tumačenje.

Teško tumačenje složenih tekstualnih algoritama dovelo je do grafičkog prikaza algoritma. U tu svrhu koristi se niz grafičkih simbola za pojedine algoritamske  korake.

Algoritamske strukture

Složeni algoritam dobija se kombinacijom tri osnovne strukture: linijske, razgranate i  ciklične.

  • Linijski algoritmi su oni kod kojih se naredbe  izvršavaju sekvencijalno jedna za drugom.
  • Razgranati algoritmi su oni kod kojih se u zavisnosti  od ispunjenosti  uslova program  nastavlja jednom od dve grane
  • Ciklični algoritmi sadrže niz instrukcija koje se ponavljaju više  puta.

Svaki algoritam treba da ispuni sledeće zahteve:

  • definisanost – svaka instrukcija algoritma mora biti jednoznačno definisana, bez mogućnosti proizvoljnih  i nejasnih tumačenja
  • determinisanost – vrednosti koje se dobiju u bilo kom trenutku (sem početnog) određene su vrednostima iz predhodnog trenutka.
  • izvršivost – instrukcija algoritma je izvršiva ako je u konačnom nizu  koraka može izvršiti čovek uz upotrebu papira i olovke
  • masovnost – je zahtev da algoritam rešava što širu klasu problema, koji se razlikuju samo po ulaznim veličinama
  • rezultativnost – algoritam mora u konačnom nizu koraka dati tražene rezultate za sve slučajeve za koje je kreiran

Sintaksa i semantika programskih jezika

Za kreiranje osnovnih konstrukcija programskog jezika koriste se sledeći elementi:

  1. Simboli – predstavljaju osnovne, nedeljive znakove, od kojih se gradi tekst programa na datom jeziku. Skup svih simbola čini alfabet jezika. Alfabet programskih jezika uključuje slova latinice, cifre, znake aritmetičkih operacija.
  2. Lekseme – su nizovi simbola alfabeta (elementarne konstrukcije) koji imaju određeno značenje. Mogu se sastojati od samo jednog simbola, npr. znaka operacije. Skup leksema i pravila njihovog formiranja predstavlja leksiku jezika.
  3. Izrazi – su nizovi leksema zapisani u strogoj korespodenciji sa pravilima jezika. Oni zadaju poredak izračunavanja neke vrednosti.
  4. Naredbe (operatori, instrukcije ili komande jezika) zadaju potpun opis neke akcije koja treba da se izvrši. Za opis složene akcije može se formirazi grupa naredbi koje čine složenu ili blok naredbu. Akcije koje se zadaju naredbama izvršavaju se nad podacima.

Skup opisa i naredbi jezika programiranja, koji realizuju algoritam rešenja konkretnog  problema obrazuju program na datom jeziku.

Skup pravila za građenje pravilnih konstrukcija jezika od njihovih elemenata (leksema, izraza, operatora) predstavlja sintaksu.

Semantika sefiniše značenje sintaksno ispravnih konstrukcija jezika.

Sintaksa jezika definiše oblik pojedinih instrukcija („kako one izgledaju“), dok semantika ukazuje na akcije koje treba da izvrši računar na osnovu njihovog značenja („šta one rade“).

One response »

  1. Повратни пинг: III razred Programiranje « Infossremac's Blog

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s