Кіріспе
Компьютерлік ғылымдағы бағдарламалау парадигмасының түрі
Компьютерлік ғылымда императивті бағдарламалау – бағдарламаның күйін өзгертетін операторларды қолданатын бағдарламалау парадигмасы. Табиғи тілдердегі императивтік рай командаларды білдіргендей, императивтік бағдарлама компьютерге орындалуға тиіс командалардан тұрады. Императивті бағдарламалау бағдарламаның қадамдық жұмыс істеуін сипаттауға, оның күтілетін нәтижелерінің жоғары деңгейдегі сипаттамаларына емес, бағытталған. Бұл термин көбінесе декларативті бағдарламалауға қарама-қарсы қолданылады, ол бағдарламаның нәтижеге қалай жетуі керектігінің барлық егжей-тегжейін көрсетпей, бағдарламаның не істеу керектігіне назар аударады.
Процедуралық бағдарламалау
Процедуралық бағдарламалау – программаның бір немесе бірнеше процедуралардан (сонымен қатар, кіші программалар немесе функциялар деп те аталады) құрылған императивті бағдарламалау түрі. Бұл терминдер көбінесе синонимдер ретінде қолданылады, бірақ процедураларды пайдалану императивті бағдарламалардың түрі мен құрылысына айқын әсер етеді. Мемлекеттік өзгерістер процедураларға локалдастырылған немесе процедураларға берілетін нақты аргументтермен және қайтарым деректерімен шектелген қатаң процедуралық бағдарламалау – құрылымдалған бағдарламалаудың бір түрі. 1960 жылдан бері құрылымдық бағдарламалау және жалпы модульдік бағдарламалау императивті бағдарламалардың қолдауға тоқтаусыз жөндеуін және жалпы сапасын жақсарту тәсілдері ретінде насихатталды. Объектіге бағытталған бағдарламалау концепциялары осы тәсілді кеңейтуге бағытталған. Процедуралық бағдарламалауды декларативті бағдарламалауға жасалған қадам ретінде қарастыруға болады. Бағдарламашы, әдетте, процедуралардың атауларын, аргументтерін және қайтарым түрлерін (және осыған байланысты түсініктемелерді) қарап, белгілі бір процедураның не істеу керектігін, оның нәтижесіне қалай жетудің егжей-тегжейін қарамай-ақ анықтай алады. Сонымен қатар, толық бағдарлама да императивті болып қалады, өйткені ол орындалатын операторлар мен олардың орындалу ретін көбінесе анықтайды.
Императивті бағдарламалаудың негіздері мен негіздері
Барлық компьютерлер үшін бағдарлама жасау үшін қолданылатын бағдарламалау парадигмасы көбінесе императивті үлгіні ұстанады. Цифрлық компьютерлік аппараттық құрал машиналық кодты орындау үшін жасалған, ол компьютерге тән және әдетте императивті стильде жазылады, бірақ кейбір архитектуралар үшін басқа парадигмаларды қолданатын төменгі деңгейдегі компиляторлар мен интерпретаторлар бар, мысалы, Lisp машиналары. Бұл төменгі деңгейдегі көзқарас бойынша бағдарламаның күйі жадтың мазмұнымен анықталады, ал операторлар компьютердің түпкілікті тіліндегі нұсқаулар болып табылады. Жоғары деңгейдегі императивті тілдер айнымалыларды және күрделірек операторларды пайдаланады, бірақ олар әлі де сол парадигманы ұстанады. Рецепттер мен процестік тізімдер компьютерлік бағдарламалар болмаса да, императивті бағдарламалау стиліне ұқсас таныс ұғымдар болып табылады; әр қадам – оператор, ал физикалық әлем күйді сақтайды. Императивті бағдарламалаудың негізгі идеялары түсінік бойынша таныс және аппараттық құралда тікелей бейнеленгендіктен, көптеген компьютерлік тілдер императивті стильде жазылған. Императивті парадигмада тапсырма операторлары жадта орналасқан мәліметтерге операция жасайды және нәтижелерін кейінірек пайдалану үшін жадта сақтайды. Жоғары деңгейдегі императивті тілдер сонымен қатар күрделі өрнектерді бағалауға мүмкіндік береді, олар арифметикалық операциялар мен функцияларды бағалаудың комбинациясынан тұрады, содан кейін алынған мәнді жадқа беруге болады. Цикл операторлары (мысалы, while, do while және for циклдары) операторлар тізбегін бірнеше рет орындауға мүмкіндік береді. Циклдар өздерінің ішіндегі операторларды алдын ала белгіленген санда орындай алады немесе белгілі бір шарт орындалғанға дейін оларды қайта-қайта орындай алады. Шартты тармақталу операторлары операторлар тізбегін тек белгілі бір шарт орындалған жағдайда ғана орындауға мүмкіндік береді. Әйтпесе, операторлар жіберіліп, орындалу тізбегі олардан кейінгі оператордан жалғасады. Шартсыз тармақталу операторлары орындалу тізбегін бағдарламаның басқа бөлігіне көшіруге мүмкіндік береді. Бұларға секіру (көптеген тілдерде goto деп аталады), switch және кіші бағдарлама, кішкентай бағдарлама немесе процедураны шақыру (әдетте шақырудан кейін келесі операторға қайта оралады) кіреді. Жоғары деңгейдегі бағдарламалау тілдерін дамытудың алғашқы кезеңдерінде блоктарды енгізу бағдарламаларды құруға мүмкіндік берді, онда операторлар мен жарияланымдар тобы бір оператор ретінде қарастырылатын болды. Бұл, сонымен қатар кіші бағдарламаларды енгізу арқылы, күрделі құрылымдарды қарапайым процедуралық құрылымдарға иерархиялық түрде бөлу арқылы көрсетуге мүмкіндік берді. Көптеген императивті бағдарламалау тілдері (мысалы, Fortran, BASIC және C) – ассемблер тілінің абстракциялары болып табылады.
Императивті және объектке бағдарланған тілдердің тарихы
Ең алғашқы императивті тілдер бастапқы компьютерлердің машиналық тілдері болды. Бұл тілдерде нұсқаулар өте қарапайым болды, бұл аппараттық іске асыруды жеңілдетті, бірақ күрделі бағдарламаларды жасауға кедергі келтірді. 1954 жылы International Business Machines (IBM) компаниясында Джон Бэкус әзірлеген FORTRAN, күрделі бағдарламаларды жасау кезінде машиналық кодтың тудырған қиындықтарын жойған алғашқы маңызды бағдарламалау тілі болды. FORTRAN – компиляцияланатын тіл, ол аталатын айнымалыларды, күрделі өрнектерді, кіші бағдарламаларды және императивті тілдерде кең таралған көптеген басқа да мүмкіндіктерді қамтиды. Келесі 20 жылдың ішінде көптеген басқа да маңызды жоғары деңгейдегі императивті бағдарламалау тілдері пайда болды. 1950-1960 жылдары математикалық алгоритмдерді оңай бейнелеу үшін ALGOL тілі дамытылды, тіпті кейбір компьютерлер үшін операциялық жүйенің мақсатты тілі ретінде де қолданылды. MUMPS (1966) императивті парадигманы логикалық шегіне дейін жеткізді, ешқандай операторларды пайдаланбады, тек командаларға сүйенді, тіпті IF және ELSE командаларын бір-бірінен тәуелсіз етіп, оларды тек $TEST деп аталатын ішкі айнымалымен байланыстырды. COBOL (1960) және BASIC (1964) бағдарламалау синтаксисін ағылшын тіліне ұқсатуға бағытталған әрекеттер болды. 1970 жылдары Никлаус Вирт Pascal тілін, ал Денис Ричи Bell Laboratories-те жұмыс істеген кезде C тілін жасады. Вирт Modula 2 және Oberon тілдерін жобалауға кірісті. АҚШ Қорғаныс министрлігінің қажеттіліктері үшін Жан Ичбиах және Honeywell компаниясының командасы 1978 жылы Ada тілін жобалауды бастады, бұл тілге қойылатын талаптарды анықтауға арналған 4 жылдық жобадан кейін болды. Тілінің сипаттамасы алғаш рет 1983 жылы жарияланды, содан кейін 1995, 2005 және 2012 жылдары қайта қарастырылды. 1980 жылдары объектіге бағытталған бағдарламалауға қызығушылық күрт өсті. Бұл тілдер императивті стильде болды, бірақ объектілерді қолдау үшін қосымша мүмкіндіктермен толықтырылды. 20-шы ғасырдың соңғы екі онжылдығында осындай көптеген тілдер пайда болды. Smalltalk 80 бағдарламасын 1969 жылы Алан Кей ойлап тапқан, ал 1980 жылы Xerox Palo Alto Research Center (PARC) компаниясы шығарды. Басқа объектіге бағытталған тілдегі ұғымдарға сүйене отырып – Simula (1960 жылдары жасалған әлемдегі алғашқы объектіге бағытталған бағдарламалау тілі деп саналады) – Бьярне Строуструп C тіліне негізделген объектіге бағытталған C++ тілін жасады. C++ тілін жобалау 1979 жылы басталды және алғашқы іске асыру 1983 жылы аяқталды. 1980 және 1990 жылдардың соңында объектіге бағытталған ұғымдарды пайдаланған маңызды императивті тілдер: Ларри Уоллдың 1987 жылы шығарған Perl тілі; Гидо ван Россумның 1990 жылы шығарған Python тілі; Microsoft Foundation Class Library (MFC) 2.0 кіретін Visual Basic және Visual C++ (Microsoft Foundation Class Library (MFC) 2.0), оларды Microsoft 1991 және 1993 жылдары шығарды; Расмус Лердорфтың 1994 жылы шығарған PHP тілі; Джеймс Гослингтің (Sun Microsystems) 1995 жылы шығарған Java тілі, Брендан Эйхтің (Netscape) шығарған JavaScript және Юкихиро "Матц" Мацумотоның 1995 жылы шығарған Ruby тілі. Microsoft-тың .NET Framework (2002) өз негізінде императивті болып табылады, сондай-ақ оның негізгі мақсатты тілдері VB.NET және C# да оған сәйкес жұмыс істейді; алайда Microsoft-тың F# функционалдық тілі де оның үстінде жұмыс істейді.
С
C бағдарламалау тілі (1973) BCPL тілі B тілімен алмастырылғандықтан және AT&T Bell Labs келесі нұсқасын "C" деп атағандықтан осы атты алды. Оның мақсаты UNIX операциялық жүйесін жазу болды. C салыстырмалы түрде кішкентай тіл, сондықтан компиляторларды жазу оңай. Оның дамуы 1980-жылдардағы аппараттық дамумен қатар жүрді. Бір аймақ – инициализацияланған деректер сегменті деп аталады, онда бастапқы мәндермен жарияланған айнымалылар сақталады. Екінші аймақ – сегментпен басталатын блок деп аталады, онда бастапқы мәндерсіз жарияланған айнымалылар сақталады. Глобалды және статикалық деректер аймағында сақталған айнымалылардың мекенжайлары компиляция уақытында белгіленеді. Олар процесс өмірі бойына өз мәндерін сақтайды. Глобалды және статикалық аймақ негізгі функцияның сыртында (жоғарысында) жарияланған глобалды айнымалыларды сақтайды. Глобалды айнымалылар негізгі және кодтың басқа барлық функцияларына көрінеді. Ал main, басқа функциялардың ішіндегі немесе { } блок шегіндірушілеріндегі айнымалылар – жергілікті айнымалылар болып табылады. Жергілікті айнымалыларға формальды параметрлік айнымалылар да кіреді. Параметрлік айнымалылар функция анықтамасының жақшаларында орналасқан. Олар функцияға интерфейс ұсынады. Статикалық префиксімен жарияланған жергілікті айнымалылар да жаһандық және статикалық деректер аймағында сақталады. Стекке орналастырылған айнымалылар жоғарыдан төменге толтырылады және автоматты айнымалылар деп аталады. Стек пен үйіндінің көрсеткіштері кездескенде жадтан тыс қате пайда болады. C үйінді жадын бөлу үшін malloc кітапханалық функциясын ұсынады. Үйіндіні деректермен толтыру – қосымша көшіру функциясы. Үйіндіде сақталған айнымалылар көрсеткіштерді пайдалана отырып функцияларға тиімді беріледі. Көрсеткіштер болмаса, деректердің бүкіл блогы стек арқылы функцияға жіберілуі керек болар еді.