Кіріспе
Бағдарламалау парадигмасы – компьютерлік бағдарламалау парадигмасы.
the computer programming paradigm
Процедуралық бағдарламалау – бұл императивті бағдарламалауға жататын, компьютерлік бағдарламаның әрекетін процедуралар (ә. к. а. функциялар, кіші бағдарламалар) арқылы іске асыруды қамтитын бағдарламалау парадигмасы. Бұл процедуралар бір-бірін шақырады. Нәтижесіндегі бағдарлама – оның құрамдас бөліктеріне шақырулардың иерархиясын құрайтын қадамдар тізбегі. Алғашқы маңызды процедуралық бағдарламалау тілдері шамамен 1957–1964 жылдары пайда болды, олардың ішінде Fortran, ALGOL, COBOL, PL/I және BASIC тілдері бар. Pascal және C тілдері шамамен 1970–1972 жылдары жарық көрді. Компьютерлік процессорлар стек регистрі және процедураларды шақыру және олардан қайту үшін арналған нұсқаулар арқылы процедуралық бағдарламалауға аппараттық қолдау көрсетеді. Бағдарламалаудың басқа түрлеріне, мысалы, Lisp машиналары немесе Java процессорларына аппараттық қолдау көрсету мүмкін болған, бірақ коммерциялық тұрғыдан сәттілікке жетілген жоқ.
Даму практикасы
Кейбір бағдарламалық жасақтаманы әзірлеу тәсілдері сапаны жақсарту және әзірлеу мен күтіп ұстау шығындарын азайту мақсатымен процедуралық бағдарламалауда жиі қолданылады.
Модульділік және ауқымдылық
Модульділік – бағдарламаның процедураларын әрқайсысы нақты және түсінікті мақсаты бар жеке модульдерге ұйымдастыру. Айнмалылар мен процедуралардың қолданыс аймағын шектеу процедуралар мен модульдердің түсіну деңгейін жеңілдету арқылы бағдарламалық қамтамасыз ету сапасын арттырады. Модульділігі жоқ немесе кең қолданыс аймағына ие бағдарламаларда, басқа процедуралар да қолданатын көптеген айнмалыларды пайдаланатын процедуралар кездеседі. Мұндай кодты түсіну және оны қолдау қиынға соғады.
Ортақ пайдалану
Процедура нақты анықталған интерфейсті көрсете алатын және дербес болғандықтан, кодты қайта пайдалануға, әсіресе бағдарламалық кітапхана арқылы, мүмкіндік береді.
Императивті бағдарламалау
Процедуралық бағдарламалау императивті бағдарламалаудың бір түрі болып саналады, себебі ол орындалуға тікелей команда беруді қамтиды. Процедуралық бағдарламалау императивтің кіші класы болып табылады, өйткені процедуралық бағдарламалау блоктар мен ауқымдар ұғымдарын қамтиды, ал императивті бағдарламалау мұндай мүмкіндіктерді қажет етпейтін, көбірек жалпылама ұғымды сипаттайды. Процедуралық тілдер әдетте бақылау ағынын іске асыру үшін, мысалы, if, while және for сияқты резервтелген сөздерді пайдаланады, ал құрылымдық емес императивті тілдер (яғни, тілдік жинақтау тілі) осы мақсатта goto және тармақтау кестелерін қолданады.
Функционалдық бағдарламалау
Функционалдық тілдердегі модульдік принциптер мен кодты қайта пайдалану, процедуралық тілдердегідей, өйткені екеуі де құрылымдық бағдарламалаудан туындайды. Мысалы:
Процедуралар функцияларға сәйкес келеді. Екеуі де бағдарламаның әртүрлі бөліктерінде және оның орындалу кезеңдерінің әртүрлі нүктелерінде бірдей кодты қайта пайдалануға мүмкіндік береді. Сол сияқты, процедура шақырулары функция қолданылуына сәйкес келеді. Функциялар және олардың модульдік бөлінуі бір-бірінен бірдей түрде, функция аргументтерін, қайтару мәндерін және айнымалылардың ауқымын пайдалану арқылы жүзеге асырылады. Стильдер арасындағы басты айырмашылық – функционалдық бағдарламалау тілдері процедуралық бағдарламалаудың императивті элементтерін жояды немесе кемсітеді. Сондықтан функционалдық тілдердің мүмкіндіктері бағдарламаларды мүмкіндігінше таза функциялар тұрғысынан жазуға қолдау көрсетуге бағытталған:
Процедуралық тілдер бағдарламаның орындалуын ортақ күйді өзгерте алатын императивті командалар тізбегі ретінде моделідейді, ал функционалдық бағдарламалау тілдері орындалуын аргументтер мен қайтару мәндеріне ғана тәуелді күрделі өрнектерді бағалау ретінде моделідейді. Осы себепті функционалдық бағдарламаларда код орындалуының еркін тәртібі болуы мүмкін, ал тілдер бағдарламаның әртүрлі бөліктері орындалатын тәртіпке аз бақылау жасай алады; мысалы, Scheme тіліндегі процедура шақыру аргументтері кездейсоқ тәртіппен бағаланады. Функционалдық бағдарламалау тілдері бірінші сыныпты функцияларды, анонимді функцияларды және жабылуларды қолдайды (және кеңінен пайдаланады), бірақ бұл түсініктер кем дегенде Algol 68 тілінен бастап процедуралық тілдерге де енгізілген. Функционалдық бағдарламалау тілдері императивті циклдық конструкциялардың орнына құйрық шақыруларын оңтайландыруға және жоғары ретті функцияларға сүйенуге бейім. Дегенмен, көптеген функционалдық тілдер шын мәнінде толыққанды функционалды емес және бағдарламашыға бағдарламаларды процедуралық стильде немесе екі стильдің комбинациясында жазуға мүмкіндік беретін императивті/процедуралық конструкцияларды ұсынады. Функционалдық тілдердегі кіріс/шығыс кодының процедуралық стильде жазылуы жиі кездеседі. Бағдарламалауды қиын ету үшін (соның салдарынан, күрделі ету үшін) құрылымдық бағдарламалау принциптерін ұстанбайтын бірнеше эзотерикалық функционалдық тілдер (мысалы, Unlambda) бар. Бұл тілдер процедуралық және функционалдық тілдердің ортақ негізінен ерекшеленеді.
Procedures correspond to functions. Both allow the reuse of the same code in various parts of the programs, and at various points of its execution. By the same token, procedure calls correspond to function application. Functions and their modularly separated from each other in the same manner, by the use of function arguments, return values and variable scopes. The main difference between the styles is that functional programming languages remove or at least deemphasize the imperative elements of procedural programming. The feature set of functional languages is therefore designed to support writing programs as much as possible in terms of pure functions:
Whereas procedural languages model execution of the program as a sequence of imperative commands that may implicitly alter shared state, functional programming languages model execution as the evaluation of complex expressions that only depend on each other in terms of arguments and return values. For this reason, functional programs can have a free order of code execution, and the languages may offer little control over the order in which various parts of the program are executed; for example, the arguments to a procedure invocation in Scheme are evaluated in an arbitrary order. Functional programming languages support (and heavily use) first class functions, anonymous functions and closures, although these concepts have also been included in procedural languages at least since Algol 68. Functional programming languages tend to rely on tail call optimization and higher order functions instead of imperative looping constructs. Many functional languages, however, are in fact impurely functional and offer imperative/procedural constructs that allow the programmer to write programs in procedural style, or in a combination of both styles. It is common for input/output code in functional languages to be written in a procedural style. There do exist a few esoteric functional languages (like Unlambda) that eschew structured programming precepts for the sake of being difficult to program in (and therefore challenging). These languages are the exception to the common ground between procedural and functional languages.