shkolakz.ru 1 2 3


ІІІ Дәріс сабақтарының қысқаша конспектілері

1- 2 дәрістер. Программалау технологиясы. Негізгі түсініктер мен ұстанымдар. Программалау технологиясының даму кезеңдері

Программалау технологиясы, бұл- программалық жабдықтарды жасау процесінде қолданылатын қолданылатын арнайы әдістер мен құралдардың жиынтығы.

Электрондық-есептеуіш машиналар алғаш қолданыла бастаған кезеңнен бастап қазіргі уақытқа дейін оларға арналған программалар жазу негізгі мәселелердің бірі болып саналады. Программалық жабдықтың өмірлік циклы деп, оны құру туралы идея пайда болған кезден бастап, оны жасаған фирманың программалық жабдықты әрі қарай қолдап жетілдіруі тоқтатылғанға дейінгі уақытты айтады.

Программаның өмірлік циклының құрылымы ISO IEC 12207: 1995 Information Technologe - Software Life Cycle Processes (Информационные технологии - Процессы жизненного цикла программного обеспечения) халықаралық стандартымен анықталған, мұндағы ISO – International Organization for Standardization (Международная организация по стандартизации) және ІЕС - International Electrotechnical Commission (Международная комиссия по электротехнике).

Аталған стандарт бойынша программалық жабдықты құру келесі процесстерден тұрады:


  • даярлық жұмыстары;

  • болашақ жүйеге немесе программаға қойылатын талаптарды анықтау;

  • болашақ жүйенің немесе программаның архитектурасын жобалау;

  • программаға қойылатын талаптарға талдау (анализ) жасау;
  • программалық жабдықты детальды жобалау;


  • программалық жабдықтың кодын жасау және тестілеу;

  • программалық жабдықты жүйеге кірістіру;

  • программалық жабдықты құжаттау;

  • программалық жабдықты қолдап отыру.


Программалау технологиясының даму кезеңдерінің бастапқысы, стихиялы программалау кезеңі болып табылады. Бұл кезеңде, қазіргі жоғары деңгейдегі программалау тілдері болмағандықтан программалар машиналық тілде жазылды, мысалы, 1958 жылы академик С. А. Лебедевтің басшылығымен жасалған, М-20 есептеулерге арналған электронды есептеуіш машинасы номерленген командалардан тұратын программаны орындай алатын болды (3.1-сурет).


Номер 

Команда 

Операндалар сақталатын жедел жады ұяшықтарының адрестері

0100 

01 

1234 

6543 

3489

0101 

02 

4563 

0567 

3456

0102 

05 

3489 

3456 

2987



3.1-сурет. М-20 ЭЕМ-на арналып жазылған программа мәтіні

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


Мұндай тәсілдерді қолдану программаның статикалық түрінің динамикалық түрімен сәйкес келмеуіне әкеліп соқтыратын болғандықтан бұл программаларды программисттер өз тілдерінде BS-программалар (Bowl Spaghetti - блюдо спагетти) деп атайтын болған. Кейбір жағдайларда программисттің өзі құрған BS-программасының қатесін өзі таба алмай қалатын кездері болады ( 3.2-сурет):



3.2-сурет. BS-программа листингісінің фрагменті

Программалық жабдықты құрудағы негізгі міндеттердің бірі программаның статикалық күйі, яғни бастапқы жазылуымен (немесе листингісі) оның динамикалық күйі, яғни компьютердегі орындалу тәртібі сәйкес келуі керек немесе программа командалары жазылу реті бойынша орындалуы тиіс.

Бұл мәселені шешу үшін жаңа тиімді программалау технологиясын жасау қажет болды. Бұл ізденістің нәтижесінде 70- жылдардың басында IBM корпорациясы ұсынған, теориялық негізін профессор Э. Дейкстра қалаған құрылымдық программалау технологиясы пайда болды. Мұнда, программалар белгілі бір ережелерге сәйкес немесе технологиялық әдістерге негізделіп құрылатын болды. Мұның негізінде күрделі программаларды кішкентай шағын программаларға жіктеп алу яғни «декомпозиция» принципі жатыр. Бұл кезеңнің программалары модульдерден құралды. Модульдерден құралған мұндай программалар көптеген мәселелерді шешкенімен, оның тиімсіз жақтары да болды. Мысалы, неғұрлым подпрограммалар көп болған сайын, ол подпрограммаларда программаға қатысатын кең ауқымды (глобалдық) мәліметтердің өзгеріп кетуі көбейеді, сондықтан әрбір подпрограмма өзі орындалып болған ортақ пайдаланылатын кең ауқымды соң мәліметті қайтадан бастапқы қалпына келтіріп қоюы қажет болды. Сондықтан әрбір подпрограмманың ішінде өзінің локальдық мәліметтерін жасау қажеттілігі туындады (3.3-сурет).



3.3-сурет. Құрылымдық программалау элементтері


Мысалы квадрат теңдеуді шешу қажет болса, коэффициенттер ғана негізгі программадан алынады, ал дискриминантты табу ол локальдық айнымалы арқылы жасалады. Құрылымдық программалаудағы тағы бір мәселе, бір программаға қатысты әртүрліподпрограммаларды бірнеше программисттің бір мезгілде параллель құра алу мүмкіндігімен байланысты туындады. Әрине, бұл тәсіл программаны құру уақытын біраз қысқарта алады, бірақ, мұнда стихиялы түрде «төменнен жоғары» қарай программалау қағидасы қолданылды, яғни әуелі қарапайым подпрограммалар жасалып, сонан кейін оларды біріктіріп күрделі программалар жасалатын болды. Ал, бұл подпрограммаларды біріктіріп қалған кезде, ортақ ережелер болмағандықтан негізігі программаны алу өте қиын болды, яғни түрліше стильде жасалған подпрограммаларды біріктіру қиынға соқты. Мұны, ХХ ғасырдың, 60-жылдары «подпрограммалаудағы кризис» деп атады.

Модульдік программалау (3.4- сурет) көп мәселелерді шешті оның тиімсіз жағы, егер программаға бірнеше модуль қатынасатын болса, онда олардың өзара байланысындағы қателер, яғни интерфейстегі қателерді тек программаның орындалуы кезінде ғана байқау мүмкін болатын болды, себебі модульдер программадан тыс өз алдына бөлек компиляцияланады. Егер программаға қатысатын модульдер саны көп болса, мұндай қателердің бәрінің алдын алу мүмкін емес екені белгілі болды.




3.4-сурет. Модульдік – құрылымдық программалау элементтері

Келесі кезеңде, объектілік ұстаным қолданыла бастады. Мұнда программа объектілердің жиынтығынан жасалады. Бұл объектілер белгілі бір класқа жатады. Ал ол кластар белгілі бір иерархияға бағынады, және соңғысы алдынғысының барлық қасиеттерін қабылдайды, және олар өзара «оқиғалар» арқылы байланысады. Бұл кезеңдегі ең алғаш имитациялық модельдеу тілі Simula болды. Қазіргі, Delphi, Visual C++, C++ Builder, Visual Basic, Java бұлардың барлығы да RAD технологияларға жатады және объектілік ұстанымды барынша қолдайды. Бұл технологиялардың тиімсіз тұсы - компиляциялаудағы ортақ стандарттардың болмауы. Мысалы, белгілі бір алгоритмге сәйкес Visual C++ ортасында жазылған программаны, сол алгоритм үшін C++ Builder ортасында пайдалану мүмкін емес, яғни сол алгоритмді қайтадан жазу керек болады, сол сияқты объектілік компоненттің бір сипаттамасы өзгертсе болды, онда соған сәйкес программаны да қайтадан компиляциялаудан өткізу қажет болады.


Жоғарыда аталған мәселені шешуді программалаудағы компоненттік ұстаным (COM- технологияның) көмегімен шешуге болатыны қазір белгілі болып отыр. Компненттік ұстанымның мағынасы, мұнда программалар өзара бір-бірімен стандарт түрдегі екілік интерфейс арқылы байланысады және бинарлық (екілік форматтағы) компоненттерден құралады. Мұндағы объект– компоненттердің кәдімгі объектілерден өзгешелігі оларды динамикалық кітапханаларға немесе exe-файлдарға біріктіріп екілік түрде, бастапқы мәтінсіз (без исходных текстов) тарата беруге болады және оны осы компоненттік технологияны ұстанатын кез-келген тілде пайдалана беруге болады. COM- технологияның қарапайым мысалы, Paint графиктік редакторында жасалған сурет-объектіні Word- мәтіндік редакторындағы құжатқа апарып кіріктіруге болады.


3-4 дәрістер. Программалық жабдықтардың технологиялық сипаттамаларын анықтау

Жалпы «технологиялық тиімділік» деп, программалық жабдықтың жобасының сапасын түсінеді. Программалық жабдықты жасауға және оны кейіннен жетілдіріп отыруға кететін еңбек және материалдық ресурстар тікелей жобамен (проектімен) байланысты болады. Барынша жан-жақты, сауатты құрылған жобаны кодтау, тестілеу, жөндеу және және модификациялау да жеңіл болады.

Программисттердің жинақталған тәжірибелері бойынша программалық жабдықтың технологиялылығы келесі факторлармен анықталады:


  • модельдің жан-жақты қарастырылғандығы (проработанность моделей);

  • модульдердің өзара тәуелсіздігінің деңгейі (уровень независимости модулей);

  • программалау стилі (стиль программирования);

  • кодтарды қайталап қолдану дәрежесі (степень повторного использования кодов).

Програрммалық жабдықтың моделі неғұрлым толық зерттелген, жан-жақты ескеріліп жасалған болса, онда жалпы есепке кіретін бөлек есептерді (подзадачаларды), мәліметтердің құрылымын және т.б. анықтау да соғұрлым нақтырақ болады, оларды жобалау және жүзеге асыру жеңіл болады, қателер азаяды. Ал модульдер неғұрлым өзара тәуелсіз болса, соғұрлым олардың жүзеге асырылуы, модификациялануы, олардағы қатені іздеу және т.б. жеңіл болады.


Программалау стилі деп программаны әрлеу стилін және құрылымдылығын түсінеді. Программаның құрылымдылығы оның оқылуына (читаемость программы) және программалауда қате жіберілмеуіне әсер етеді. ХХ ғасырдың 60-жылдарындағы кризис, яғни спагетти- программалар осы құрылымдылықтың болмауының нәтижесі.

Кодтардың қайта пайдаланылу дәрежесі, бұл бұрыннан бар кітапханаларды, кластарды, подпрограммаларды пайдаланумен және жаңадан жасалған кодтарды унификациялаумен анықталады. Бұл барлық жағдайда тиімді болмауы мүмкін, мысалы кодтарды қайта пайдалану жасанды түрде жоғарылатылса, онда жобаның технологиялылығы да соғұрлым төмендеуі мүмкін.

Программалық жабдықтың жалпы құрылымы анықталғаннан кейін, әдетте ұстаным таңдалынады: құрылымдық ұстаным немесе объектілік ұстаным немесе компоненттік ұстаным .

Ұстаным анықталғаннан кейін, жоғарыдағы айтылған программаның жалпы құрылымын жеке компоненттерге декомпозициялау басталады, бұл декомпозиция мүмкін емес болғанға дейін жүреді. Мұндай декомпозицияның нәтижесі, құрылымдық ұстанымда – подпрограммалар мен модульдердің иерархиясы болып шығады, ал объектілік ұстанымды пайдаланатын декомпозиялауда, класстар түріндегі иерархия алынады.

Модуль (Unit) – жеке автономды түрде компиляцияланатын программаның бірлігі. Модульдердің өзара тәуелсіздігі екі критериймен анықталды: жабысу(сцепление) және байланысу (связность).

Жабысу – бұл модульдердің бір-бірінен неғұрлым алшақтығын анықтайды. Егер бір модульде екінші модуль туралы ешқандай ақпарат берілмесе, онда олар тәуелсіз, ал олар бір-бірі туралы ақпарат сақтайтын болса, онда жабысқан болып есептеледі. Жабысудың келесі түрлері анықталған:


  • мәндер бойынша (по данным);

  • үлгі бойынша (по образцу);

  • басқару бойынша (по управлению);

  • жалпы мәліметтер орналасқан облыс бойынша (по общей областей данных);
  • ішкі компоненттері, мәліметтері бойынша (по содержимому).


Егер «жабысу» жеке-жеке модульдердің бір-біріне алшақтық арақатынасын анықтаса, «байланысу» бір модуль ішіндегі программалық элементтердің өзара байланысу деңгейін анықтайды. Өзара тығыз байланыста болатын элементтерді бір модульге орналастырған тиімді болады, ал егер оларды әртүрлі модульдерге орналастырса модульдердің бір-біріне тәуелділігі артады, бұл қиынырақ болады. Әлсіз байланысқан элементтерді де бір модульде пайдалану оның технологиялылығын төмендетеді. Әзірге байланысудың келесі түрлері анықталған(кему дәрежесіне қарай):

  • функционалды (функциональная);

  • тізбектей (последовательная);

  • ақпараттық (коммуникативная или информационная);

  • процедуралық (процедурная);

  • уақытша (временная);

  • логикалық (логическая);

  • кездейсоқ (случайная).

Программалық жабдықты құруда қолданылатын негізгі екі әдіс:

  • төменнен жоғары қарай жобалау (восходящий метод);

  • жоғарыдан төмен қарай жобалау(нисходящий метод).

«Жоғары қарай жүру» әдісі бұл бірінші пайда болды, мұнда программаның ең төмені элементтері, сонан соң одан жоғары элементтері т.с. сияқты жасалады. Бұл әдістің тиімсіз жағы, кейін біріктірген кезде компоненттер өзара үйлеспей қалады, программа интерфейсі ең соңынан жасалады, яғни оны алдын-ала көрсетіп алу мүмкіндігі жоқ. Бұл әдіс өндірісте қолданылмайды, әдетте оқыту үшін қолданылады.

«Төмен қарай» программалау мұнда программаның бірінші жоғары деңгейдегі компоненттері жобаланады, әрі қарай біртіндеп төменгі деңгейдегі компоненттері жасала береді, мұнда программаның жасалған бөлігін тестілеу үшін әлі жасалмаған төмендегі компоненттерді арнайы модульдермен («заглушка» программа) алмастыра тұрады.

Құрылымдық программалауда, жалпы есептеу процесі үш түрлі ұйымдастырылады: ызықтық, тармақталатын және қайталанатын. Бұл процесстерді жүзеге асыру үшін жоғары деңгейдегі программалау тілдерінде арнаулы басқарушы операторлар (if, while) қолданылады, ал бұрынғы төменгі деңгейдегі тілдерде басқару жолға көшу арқылы беріліп, спагетти- программалар шығатын болды. Сонымен, 1960 жылдардан бастап осы үш конструкцияны «базалық құрылымдар» деп қабылдау келісілген, оның жазылуының бірнеше түрлі нотациялары бар: блок-схема, псевдокод, Flow-формалар, Насси-Шнейдерман диаграммасы және т.б. . Мысалы, базалық құрылымдардың блок-схема түріндегі жазылуы (3.5- сурет) :







сызықтық

тармақталатын

қайталанатын

3.5- сурет. Базалық құрылымдардың блок-схема түріндегі жазылуы


Программада құрылымдық әдісті көрсету үшін жоғарыдағы блок-схемаларды пайдалану өте үлкен болады және күрделі алгоритмдерді беруде оның мағынасын жоғалтып алады, яғни детализациялау деңгейі төмендеп кетеді, сондықтан программа құрылымын көрсету үшін блок-схемадан басқа: псевдокодтар, Flow-формалар және Насси-Шнейдерман диаграммалары қолданылады.

Псевдокод – бұл алгоритмді мәтін түрінде (текстовая нотация) жазып шығу. Псевдокодтарды жазудың бірнеше варианттары кездеседі. Мысалы, бір нұсқасы төмендегі кестеде берілген (3.6-сурет):


Сызықтық

Тармақталған

Қайталанатын

<1- әрекет>

<2- әрекет>

егер шарт

онда

1-әрекет

әйтпесе

2-әрекет

бітті

әзір шарт

цб

қайталанатын әрекет

цс



3.6- сурет. Базалық құрылымдардың псевдокод түріндегі жазылуы


Flow-формалар құрылымдық алгоритмдерді жазуға арналған графикалық нотация. Flow-форманың әрбір символы – бір басқарушы құрылымды білдіретін төртбұрыш түрінде болады (3.7- сурет), мысалы :



сызықтық

тармақталатын

қайталанатын

3.7- сурет. Базалық құрылымдардың Flow-форма түріндегі жазылуы


Насси-Шнейдерман диаграммасы (3.8- сурет) , бұл Flow-формалардың жетілдірілген түрі болып табылады, егер Flow-формада бәрі төртбұрыш түрінде берілсе мұнда тармақталу шарттары үшбұрыш түрінде көрсетіледі, мысалы:




3.8- сурет. Базалық құрылымдардың Насси-Шнейдерман диаграммасы түріндегі жазылуы


Программаны әрлеу стиліне төмендегілер кіреді:


  • программадағы объектілерге, айнымалыларға, функцияларға дұрыс, мағыналы атаулар беру, мысалы Max_Item, Next_Item;

  • модульді дұрыс жазу ережесі: модульдің аты, қысқаша сипаттамасы (не үшін қолданылады), кіріс және шығыс параметрлерінің қысқаша сипаттамасы, оған қатысатын модульдер тізімі алгоритмнің қысқаша сипаттамасы немесе шектеулер;

  • программаның авторы туралы мәліметтер;

  • идентификациялаушы ақпарат (сериялық номер, нұсқа номері және т.б.)

  • модульдің мәтінін әрлеу стилі және т.б.

Жалпы программалауда программаның тиімділігі оның жылдам орындалуымен және жады көлемін аз пайдалануымен анықталады. Кейбір фрагменттердің дұрыс жазылуы, мысалы, көп қайталануы тиіс циклдер программаның орындалу уақытына тікелей әсер етеді. Қазіргі программалау жүйелерінде программалық жабдықтың тиімділігін оптимизациялауды көбінесе компиляторлар орындайды.

Программаның орындалу уақытын азайту үшін қолданылатын тәсілдер де, бұл әсіресе көп қайталанатын циклдарды программалауда кездеседі:

  • цикл параметрлеріне тәуелсіз шамаларды, өрнектерді циклдан шығару, мысалы:

for (int i=0; i<99; i++)

for (int j=0; j<99; j++)

a[320*i+j]=s[k,l].

бұл циклда *(көбейту 320*i) 10000 рет және, s[k,l] элементін шақыру, яғни массивке сұраныс жасау 10000 рет орындалады. Егер осы жазуды келесі түрде жазсақ 320=28 +26 деп алсақ , сонда келесі түрде жазуға болады:

skl=s[k,l]; //массив элементін шақыруды цикл сыртына шығару

for (int j=0; j<99; j++)

{

KomAin=j<<8+s<<6 //320*i көбейтуді жылжытумен алмастыру

for (int i=0; i<99; i++)

a[KomAin+i]=skl;

}…


  • ұзақ «көбейту» амалынан құтылу, ол үшін оларды қосумен, азайтумен, жылжытумен алмастыру;

  • өрнектерде типтерді түрлендіруді азайту;

  • шарттарды тексеруде, артық тексерулер жасамау;

  • массив элементіне индекстері бойынша сұраныс жасамауға тырысу, себебі сол элементтің адресін табу үшін индекстердің мәніне көбейту амалы орындалады, сондықтан жадыдан массив элементтерінің мәнін бір рет оқып алып, оны бір скаляр шамаға меншіктеп, оны керек жерде пайдалана беруге болады.

Программаны компиляциялау және жинау кезіндегі қателерден, яғни синтаксистік қатеден басқа программаның орындалу кезінде пайда болатын қателер болады, әдетте, оларды динамикалық қателер деп атайды. Олардың көрінуі де түрліше болады, мысалы жүйе қате туралы хабарлама береді немесе тұрып қалады, түсініксіз нәтижелер де беруі мүмкін. Сондықтан программалауда кетуі мүмкін қателерді алдын ала ескеріп, оларды уақытында табу және жою үшін арнаулы әдістер қолданылады. Мұның барлығы программалауда «ерекше жағдайларды өңдеу» (обработка исключительных ситуации) деп аталатын мәселеге әкеледі. Ерекше жағдайларды өңдеу механизмі арнаулы аппараттық немесе тілдік құралдар көмегімен қателерді тауып алып, оны өңдеуге мүмкіндік береді, яғни программаның қауіпті жағдайда қалуына жол бермейді.



следующая страница >>