Парадигме програмирања
Парадигме програмирања је основни стил програмирања, служећи као начин прављења структуре и елемената рачунарских програма. Могућности и стилови разних програмских језика су дефинисани од стране њихових подржаних програмских парадигми; неки програмски језици су дизајнирани да прате само једну парадигму, док други подржавају вишеструке парадигме.
Парадигме програмирања које су често разликоване укључују императивно, декларативно, функционално, објектно-оргјентисано, процедурално, логичко и симболичко програмирање.[1][2][3] Са различитим парадигмама, програми могу бити виђени и уграђени на различите начине; на пример, у објектно-оријентисаном програмирању, програм је скуп објеката који интерагују у експлицитно дефинисаним начинима, док у декларативном програмирању рачунару је само речено шта је проблем, али не и како га решити.
Преглед
уредиКао што је инжењеринг софтвера (као процес) дефинисан разликовањем методологија, тако да су програмски језици (као модели рачунања) дефинисани разликовањем парадигми. Неки језици су дизајнирани да подржавају једну посебну парадигму (Smalltalk подржава овјектно-оријентисано програмирање, Haskell подржава функционално програмирање), док остали језици програмирања подржавају вишеструке парадигме (као што су Object Pascal, C++, Java, C#, Scala, Visual Basic, Common Lisp, Scheme, Perl, Python, Ruby, Oz и F#). На пример, приграми написани у C++ или Object Pascal могу бити искључиво процедурални, објектно-оријентисани, или могу саджати елементе оба или других парадигми. Програмски дизајнери и програмери одлучују како ће се кориситити ти елементи парадигми.
У објектно-оријентисаном програмирању, програмери могу сматрати програм као скуп интерактивних објеката, док у функционалном програмирању програм може бити сматран као секвена евалуација функције која нема стање. Приликом програмирања рачунара или система са много процесора, процесно-оријентисано програмирање омогућава програмерима да мисле на апликације као скупове конкурентских процеса који делују на логичко дељене структуре података.
Многе парадигме програмирања су такође познате по техникама које оне забрањују као и оне које омогућавају. На пример, чисто функционално програмирање не дозвољава коришћење side-effects, док структуирано програмирање не дозвољава коришћење GoTo изјава. Делом због овог разлога, нове парадигме су често сматране као доктриниране или превише круте од стране оних који су навикли на раније стилове.[5] Избегавајући одређене технике може, ипак, учинити лакшим при доказивању теорема око тачности програма, или једноставно да се разуме њено понашање.
Парадигме програмирања такође могу бити поређене са моделима програмирања које су апстракције рачунарских система. На пример, "Фон Нојманова архитектура" је модел програмирања коришћен у традиционалним секвенцијалним рачунарима. За паралелну обраду, постоје многи могући модели типично рефлектујучи начине на који процесору могу бити повезани међусобом. Они најчешћи су засновани на дељеној меморији, дистрибуираној меморији са прослеђивањем порука, или на хибриду ова два.
Неки истраживачи програмских језика критикују појам парадигми као класификацију програмских језика, нпр. Krishnamurthi.[6] Они се препиру да многи програмски језици не могу бити стриктно класификовани у једну парадигму, већ да укључују могућности из неколико парадигми.
Историја
уредиРазличити приступи програмирању су се појавили током времена, идентификовани као такви у том тренутку или ретроспективно. Рани приступ свесно идентификован као такав је структуирано програмирање, подржаван још од средине 1960. Концепрт "парадигме програмирања" као такав потиче још од 1978, Током предавања на Тјуринговој награди Роберта Флојда, са именом Парадигме Програмирања, који наводи појам коришћен од стране Томаса Кухна у његовој Структура Научних Револуција (1962).[7]
Машински код
уредиПарадигме програмирања ниског нивоа су кодови машинској језика, који директно представљају инструкције (садржај меморије програма) као секвенцу бројева, и асемблера где су машинске инструкције представљене од стране mnemonics и меморијским адресама могу бити додељене симболичке ознаке. Они су понекад названи првим- и друго-генерацијски језицима.
Током 1960, језици асемблера су развијени да подржавају библиотеку COPY и прилично софистициране макро-генерацијске и већ обрађене могућности, CALL на (потпрограм), спољне променљиве и честе делове (глобалне), омогућавајући значајно поновно коришћење кода и изолацију од хардвера преко коришћења логичких оператора као што су READ/WRITE/GET/PUT. Асемблер је био, а и даље је, коришћен за системе у критичном времену и често у уграђеним системима јер пружа највише директну контролу над оним на шта машина ради.
Процедурални језици
уредиСледеће напредовање је био развој процедуралних језика. Ови треће-генерацијски језици (први описан као програмски језик високог нивоа) користе вокабулар везани за проблем који се решава. На пример,
- COBOL (COmmon Business Oriented Language) – користи термине као што су file, move и copy.
- FORTRAN (FORmula TRANslation) – користи терминологију математичког језика, направљен је највише за решавање научних и инжењерских проблема .
- ALGOL (ALGOrithmic Language) – фокусиран на бивање одговарајућег језика за дефинисање алгоритама, користећи се терминологијом математичког језика и циљајући на научне и инжењерске проблеме као FORTRAN.
- PL/I (Programming Language One) – хибрид језика у комерцијалне/научне сврхе подржавајући показиваче.
- BASIC (Beginners All purpose Symbolic Instruction Code) – направљен је да омогући више људи да пишу програме
- C – програмски језик генералне примене, првобитно направљен од стране Диниса Ричи између 1969. и 1973.
Сви ови језици прате процедуралну парадигму. Такорећи, они описују, корак по кора, тачно ону процедуру коју би требало, према одређеном програмеру, и прате решавање одређеног проблема. Делотворност и Алгоритамска ефикасност било каквог решења су оба потпуно субјективна и високо зависна од искуства програмера, инвентивности и могућности.
Објектно-оријентисано програмирање
уредиПратећи распрострањено коришћење процедуралних јетика, објектно-оријентисани језици као што су Simula, Smalltalk, C++, C#, Eiffel и Јава су направљени. У овим језицима, податак и методе манипулисања податком су сачувани као једна јединица названа објекат. Једини начин на који корисник може приступити податку је преко "метода" објекта; као резултат, унутрашњи радови објекта могу бити промењени без мењања било ког кода који се користи објектом. Постоји и даље неке контроверзије од стране Александра Степанова, Ричарда Столмана[8] и других програмера, у вези ефикасности ООП парадигми против процедуларних парадигми. Полиморфизам је осмишљен као један од покушаја да се реши ова недоумица.
Зато што је објекто-оријентисано програмирање сматрано парадигмом, а не језиком, могуће је направити и објектно-оријентисани језички асемблер. Асемблер високог нивоа (HLA) је пример овога који потпуно подржава напредне типове податка и објектно-оријентисан језик програмирања асемблера – упркос његовим раним пореклима. Тиме, разликовање програмских парадигми може бити сматрано више као "мотивациони мем" њених надређених – више него неопходно представљање напретка од једног нивоа до следећег. Прецизна поређења ефикасности програмских парадигми су често прављена тежим због нове и различите терминологије примењене на сличне јединице и процесе такође са многобројним имплементацијама разлика кроз језике.
Даље парадигме
уредиЛитерално програмирање, као облик императивног програмирања, структуира програме као веб фокусиран око човека, као у есеју хипертекста: документација је интеграл програма, и програм је структуиран пратећи се логиком експозиције прозе, уместо конвенције компајлера.
Независно од императивне гране, парадигме декларативног програмирања су направљене. У овим језицима, рачунарима је речено шта је проблем, али не и како га решити – програм је структуиран као скуп атрибута да нађе очекивати резултат, не као процедуру коју ће да прати. Дајући му базу података или скуп правила, рачунар покушава да нађе решење које задовољава све задате атрибуте. Архетипски пример декларативног језика је четврта генерација програмског језика SQL, као и породица функционалних језика и логичког програмирања.
Функционално програмирање је подскуп декларативног програмирања. Програми написани коришћењем ове парадигме користе потпрограме, блокове кода направљеним да се понашају као математичке функције. Функционални језици обесхрабрују промене у вредностима променљивих кроз доделу, чинећи коришћење рекурзијом доброј идејом.
Логичко програмирање гледа рачунање као аутоматско резоновање преко корпуса знања. Чињенице око проблема домена су изражене као лофичке формуле, и програми су извршени применом правила закључка на њима док није нађен одговор за проблем, или скуп формула није доказан недоследним
Знаковно програмирање је парадигма која описује програме које могу да манипулишу формулама и компонентама програма као подацима.[3] Програми зато мофу ефективно уређивати сами себе, и "учити саме себе", чинећи их погодним за апликације за вештачку интелигенцију, експертске системе, обраду природних језика и рачунарске игре. Језици који подржавају ову парадигму укључују LISP и Prolog.[9]
Вишеструка парадигма
уредиПрограмски језик вишеструке парадигме је програмски језик који подржава више од једне програмске парадигме.[10] Циљ дизајна оваквих језика је омогућавање програмерима да користе њима најодговарајући стил програмирања и повезаних конструкција језика за одређени посао, имајући у виду да ни једна парадигма не решава све проблеме на најлакши или најефикаснији начин.
Један пример је C#, који укључује императивне и објектно-оријентисане парадигме као и подршку за функционално програмирање са могућностима као што су делегати (дозвољавање потпрограмима да буду третирани као објекти првог реда), тип закључка, Анонимна функција и Language Integrated Query. Други примери су F# и Scala, који омогућавају сличне могућности као C# али које укључују подршку за функционално програмирање. Вероватно најекстремнији пример је Oz, који има подскупове који се придржавају на логику (Oz силази из логичког програмирања), функционалних, објектно-оријентисаних и осталих парадигми. Oz је дизајниран током десетогодишњег периода да споји на хармонијски начин концепте који су традиционално повезани са различитим програмским парадигмама. Lisp, који је обично сматран функционалним језиком, је познат по својој ковности и тиме својој способности да прогута многе парадигме.
Референце
уреди- ^ Nørmark, Kurt.
- ^ Coenen, Frans (11. 10. 1999). „Characteristics of declarative programming languages”. cgi.csc.liv.ac.uk. Приступљено 20. 02. 2014.
- ^ а б Covington, Michael A. (23. 08. 2010). „CSCI/ARTI 4540/6540: First Lecture on Symbolic Programming and LISP” (PDF). University of Georgia. Архивирано из оригинала (PDF) 07. 03. 2012. г. Приступљено 20. 11. 2013.
- ^ Peter Van Roy (12. 05. 2009). „Programming Paradigms for Dummies: What Every Programmer Should Know” (PDF). info.ucl.ac.be. Приступљено 27. 01. 2014.
- ^ Rubin, Frank (1987). „'GOTO Considered Harmful' Considered Harmful” (PDF). Communications of the ACM. 30 (3): 195—196. doi:10.1145/214748.315722. Архивирано из оригинала (PDF) 20. 03. 2009. г. Приступљено 19. 11. 2015.
- ^ Krishnamurthi, Shriram (2008). „Teaching programming languages in a post-linnaean age”. SIGPLAN. ACM. стр. 81—83. Not. 43, 11.
- ^ Floyd, R. W. (1979). „The paradigms of programming”. Communications of the ACM. 22 (8): 455. doi:10.1145/359138.359140.
- ^ „Mode inheritance, cloning, hooks & OOP (Google Groups Discussion)”.[dead link]
- ^ „Business glossary: Symbolic programming definition”. allbusiness.com. Приступљено 30. 07. 2014.
- ^ „Multi-Paradigm Programming Language”. developer.mozilla.org. Архивирано из оригинала 21. 08. 2013. г. Приступљено 21. 10. 2013.
Спољашње везе
уреди- Classification of the principal programming paradigms
- How programming paradigms evolve and get adopted? Архивирано на сајту Wayback Machine (3. март 2016)