Кіріспе

Жоғары деңгейдегі компьютерлік бағдарламалау тұжырымдамасы және бағдарламалау тілдерінің жіктелуі. Бағдарламалау парадигмасы – компьютерлік бағдарламаны іске асыруды құрылымдау және тұжырымдаудың салыстырмалы жоғары деңгейдегі тәсілі. Бағдарламалау тілі бір немесе бірнеше парадигманы қолдайтын ретінде жіктелуі мүмкін. Парадигмалар бағдарламалаудың әртүрлі өлшемдері бойынша бөлінеді және сипатталады. Кейбір парадигмалар орындау моделінің салдарымен, мысалы, жанама әсерлерге рұқсат етумен немесе операциялар тізбегі орындау моделімен анықталуымен байланысты. Басқа парадигмалар кодты ұйымдастыру тәсілімен, мысалы, күй мен мінез-құлқы бар бірліктерге топтастырумен айналысады. Тағы басқалары синтаксис және грамматикаға қатысты. Көп қолданылатын бағдарламалау парадигмалары (иерархиялық байланыста көрсетілген):
Императивті – код тікелей орындау ағынын және күйін өзгертуді басқарады.
Процедуралық – бір-бірін шақыратын процедуралар түрінде ұйымдастырылған.
Объектіге бағытталған – дерек құрылымын және оған байланысты мінез-құлқы бар объектілер түрінде ұйымдастырылған.
Декларативті – қажетті нәтиженің қасиеттерін жариялайды, бірақ оны қалай есептеу керектігін көрсетпейді.
Функционалдық – қажетті нәтиже функциялар тізбегінің бағалау нәтижесі ретінде жарияланады.
Логикалық – қажетті нәтиже фактілер мен ережелер жүйесіне қатысты сұраққа жауап ретінде жарияланады.
Реактивті – қажетті нәтиже дерек ағыны және өзгерістердің таралуы арқылы жарияланады.

Шолу

Бағдарламалау парадигмалары компьютерлік ғылымның бағдарламалық қамтамасыз етуді әзірлеудің қалыптасқан тәжірибесін зерттеуінен туындайды. Осы зерттеулер бағдарламалау тәсілдерін және бағдарламаларды кодтау үшін қолданылатын тілдерді сипаттауға және салыстыруға мүмкіндік береді. Бағдарламалық жасақтаманы жасау процестерін зерттейтін және оларды сипаттау мен салыстыру үшін әртүрлі әдістемелерді ұсынатын басқа зерттеулер де бар. Бағдарламалау тілін парадигмалық тұрғыдан сипаттауға болады. Кейбір тілдер тек бір парадигманы қолдайды. Мысалы, Smalltalk объектіге бағытталған, ал Haskell функционалдық парадигманы қолдайды. Көптеген тілдер бірнеше парадигманы қолдайды. Мысалы, C++, Object Pascal немесе PHP тілдерінде жазылған бағдарлама таза процедуралық, таза объектіге бағытталған болуы мүмкін, немесе екі парадигманың да, немесе басқа парадигмалардың да элементтерін қамтуы мүмкін. Бірнеше парадигманы қолдайтын тілді пайдаланғанда, дамытушы қандай парадигма элементтерін қолданатынын таңдайды. Бірақ бұл таңдау міндетті түрде парадигмаларды ескеруді білдірмейді. Дамытушы көбінесе тілдің мүмкіндіктерін, тіл ұсынғандай және оны білетін дәрежеде пайдаланады. Нәтижесінде пайда болған кодты парадигма бойынша жіктеу көбінесе кейіннен жасалатын академиялық шара болып табылады. Императивті парадигма ретінде қарастырылатын тілдердің екі негізгі ерекшелігі бар: олар операциялардың орындалу ретін анықтайды, бұл реттілікті нақты басқаратын конструкциялармен, және олар жанама әсерлерге мүмкіндік береді, онда жағдай бір уақытта, бір код бөлігінде өзгертілуі мүмкін, содан кейін басқа код бөлігінде басқа уақытта оқылады. Код бөліктері арасындағы байланыс нақты емес. Керісінше, декларативті парадигмадағы тілдер операцияларды орындау ретін көрсетпейді. Олар жүйеде қол жетімді операциялардың тізімін және олардың әрқайсысын орындауға рұқсат етілген шарттарды ұсынады. Тілдің орындалу моделінің іске асырылуы қай операцияларды орындауға болады және олардың ретін өздігінен таңдайды. Көп парадигмалы бағдарламалау тілдерін салыстыру туралы көбірек ақпаратты мына жерден табуға болады. Объектіге бағытталған бағдарламалауда код объектілерге ұйымдастырылады, олар күйге ие және олардың кодымен меншікке алынып, (әдетте) басқарылады. Көптеген объектіге бағытталған тілдер сонымен қатар императивті тілдер болып табылады. Объектіге бағытталған бағдарламалауда бағдарламалар өзара әрекеттесетін объектілер жиынтығы ретінде қарастырылады. Функционалдық бағдарламалауда бағдарламалар күйсіз функцияларды бағалау тізбегі ретінде қарастырылады. Көп процессорлы компьютерлерді немесе жүйелерді бағдарламалау кезінде процесске бағытталған бағдарламалауда бағдарламалар логикалық ортақ дерек құрылымдарымен әрекеттесетін бір мезгілдегі процестер жиынтығы ретінде қарастырылады. Көптеген бағдарламалау парадигмалары қолдайтын әдістермен қатар, тыйым салатын әдістерімен де танымал. Мысалы, таза функционалдық бағдарламалау жанама әсерлерге жол бермейді, ал құрылымдық бағдарламалау goto операторына жол бермейді. Осы себепті, жаңа парадигмалар көбінесе ескілеріне үйренгендер үшін догматикалық немесе тым қатаң деп есептеледі. Дегенмен, белгілі бір әдістерден аулақ болу бағдарламаның мінез-құлқын түсінуді және бағдарламаның дұрыстығы туралы теоремаларды дәлелдеуді жеңілдетеді. Бағдарламалау парадигмаларын бағдарламалау модельдерімен де салыстыруға болады, бұл тек API-ді пайдалану арқылы орындалу моделін шақыруға мүмкіндік береді. Бағдарламалау модельдерін орындалу моделінің ерекшеліктеріне негізделген парадигмаларға жіктеуге болады. Параллель есептеу үшін тілдің орнына бағдарламалау моделін пайдалану жиі кездеседі. Себебі, параллель аппараттың ерекшеліктері аппаратты бағдарламалау үшін қолданылатын абстракцияларға еніп кіреді. Бұл бағдарламашыны алгоритмдегі үлгілерді орындалу моделіндегі үлгілерге бейімдеуге мәжбүр етеді (құрылғының абстракцияға енуіне байланысты енгізілген). Нәтижесінде, ешбір параллель бағдарламалау тілі барлық есептеу мәселелерін жақсы бейімдей алмайды. Сондықтан, базалық реттілікті тілді пайдалану және бағдарламалау моделі арқылы параллель орындалу модельдеріне API шақыруларын қосу ыңғайлырақ. Мұндай параллель бағдарламалау модельдерін аппаратты көрсететін абстракцияларға сәйкес жіктеуге болады, мысалы ортақ жад, хабар алмасу арқылы бөлінетін жад, кодта көрінетін орын ұғымдары және т.б. Бұлар параллель тілдер мен бағдарламалау модельдеріне ғана қатысты бағдарламалау парадигмасының нұсқалары деп санауға болады.

Сын

Кейбір бағдарламалау тілдерін зерттеушілер, мысалы Харпер мен Кришнамурти, парадигма ұғымын бағдарламалау тілдерін жіктеу тәсілі ретінде сынап бағалайды. Олар көптеген бағдарламалау тілдерін бір парадигмаға қатаң түрде жатқызу мүмкін емес, олардың көпшілігі бірнеше парадигманың мүмкіндіктерін біріктіреді деп санайды. Көп парадигмалы бағдарламалау тілдерінің салыстырмалы талдауына қараңыз.

Тарих

Бағдарламалауға қатысты әртүрлі тәсілдер уақыт өте келе дамыды. Әрбір тәсілдің жіктелуі сол тәсіл алғаш рет жасалған кезде сипатталды, бірақ көбінесе кейін, кері перспективада сипатталды. Алғашқы, саналы түрде осылай анықталған тәсіл – құрылымдық бағдарламалау, ол 1960 жылдардың ортасынан бері қолдау көрсетіп келеді. Бағдарламалау парадигмасының түсінігі кем дегенде 1978 жылға дейін қалыптасты, Роберт В. Флойдтың «Программалау парадигмалары» атты Тьюринг сыйлығына арналған лекциясында, ол Томас Кунның «Ғылыми революциялардың құрылымы» (1962) еңбегінде қолданылған парадигма ұғымын келтіреді. Алғашқы бағдарламалау тілдерінде нақты анықталған бағдарламалау парадигмалары болған жоқ, кейде бағдарламалар goto операторларын кеңінен пайдаланған. Оларды шектен тыс пайдалану түсінуге және қолдауға қиын келетін «макарондық кодқа» әкеп соқты. Бұл goto операторларын пайдалануға тыйым салатын, тек құрылымдық бағдарламалау құрылымдарын ғана пайдалануға рұқсат беретін құрылымдық бағдарламалау парадигмаларын дамытуға себеп болды.

Машина коды

Машиналық код – компьютерлік бағдарламалаудың ең төменгі деңгейі болып табылады, себебі ол компьютердегі ең төменгі абстракция деңгейіндегі мінез-құлқыны анықтайтын машиналық нұсқаулар құрайды. Ол кодтаудың ең нақты әдісі болғандықтан, императивті деп жіктеледі. Оны кейде бірінші буын бағдарламалау тілі деп те атайды.

Құрастыру

Ассемблерлік тіл машиналық нұсқаулар мен жад адрестерін жеңілдету үшін мнемоникаларды енгізді. Ассемблер императивті тіл ретінде жіктеледі және кейде екінші буын бағдарламалау тілі деп аталады. 1960-шы жылдары ассемблерлік тілдер кітапханалық COPY функциясын, сондай-ақ күрделі шартты макростарды жасау және алдын ала өңдеу мүмкіндіктерін, процедураға CALL шақыруды, сыртқы айнымалыларды және ортақ бөлімдерді (глобалдық айнымалыларды) қолдау үшін жасалды. Бұл READ/WRITE/GET/PUT сияқты логикалық операторларды пайдалану арқылы кодты қайта пайдалануға және аппараттық ерекшеліктерден тәуелсіздікке мүмкіндік берді. Ассемблер уақытқа сезімтал жүйелерде және көбінесе кіріктірілген жүйелерде қолданылды және қазір де қолданылуда, себебі ол машинаның қызметін толық бақылауға мүмкіндік береді.

Іс жүргізу тілдері

Процедуралық тілдер, сондай-ақ үшінші буын бағдарламалау тілдері деп аталады, жоғары деңгейдегі тілдер ретінде алғаш рет сипатталған. Олар шешіліп жатқан мәселеге қатысты сөздік қолдайды. Мысалы, COmmon Business Oriented Language (COBOL) файл, жылжыту және көшіру сияқты терминдерді пайдаланады. FORmula TRANslation (FORTRAN) математикалық тіл терминологиясын қолданып, негізінен ғылыми және инженерлік есептерді шешу үшін жасалды. ALGOrithmic Language (ALGOL) алгоритмдерді анықтауға қолайлы тіл болуға бағытталды, математикалық тіл терминологиясын қолдана отырып, FORTRAN сияқты ғылыми және инженерлік есептерді мақсат етті. Programming Language One (PL/I) – көрсеткіштерді қолдайтын, гибридтік коммерциялық-ғылыми, жалпы мақсаттағы тіл. Beginners All purpose Symbolic Instruction Code (BASIC) көбірек адамдарға бағдарлама жазуға мүмкіндік беру үшін әзірленді. C – жалпы мақсаттағы бағдарламалау тілі, бастапқыда Деннис Ритчи 1969-1973 жылдары AT&T Bell Labs-те жасаған. Бұл тілдер процедуралық парадигма ретінде жіктеледі. Олар компьютерлік бағдарламаның қадамдық процесін тікелей басқарады. Сондықтан мұндай бағдарламаның тиімділігі және нәтижелілігі бағдарламашының біліктілігіне тікелей байланысты.

Нысанға бағдарланған бағдарламалау

Процедуралық тілдерді жақсарту үшін Simula, Smalltalk, C++, Eiffel, Python, PHP, Java және C# сияқты объектіге бағытталған бағдарламалау тілдері (ООП) құрастырылды. Бұл тілдерде деректер мен оларды өңдеуге арналған әдістер объект деп аталатын бір код бірлігінде болады. Бұл инкапсуляция деректерге қол жеткізудің жалғыз жолы – деректерді қамтитын объектінің әдістері арқылы екенін қамтамасыз етеді. Осылайша, объектінің ішкі жұмысын объектіні пайдаланатын кодқа әсер етпей өзгертуге болады. Александр Степанов, Ричард Столлман және басқа да бағдарламашылар ООП парадигмасының процедуралық парадигмадан тиімділігі туралы пікір қақтығысын тудырды. Әрбір объектінің байланысты әдістерге ие болу қажеттігі кейбір күмәнданғандарды ООП-ті бағдарламалық жасақтаманың көлемін ұлғайтумен байланыстыруға әкелді; бұл мәселені шешуге полиморфизм көмектесті. Көптеген ООП тілдері үшінші буын болғанымен, объектіге бағытталған ассемблерлік тілді жасау мүмкін. Жоғары деңгейдегі Ассемблер (HLA) – бұл оның ерте пайда болуына қарамастан, кеңейтілген дерек түрлерін және объектіге бағытталған ассемблерлік тілде бағдарламалауды толық қолдайтын мысал. Осылайша, әртүрлі бағдарламалау парадигмаларын жақтаушыларының мотивациялық мемдері ретінде қарастыруға болады, олардың бірінен екіншісіне қадам сатыруын білдірмейді. Бәсекелес парадигмалардың тиімділігін дәл салыстыру жиі қиынға соғады, себебі ұқсас ұғымдар мен процестерге қолданылатын жаңа және әртүрлі терминология, сондай-ақ тілдер арасындағы көптеген іске асыру ерекшеліктері бар.

Декларациялық тілдер

Декларативтік бағдарламалау бағдарламасы мәселенің қандай екенін, оны қалай шешу керектігін емес, сипаттайды. Бағдарлама күтілетін нәтижедегі қасиеттер жиынтығы ретінде құрылады, орындалу процедурасы ретінде емес. Деректер қоры немесе ережелер жиынтығы берілгенде, компьютер барлық қажетті қасиеттерге сай келетін шешімді табуға тырысады. Декларативтік тілдің үлгісі – төртінші буын SQL тілі, сондай-ақ функционалдық тілдер мен логикалық бағдарламалау отбасы. Функционалдық бағдарламалау – декларативтік бағдарламалаудың бір бөлігі. Осы парадигманы қолдана отырып жазылған бағдарламалар функцияларды, математикалық функциялар сияқты жұмыс істеуге арналған код блоктарын пайдаланады. Функционалдық тілдер айнымалылардың мәнін тағайындау арқылы өзгертуге тыйым салады, оның орнына рекурсияны кеңінен қолданады. Логикалық бағдарламалау парадигмасы есептеуді білім жиынтығы бойынша автоматтандырылған қорыту ретінде қарастырады. Мәселе аймағы туралы фактілер логикалық формулалар түрінде жазылады, ал бағдарламалар мәселеге жауап табылғанға дейін немесе формулалар жиынтығы қайшы екені дәлелденгенге дейін оларға қорыту ережелерін қолдану арқылы орындалады.

Басқа парадигмалар

Символдық бағдарламалау – формулалар мен бағдарлама компоненттерін дерек ретінде өңдеуге қабілетті бағдарламаларды сипаттайтын парадигма. Дифференциалданатын бағдарламалау бағдарламаларды автоматты дифференциалдау арқылы, олардың бойымен дифференциалдауға болатындай етіп құрылымдайды. Әдеби бағдарламалау, императивті бағдарламалаудың бір түрі ретінде, бағдарламаларды гипермәтіндік эсседегідей, адамға бағытталған желі ретінде ұйымдастырады: құжаттама бағдарламаның ажырамас бөлігі болып табылады және бағдарлама компилятордың ыңғайлылығынан гөрі, прозалық түсіндіру логикасына сәйкес құрылымдалады. Бағдарламаның өзіне сілтеме жасауға мүмкіндік беретін рефлексия сияқты символдық техникалар да бағдарламалау парадигмасы ретінде қарастырылуы мүмкін. Дегенмен, бұл негізгі парадигмалармен үйлесімді болғандықтан, өз алдына жеке парадигма болып табылмайды.