Кіріспе
Жоғары деңгейдегі компьютерлік бағдарламалау тұжырымдамасы және бағдарламалау тілдерінің жіктелуі. Бағдарламалау парадигмасы – компьютерлік бағдарламаны іске асыруды құрылымдау және тұжырымдаудың салыстырмалы жоғары деңгейдегі тәсілі. Бағдарламалау тілі бір немесе бірнеше парадигманы қолдайтын ретінде жіктелуі мүмкін. Парадигмалар бағдарламалаудың әртүрлі өлшемдері бойынша бөлінеді және сипатталады. Кейбір парадигмалар орындау моделінің салдарымен, мысалы, жанама әсерлерге рұқсат етумен немесе операциялар тізбегі орындау моделімен анықталуымен байланысты. Басқа парадигмалар кодты ұйымдастыру тәсілімен, мысалы, күй мен мінез-құлқы бар бірліктерге топтастырумен айналысады. Тағы басқалары синтаксис және грамматикаға қатысты. Көп қолданылатын бағдарламалау парадигмалары (иерархиялық байланыста көрсетілген):
Императивті – код тікелей орындау ағынын және күйін өзгертуді басқарады.
Процедуралық – бір-бірін шақыратын процедуралар түрінде ұйымдастырылған.
Объектіге бағытталған – дерек құрылымын және оған байланысты мінез-құлқы бар объектілер түрінде ұйымдастырылған.
Декларативті – қажетті нәтиженің қасиеттерін жариялайды, бірақ оны қалай есептеу керектігін көрсетпейді.
Функционалдық – қажетті нәтиже функциялар тізбегінің бағалау нәтижесі ретінде жарияланады.
Логикалық – қажетті нәтиже фактілер мен ережелер жүйесіне қатысты сұраққа жауап ретінде жарияланады.
Реактивті – қажетті нәтиже дерек ағыны және өзгерістердің таралуы арқылы жарияланады.
classification of programming languages
A programming paradigm is a relatively high level way to structure and conceptualize the implementation of a computer program. A programming language can be classified as supporting one or more paradigms. Paradigms are separated along and described by different dimensions of programming. Some paradigms are about implications of the execution model, such as allowing side effects, or whether the sequence of operations is defined by the execution model. Other paradigms are about the way code is organized, such as grouping into units that include both state and behavior. Yet others are about syntax and grammar. Some common programming paradigms include (shown in hierarchical relationship):
Imperative code directly controls execution flow and state change
procedural organized as procedures that call each other
object oriented organized as objects that contain both data structure and associated behavior
Declarative code declares properties of the desired result, but not how to compute it
functional a desired result is declared as the value of a series of function evaluations
logic a desired result is declared as the answer to a question about a system of facts and rules
reactive a desired result is declared with data streams and the propagation of change
Шолу
Бағдарламалау парадигмалары компьютерлік ғылымның бағдарламалық қамтамасыз етуді әзірлеудің қалыптасқан тәжірибесін зерттеуінен туындайды. Осы зерттеулер бағдарламалау тәсілдерін және бағдарламаларды кодтау үшін қолданылатын тілдерді сипаттауға және салыстыруға мүмкіндік береді. Бағдарламалық жасақтаманы жасау процестерін зерттейтін және оларды сипаттау мен салыстыру үшін әртүрлі әдістемелерді ұсынатын басқа зерттеулер де бар. Бағдарламалау тілін парадигмалық тұрғыдан сипаттауға болады. Кейбір тілдер тек бір парадигманы қолдайды. Мысалы, Smalltalk объектіге бағытталған, ал Haskell функционалдық парадигманы қолдайды. Көптеген тілдер бірнеше парадигманы қолдайды. Мысалы, C++, Object Pascal немесе PHP тілдерінде жазылған бағдарлама таза процедуралық, таза объектіге бағытталған болуы мүмкін, немесе екі парадигманың да, немесе басқа парадигмалардың да элементтерін қамтуы мүмкін. Бірнеше парадигманы қолдайтын тілді пайдаланғанда, дамытушы қандай парадигма элементтерін қолданатынын таңдайды. Бірақ бұл таңдау міндетті түрде парадигмаларды ескеруді білдірмейді. Дамытушы көбінесе тілдің мүмкіндіктерін, тіл ұсынғандай және оны білетін дәрежеде пайдаланады. Нәтижесінде пайда болған кодты парадигма бойынша жіктеу көбінесе кейіннен жасалатын академиялық шара болып табылады. Императивті парадигма ретінде қарастырылатын тілдердің екі негізгі ерекшелігі бар: олар операциялардың орындалу ретін анықтайды, бұл реттілікті нақты басқаратын конструкциялармен, және олар жанама әсерлерге мүмкіндік береді, онда жағдай бір уақытта, бір код бөлігінде өзгертілуі мүмкін, содан кейін басқа код бөлігінде басқа уақытта оқылады. Код бөліктері арасындағы байланыс нақты емес. Керісінше, декларативті парадигмадағы тілдер операцияларды орындау ретін көрсетпейді. Олар жүйеде қол жетімді операциялардың тізімін және олардың әрқайсысын орындауға рұқсат етілген шарттарды ұсынады. Тілдің орындалу моделінің іске асырылуы қай операцияларды орындауға болады және олардың ретін өздігінен таңдайды. Көп парадигмалы бағдарламалау тілдерін салыстыру туралы көбірек ақпаратты мына жерден табуға болады. Объектіге бағытталған бағдарламалауда код объектілерге ұйымдастырылады, олар күйге ие және олардың кодымен меншікке алынып, (әдетте) басқарылады. Көптеген объектіге бағытталған тілдер сонымен қатар императивті тілдер болып табылады. Объектіге бағытталған бағдарламалауда бағдарламалар өзара әрекеттесетін объектілер жиынтығы ретінде қарастырылады. Функционалдық бағдарламалауда бағдарламалар күйсіз функцияларды бағалау тізбегі ретінде қарастырылады. Көп процессорлы компьютерлерді немесе жүйелерді бағдарламалау кезінде процесске бағытталған бағдарламалауда бағдарламалар логикалық ортақ дерек құрылымдарымен әрекеттесетін бір мезгілдегі процестер жиынтығы ретінде қарастырылады. Көптеген бағдарламалау парадигмалары қолдайтын әдістермен қатар, тыйым салатын әдістерімен де танымал. Мысалы, таза функционалдық бағдарламалау жанама әсерлерге жол бермейді, ал құрылымдық бағдарламалау goto операторына жол бермейді. Осы себепті, жаңа парадигмалар көбінесе ескілеріне үйренгендер үшін догматикалық немесе тым қатаң деп есептеледі. Дегенмен, белгілі бір әдістерден аулақ болу бағдарламаның мінез-құлқын түсінуді және бағдарламаның дұрыстығы туралы теоремаларды дәлелдеуді жеңілдетеді. Бағдарламалау парадигмаларын бағдарламалау модельдерімен де салыстыруға болады, бұл тек API-ді пайдалану арқылы орындалу моделін шақыруға мүмкіндік береді. Бағдарламалау модельдерін орындалу моделінің ерекшеліктеріне негізделген парадигмаларға жіктеуге болады. Параллель есептеу үшін тілдің орнына бағдарламалау моделін пайдалану жиі кездеседі. Себебі, параллель аппараттың ерекшеліктері аппаратты бағдарламалау үшін қолданылатын абстракцияларға еніп кіреді. Бұл бағдарламашыны алгоритмдегі үлгілерді орындалу моделіндегі үлгілерге бейімдеуге мәжбүр етеді (құрылғының абстракцияға енуіне байланысты енгізілген). Нәтижесінде, ешбір параллель бағдарламалау тілі барлық есептеу мәселелерін жақсы бейімдей алмайды. Сондықтан, базалық реттілікті тілді пайдалану және бағдарламалау моделі арқылы параллель орындалу модельдеріне API шақыруларын қосу ыңғайлырақ. Мұндай параллель бағдарламалау модельдерін аппаратты көрсететін абстракцияларға сәйкес жіктеуге болады, мысалы ортақ жад, хабар алмасу арқылы бөлінетін жад, кодта көрінетін орын ұғымдары және т.б. Бұлар параллель тілдер мен бағдарламалау модельдеріне ғана қатысты бағдарламалау парадигмасының нұсқалары деп санауға болады.
software engineering processes and describes various methodologies to describe and compare them. A programming language can be described in terms of paradigms. Some languages support only one paradigm. For example, Smalltalk supports object oriented and Haskell supports functional. Most languages support multiple paradigms. For example, a program written in C++, Object Pascal or PHP can be purely procedural, purely object oriented, or can contain aspects of both or other paradigms. When using a language that supports multiple paradigms, the developer chooses which paradigm elements to use. But, this choice may not involve considering paradigms per se. The developer often uses the features of a language as the language provides them and to the extent that the developer knows them. Categorizing the resulting code by paradigm is often an academic activity done in retrospect. Languages categorized as imperative paradigm have two main features: they state the order in which operations occur, with constructs that explicitly control that order, and they allow side effects, in which state can be modified at one point in time, within one unit of code, and then later read at a different point in time inside a different unit of code. The communication between the units of code is not explicit. In contrast, languages in the declarative paradigm do not state the order in which to execute operations. Instead, they supply a number of available operations in the system, along with the conditions under which each is allowed to execute. The implementation of the language's execution model tracks which operations are free to execute and chooses the order independently. More at Comparison of multi paradigm programming languages. In object oriented programming, code is organized into objects that contain state that is owned by and (usually) controlled by the code of the object. Most object oriented languages are also imperative languages. In object oriented programming, programs are treated as a set of interacting objects. In functional programming, programs are treated as a sequence of stateless function evaluations. When programming computers or systems with many processors, in process oriented programming, programs are treated as sets of concurrent processes that act on a logical shared data structures. Many programming paradigms are as well known for the techniques they forbid as for those they support. For instance, pure functional programming disallows side effects, while structured programming disallows the goto construct. Partly for this reason, new paradigms are often regarded as doctrinaire or overly rigid by those accustomed to older ones. Yet, avoiding certain techniques can make it easier to understand program behavior, and to prove theorems about program correctness. Programming paradigms can also be compared with programming models, which allows invoking an execution model by using only an API. Programming models can also be classified into paradigms based on features of the execution model. For parallel computing, using a programming model instead of a language is common. The reason is that details of the parallel hardware leak into the abstractions used to program the hardware. This causes the programmer to have to map patterns in the algorithm onto patterns in the execution model (which have been inserted due to leakage of hardware into the abstraction). As a consequence, no one parallel programming language maps well to all computation problems. Thus, it is more convenient to use a base sequential language and insert API calls to parallel execution models via a programming model. Such parallel programming models can be classified according to abstractions that reflect the hardware, such as shared memory, distributed memory with message passing, notions of place visible in the code, and so forth. These can be considered flavors of programming paradigm that apply to only parallel languages and programming models.
Сын
Кейбір бағдарламалау тілдерін зерттеушілер, мысалы Харпер мен Кришнамурти, парадигма ұғымын бағдарламалау тілдерін жіктеу тәсілі ретінде сынап бағалайды. Олар көптеген бағдарламалау тілдерін бір парадигмаға қатаң түрде жатқызу мүмкін емес, олардың көпшілігі бірнеше парадигманың мүмкіндіктерін біріктіреді деп санайды. Көп парадигмалы бағдарламалау тілдерінің салыстырмалы талдауына қараңыз.
Тарих
Бағдарламалауға қатысты әртүрлі тәсілдер уақыт өте келе дамыды. Әрбір тәсілдің жіктелуі сол тәсіл алғаш рет жасалған кезде сипатталды, бірақ көбінесе кейін, кері перспективада сипатталды. Алғашқы, саналы түрде осылай анықталған тәсіл – құрылымдық бағдарламалау, ол 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-те жасаған. Бұл тілдер процедуралық парадигма ретінде жіктеледі. Олар компьютерлік бағдарламаның қадамдық процесін тікелей басқарады. Сондықтан мұндай бағдарламаның тиімділігі және нәтижелілігі бағдарламашының біліктілігіне тікелей байланысты.
COmmon Business Oriented Language (COBOL) uses terms like file, move and copy. FORmula TRANslation (FORTRAN) using mathematical language terminology, it was developed mainly for scientific and engineering problems. ALGOrithmic Language (ALGOL) focused on being an appropriate language to define algorithms, while using mathematical language terminology, targeting scientific and engineering problems, just like FORTRAN. Programming Language One (PL/I) a hybrid commercial scientific general purpose language supporting pointers. Beginners All purpose Symbolic Instruction Code (BASIC) it was developed to enable more people to write programs. C a general purpose programming language, initially developed by Dennis Ritchie between 1969 and 1973 at AT&T Bell Labs. These languages are classified as procedural paradigm. They directly control the step by step process that a computer program follows. The efficacy and efficiency of such a program is therefore highly dependent on the programmer's skill.
Нысанға бағдарланған бағдарламалау
Процедуралық тілдерді жақсарту үшін Simula, Smalltalk, C++, Eiffel, Python, PHP, Java және C# сияқты объектіге бағытталған бағдарламалау тілдері (ООП) құрастырылды. Бұл тілдерде деректер мен оларды өңдеуге арналған әдістер объект деп аталатын бір код бірлігінде болады. Бұл инкапсуляция деректерге қол жеткізудің жалғыз жолы – деректерді қамтитын объектінің әдістері арқылы екенін қамтамасыз етеді. Осылайша, объектінің ішкі жұмысын объектіні пайдаланатын кодқа әсер етпей өзгертуге болады. Александр Степанов, Ричард Столлман және басқа да бағдарламашылар ООП парадигмасының процедуралық парадигмадан тиімділігі туралы пікір қақтығысын тудырды. Әрбір объектінің байланысты әдістерге ие болу қажеттігі кейбір күмәнданғандарды ООП-ті бағдарламалық жасақтаманың көлемін ұлғайтумен байланыстыруға әкелді; бұл мәселені шешуге полиморфизм көмектесті. Көптеген ООП тілдері үшінші буын болғанымен, объектіге бағытталған ассемблерлік тілді жасау мүмкін. Жоғары деңгейдегі Ассемблер (HLA) – бұл оның ерте пайда болуына қарамастан, кеңейтілген дерек түрлерін және объектіге бағытталған ассемблерлік тілде бағдарламалауды толық қолдайтын мысал. Осылайша, әртүрлі бағдарламалау парадигмаларын жақтаушыларының мотивациялық мемдері ретінде қарастыруға болады, олардың бірінен екіншісіне қадам сатыруын білдірмейді. Бәсекелес парадигмалардың тиімділігін дәл салыстыру жиі қиынға соғады, себебі ұқсас ұғымдар мен процестерге қолданылатын жаңа және әртүрлі терминология, сондай-ақ тілдер арасындағы көптеген іске асыру ерекшеліктері бар.
Декларациялық тілдер
Декларативтік бағдарламалау бағдарламасы мәселенің қандай екенін, оны қалай шешу керектігін емес, сипаттайды. Бағдарлама күтілетін нәтижедегі қасиеттер жиынтығы ретінде құрылады, орындалу процедурасы ретінде емес. Деректер қоры немесе ережелер жиынтығы берілгенде, компьютер барлық қажетті қасиеттерге сай келетін шешімді табуға тырысады. Декларативтік тілдің үлгісі – төртінші буын SQL тілі, сондай-ақ функционалдық тілдер мен логикалық бағдарламалау отбасы. Функционалдық бағдарламалау – декларативтік бағдарламалаудың бір бөлігі. Осы парадигманы қолдана отырып жазылған бағдарламалар функцияларды, математикалық функциялар сияқты жұмыс істеуге арналған код блоктарын пайдаланады. Функционалдық тілдер айнымалылардың мәнін тағайындау арқылы өзгертуге тыйым салады, оның орнына рекурсияны кеңінен қолданады. Логикалық бағдарламалау парадигмасы есептеуді білім жиынтығы бойынша автоматтандырылған қорыту ретінде қарастырады. Мәселе аймағы туралы фактілер логикалық формулалар түрінде жазылады, ал бағдарламалар мәселеге жауап табылғанға дейін немесе формулалар жиынтығы қайшы екені дәлелденгенге дейін оларға қорыту ережелерін қолдану арқылы орындалады.
Басқа парадигмалар
Символдық бағдарламалау – формулалар мен бағдарлама компоненттерін дерек ретінде өңдеуге қабілетті бағдарламаларды сипаттайтын парадигма. Дифференциалданатын бағдарламалау бағдарламаларды автоматты дифференциалдау арқылы, олардың бойымен дифференциалдауға болатындай етіп құрылымдайды. Әдеби бағдарламалау, императивті бағдарламалаудың бір түрі ретінде, бағдарламаларды гипермәтіндік эсседегідей, адамға бағытталған желі ретінде ұйымдастырады: құжаттама бағдарламаның ажырамас бөлігі болып табылады және бағдарлама компилятордың ыңғайлылығынан гөрі, прозалық түсіндіру логикасына сәйкес құрылымдалады. Бағдарламаның өзіне сілтеме жасауға мүмкіндік беретін рефлексия сияқты символдық техникалар да бағдарламалау парадигмасы ретінде қарастырылуы мүмкін. Дегенмен, бұл негізгі парадигмалармен үйлесімді болғандықтан, өз алдына жеке парадигма болып табылмайды.