Paradigme programiranja

S Vikipedije, slobodne enciklopedije

Paradigme programiranja je osnovni stil programiranja, služeći kao način pravljenja strukture i elemenata računarskih programa. Mogućnosti i stilovi raznih programskih jezika su definisani od strane njihovih podržanih programskih paradigmi; neki programski jezici su dizajnirani da prate samo jednu paradigmu, dok drugi podržavaju višestruke paradigme.

Paradigme programiranja koje su često razlikovane uključuju imperativno, deklarativno, funkcionalno, objektno-orgjentisano, proceduralno, logičko i simboličko programiranje.[1][2][3] Sa različitim paradigmama, programi mogu biti viđeni i ugrađeni na različite načine; na primer, u objektno-orijentisanom programiranju, program je skup objekata koji interaguju u eksplicitno definisanim načinima, dok u deklarativnom programiranju računaru je samo rečeno šta je problem, ali ne i kako ga rešiti.

Pregled[uredi | uredi izvor]

Pregled raznih paradigmi programiranja prema Petru Van Roju[4]:5

Kao što je inženjering softvera (kao proces) definisan razlikovanjem metodologija, tako da su programski jezici (kao modeli računanja) definisani razlikovanjem paradigmi. Neki jezici su dizajnirani da podržavaju jednu posebnu paradigmu (Smalltalk podržava ovjektno-orijentisano programiranje, Haskell podržava funkcionalno programiranje), dok ostali jezici programiranja podržavaju višestruke paradigme (kao što su Object Pascal, C++, Java, C#, Scala, Visual Basic, Common Lisp, Scheme, Perl, Python, Ruby, Oz i F#). Na primer, prigrami napisani u C++ ili Object Pascal mogu biti isključivo proceduralni, objektno-orijentisani, ili mogu sadžati elemente oba ili drugih paradigmi. Programski dizajneri i programeri odlučuju kako će se korisititi ti elementi paradigmi.

U objektno-orijentisanom programiranju, programeri mogu smatrati program kao skup interaktivnih objekata, dok u funkcionalnom programiranju program može biti smatran kao sekvena evaluacija funkcije koja nema stanje. Prilikom programiranja računara ili sistema sa mnogo procesora, procesno-orijentisano programiranje omogućava programerima da misle na aplikacije kao skupove konkurentskih procesa koji deluju na logičko deljene strukture podataka.

Mnoge paradigme programiranja su takođe poznate po tehnikama koje one zabranjuju kao i one koje omogućavaju. Na primer, čisto funkcionalno programiranje ne dozvoljava korišćenje side-effects, dok struktuirano programiranje ne dozvoljava korišćenje GoTo izjava. Delom zbog ovog razloga, nove paradigme su često smatrane kao doktrinirane ili previše krute od strane onih koji su navikli na ranije stilove.[5] Izbegavajući određene tehnike može, ipak, učiniti lakšim pri dokazivanju teorema oko tačnosti programa, ili jednostavno da se razume njeno ponašanje.

Paradigme programiranja takođe mogu biti poređene sa modelima programiranja koje su apstrakcije računarskih sistema. Na primer, "Fon Nojmanova arhitektura" je model programiranja korišćen u tradicionalnim sekvencijalnim računarima. Za paralelnu obradu, postoje mnogi mogući modeli tipično reflektujuči načine na koji procesoru mogu biti povezani međusobom. Oni najčešći su zasnovani na deljenoj memoriji, distribuiranoj memoriji sa prosleđivanjem poruka, ili na hibridu ova dva.

Neki istraživači programskih jezika kritikuju pojam paradigmi kao klasifikaciju programskih jezika, npr. Krishnamurthi.[6] Oni se prepiru da mnogi programski jezici ne mogu biti striktno klasifikovani u jednu paradigmu, već da uključuju mogućnosti iz nekoliko paradigmi.

Istorija[uredi | uredi izvor]

Različiti pristupi programiranju su se pojavili tokom vremena, identifikovani kao takvi u tom trenutku ili retrospektivno. Rani pristup svesno identifikovan kao takav je struktuirano programiranje, podržavan još od sredine 1960. Konceprt "paradigme programiranja" kao takav potiče još od 1978, Tokom predavanja na Tjuringovoj nagradi Roberta Flojda, sa imenom Paradigme Programiranja, koji navodi pojam korišćen od strane Tomasa Kuhna u njegovoj Struktura Naučnih Revolucija (1962).[7]

Mašinski kod[uredi | uredi izvor]

Paradigme programiranja niskog nivoa su kodovi mašinskoj jezika, koji direktno predstavljaju instrukcije (sadržaj memorije programa) kao sekvencu brojeva, i asemblera gde su mašinske instrukcije predstavljene od strane mnemonics i memorijskim adresama mogu biti dodeljene simboličke oznake. Oni su ponekad nazvani prvim- i drugo-generacijski jezicima.

Tokom 1960, jezici asemblera su razvijeni da podržavaju biblioteku COPY i prilično sofisticirane makro-generacijske i već obrađene mogućnosti, CALL na (potprogram), spoljne promenljive i česte delove (globalne), omogućavajući značajno ponovno korišćenje koda i izolaciju od hardvera preko korišćenja logičkih operatora kao što su READ/WRITE/GET/PUT. Asembler je bio, a i dalje je, korišćen za sisteme u kritičnom vremenu i često u ugrađenim sistemima jer pruža najviše direktnu kontrolu nad onim na šta mašina radi.

Proceduralni jezici[uredi | uredi izvor]

Sledeće napredovanje je bio razvoj proceduralnih jezika. Ovi treće-generacijski jezici (prvi opisan kao programski jezik visokog nivoa) koriste vokabular vezani za problem koji se rešava. Na primer,

  • COBOL (COmmon Business Oriented Language) – koristi termine kao što su file, move i copy.
  • FORTRAN (FORmula TRANslation) – koristi terminologiju matematičkog jezika, napravljen je najviše za rešavanje naučnih i inženjerskih problema .
  • ALGOL (ALGOrithmic Language) – fokusiran na bivanje odgovarajućeg jezika za definisanje algoritama, koristeći se terminologijom matematičkog jezika i ciljajući na naučne i inženjerske probleme kao FORTRAN.
  • PL/I (Programming Language One) – hibrid jezika u komercijalne/naučne svrhe podržavajući pokazivače.
  • BASIC (Beginners All purpose Symbolic Instruction Code) – napravljen je da omogući više ljudi da pišu programe
  • C – programski jezik generalne primene, prvobitno napravljen od strane Dinisa Riči između 1969. i 1973.

Svi ovi jezici prate proceduralnu paradigmu. Takoreći, oni opisuju, korak po kora, tačno onu proceduru koju bi trebalo, prema određenom programeru, i prate rešavanje određenog problema. Delotvornost i Algoritamska efikasnost bilo kakvog rešenja su oba potpuno subjektivna i visoko zavisna od iskustva programera, inventivnosti i mogućnosti.

Objektno-orijentisano programiranje[uredi | uredi izvor]

Prateći rasprostranjeno korišćenje proceduralnih jetika, objektno-orijentisani jezici kao što su Simula, Smalltalk, C++, C#, Eiffel i Java su napravljeni. U ovim jezicima, podatak i metode manipulisanja podatkom su sačuvani kao jedna jedinica nazvana objekat. Jedini način na koji korisnik može pristupiti podatku je preko "metoda" objekta; kao rezultat, unutrašnji radovi objekta mogu biti promenjeni bez menjanja bilo kog koda koji se koristi objektom. Postoji i dalje neke kontroverzije od strane Aleksandra Stepanova, Ričarda Stolmana[8] i drugih programera, u vezi efikasnosti OOP paradigmi protiv procedularnih paradigmi. Polimorfizam je osmišljen kao jedan od pokušaja da se reši ova nedoumica.

Zato što je objekto-orijentisano programiranje smatrano paradigmom, a ne jezikom, moguće je napraviti i objektno-orijentisani jezički asembler. Asembler visokog nivoa (HLA) je primer ovoga koji potpuno podržava napredne tipove podatka i objektno-orijentisan jezik programiranja asemblera – uprkos njegovim ranim poreklima. Time, razlikovanje programskih paradigmi može biti smatrano više kao "motivacioni mem" njenih nadređenih – više nego neophodno predstavljanje napretka od jednog nivoa do sledećeg. Precizna poređenja efikasnosti programskih paradigmi su često pravljena težim zbog nove i različite terminologije primenjene na slične jedinice i procese takođe sa mnogobrojnim implementacijama razlika kroz jezike.

Dalje paradigme[uredi | uredi izvor]

Literalno programiranje, kao oblik imperativnog programiranja, struktuira programe kao veb fokusiran oko čoveka, kao u eseju hiperteksta: dokumentacija je integral programa, i program je struktuiran prateći se logikom ekspozicije proze, umesto konvencije kompajlera.

Nezavisno od imperativne grane, paradigme deklarativnog programiranja su napravljene. U ovim jezicima, računarima je rečeno šta je problem, ali ne i kako ga rešiti – program je struktuiran kao skup atributa da nađe očekivati rezultat, ne kao proceduru koju će da prati. Dajući mu bazu podataka ili skup pravila, računar pokušava da nađe rešenje koje zadovoljava sve zadate atribute. Arhetipski primer deklarativnog jezika je četvrta generacija programskog jezika SQL, kao i porodica funkcionalnih jezika i logičkog programiranja.

Funkcionalno programiranje je podskup deklarativnog programiranja. Programi napisani korišćenjem ove paradigme koriste potprograme, blokove koda napravljenim da se ponašaju kao matematičke funkcije. Funkcionalni jezici obeshrabruju promene u vrednostima promenljivih kroz dodelu, čineći korišćenje rekurzijom dobroj idejom.

Logičko programiranje gleda računanje kao automatsko rezonovanje preko korpusa znanja. Činjenice oko problema domena su izražene kao lofičke formule, i programi su izvršeni primenom pravila zaključka na njima dok nije nađen odgovor za problem, ili skup formula nije dokazan nedoslednim

Znakovno programiranje je paradigma koja opisuje programe koje mogu da manipulišu formulama i komponentama programa kao podacima.[3] Programi zato mofu efektivno uređivati sami sebe, i "učiti same sebe", čineći ih pogodnim za aplikacije za veštačku inteligenciju, ekspertske sisteme, obradu prirodnih jezika i računarske igre. Jezici koji podržavaju ovu paradigmu uključuju LISP i Prolog.[9]

Višestruka paradigma[uredi | uredi izvor]

Programski jezik višestruke paradigme je programski jezik koji podržava više od jedne programske paradigme.[10] Cilj dizajna ovakvih jezika je omogućavanje programerima da koriste njima najodgovarajući stil programiranja i povezanih konstrukcija jezika za određeni posao, imajući u vidu da ni jedna paradigma ne rešava sve probleme na najlakši ili najefikasniji način.

Jedan primer je C#, koji uključuje imperativne i objektno-orijentisane paradigme kao i podršku za funkcionalno programiranje sa mogućnostima kao što su delegati (dozvoljavanje potprogramima da budu tretirani kao objekti prvog reda), tip zaključka, Anonimna funkcija i Language Integrated Query. Drugi primeri su F# i Scala, koji omogućavaju slične mogućnosti kao C# ali koje uključuju podršku za funkcionalno programiranje. Verovatno najekstremniji primer je Oz, koji ima podskupove koji se pridržavaju na logiku (Oz silazi iz logičkog programiranja), funkcionalnih, objektno-orijentisanih i ostalih paradigmi. Oz je dizajniran tokom desetogodišnjeg perioda da spoji na harmonijski način koncepte koji su tradicionalno povezani sa različitim programskim paradigmama. Lisp, koji je obično smatran funkcionalnim jezikom, je poznat po svojoj kovnosti i time svojoj sposobnosti da proguta mnoge paradigme.

Reference[uredi | uredi izvor]

  1. ^ Nørmark, Kurt.
  2. ^ Coenen, Frans (11. 10. 1999). „Characteristics of declarative programming languages”. cgi.csc.liv.ac.uk. Pristupljeno 20. 02. 2014. 
  3. ^ a b Covington, Michael A. (23. 08. 2010). „CSCI/ARTI 4540/6540: First Lecture on Symbolic Programming and LISP” (PDF). University of Georgia. Arhivirano iz originala (PDF) 07. 03. 2012. g. Pristupljeno 20. 11. 2013. 
  4. ^ Peter Van Roy (12. 05. 2009). „Programming Paradigms for Dummies: What Every Programmer Should Know” (PDF). info.ucl.ac.be. Pristupljeno 27. 01. 2014. 
  5. ^ Rubin, Frank (1987). „'GOTO Considered Harmful' Considered Harmful” (PDF). Communications of the ACM. 30 (3): 195—196. doi:10.1145/214748.315722. Arhivirano iz originala (PDF) 20. 03. 2009. g. Pristupljeno 19. 11. 2015. 
  6. ^ Krishnamurthi, Shriram (2008). „Teaching programming languages in a post-linnaean age”. SIGPLAN. ACM. str. 81—83. Not. 43, 11. 
  7. ^ Floyd, R. W. (1979). „The paradigms of programming”. Communications of the ACM. 22 (8): 455. doi:10.1145/359138.359140. 
  8. ^ „Mode inheritance, cloning, hooks & OOP (Google Groups Discussion)”. [dead link]
  9. ^ „Business glossary: Symbolic programming definition”. allbusiness.com. Pristupljeno 30. 07. 2014. 
  10. ^ „Multi-Paradigm Programming Language”. developer.mozilla.org. Arhivirano iz originala 21. 08. 2013. g. Pristupljeno 21. 10. 2013. 

Spoljašnje veze[uredi | uredi izvor]