Корисник:Јованвасиљевицц
Начин описивања проблема у декларативним програмским језицима
[уреди]Постоје две различите поделе програмирања:
На процедурално и декларативно, где се под процедуралном парадигмом подразумевају сви језици у којима програмер описује процедуру (алгоритам, поступак), а за декларативно је потребно да се рачунару опише само проблем који треба да реши, и он ће га сам решити. У овој подели су императивна и објектно оријентисана парадигма подврсте процедуралне. Код императивне парадигме, програмер задаје алгоритам коришћењем наредби. Декларативна парадигма се дели на функционалну и логичку. Програмирање се дели на императивно и декларативно, где се под императивном парадигмом подразумева свако програмирање у којем програмер описује алгоритам решавања проблема. Процедурална парадигма је овде подврста императивне, и тада се програми пишу тако што се сложен проблем разбије на више потпроблема, који се решавају писањем појединачних функција и процедура. Императивна и процедурална парадигма су веома тесно повезане и обе поделе су валидне. Процедуралну парадигму користе језици C, C++, C#, Pascal, Ada, машински и асемблерски језици.
Императивна парадигма
[уреди]Императивни програми се састоје из низа наредби преко којих рачунар добија задатак како да измени податке из меморије. Машински и асемблерски језици су императивни; они користе наредбе да управљају обрадом података у процесору.
Текуће стање је веома битно за извршавање императивних програма. Оно се мења током извршавања програма и одређују га променљиве које тај програм користи. Ово стање се назива и мутабилно, јер се подаци чувани у променљивима могу мењати. Основна наредба за мењање стања је наредба доделе, где се променљивој додељује нека вредност. Ове парадигме користе итерације; до коначног решења се долази тако што се мало по мало ажурирају вредности променљивих. Итерације се остварују преко петљи. На пример, оператори ++ и -- мењају вредност променљиве за 1. За њих се каже да имају бочни ефекат, јер приликом позива мењају вредности глобалних променљивих. Функције које врше интеракције са улазно-излазним уређајима такође имају бочни ефекат.
Процедурално програмирање у смислу потпрограма
[уреди]Процедурално програмирање подразумева увођење потпрограма како би се програм разбио на већи број мањих програма. Постоје две врсте потпрограма:
- Функције
– слично као функције у математици, њихова улога је да на основу датих аргумената дају неки крајњи резултат.
- Процедуре
– служе да остваре неки бочни ефекат.
Програмски језик Pascal је за ове две врсте потпрограма користио различите речи (function и procedure), док се у језику C процедуре остварују као функције. Међутим, у чистим функционалним програмским језицима (нпр. Haskell) функције не могу да имају бочне ефекте.
Дакле, за сваки јасно дефинисан потпроблем дефинише се функција (или процедура) којом се он решава. Потпрограми позивају једни друге све до главног програма од којег почиње извршавање. Ово тече одозго-нанише.
Уведен је концепт локалних променљивих да би процедуре што мање зависиле од остатка програма. Вредности се преносе у потпрограме и враћа се резултат.
Подела програма на мање делове је покренула модуларизацију. Након издвајања потпрограма, јавља се потреба за организовањем сродних функција и података којима оне оперишу у модуле, тј. библиотеке које се затим могу укључити и користити у већем броју програма.
Имплементација потпрограма је захтевала унапређивање компилатора и реорганизацију меморије (поделу на програмски стек, хип, сегмент података и сегмент кода), а када су ти проблеми решени, дошло се до много боље организације сложених програма.
Неке функције могу да позивају саме себе (рекурзивна функција). Рекурзивна функција даје много декларативнији опис него класична итеративна имплементација, јер се рачунару заправо не описује како ова вредност треба да се израчуна. Рекурзија се много интензивније користи у склопу функционалног и логичког програмирања.
Предности и мане процедуралне парадигме
[уреди]С обзиром на то да је ова парадигма једна од најстаријих, веома је блиска принципима функционисања хардвера. Највећа предност је што се програми прилично директно могу превести на асемблерски и машински језик.
Бочни ефекти могу прилично да закомпликују анализу програма. Ако функција користи и мења глобалне променљиве, могуће је да се иста функција позове са истим аргументима више пута и да сваки пут да различит резултат и произведе различит ефекат. То намеће програмеру обавезу да мисли о редоследу и историји позива функција. Ако нека глобална променљива има погрешну вредност, пошто било која функција може да јој приступи и да је промени, дебаговање подразумева да се проанализирају све функције и да се провери која од њих приступа и мења ту глобалну променљиву, што може бити веома компликовано.
Тестирање функција са бочним ефектима је проблематично. Чисте функције се једноставно тестирају тако што се једном покрену на карактеристичним тест-примерима. Са друге стране, функције са бочним ефектима није могуће тестирати изоловано од остатка програма.
Функције са бочним ефектима немају референцијалну транспарентност, што значи да се у коду не могу заменити својим повратним вредностима. На пример, где год се у програмском коду јави позив функције факторијел(5), он може бити замењен вредношћу 120, без икаквог утицаја на остатак програма (под претпоставком да је израчунавање факторијела имплементирано на уобичајени начин, без споредних ефеката).