Imperativ programmalastırıw

Kompyuter iliminde **imperativ programmalastırıw** — bul programmanıń jaǵdayın ózgertetuǵın operatorlardı paydalanatuǵın programmalıq támiynat programmalastırıw paradigması. Tábiyiy tillerdegi buyrıq formasınıń buyrıqlardı ańlatıwına uqsas, imperativ programma kompyuter orınlawı kerek bolǵan buyrıqlardan ibarat. Imperativ programmalastırıw programmanıń kútilgen nátiyjeleriniń joqarı dárejeli sıpatlamalarına emes, al basqıshpa-basqısh qalay isleytuǵının táriyiplewge itibar beredi (adımlardıń ulıwma tártibi derek kodında operatorlardıń bir-biriniń astına jaylasıwı menen anıqlanadı).

Bul termin kóbinese programmanıń nátiyjege qalay erisiwiniń barlıq detalların kórsetpesten, programmanıń neni orınlawı kerekligine itibar beretuǵın deklarativ programmalastırıwǵa qarama-qarsı paydalanıladı.

## Proceduralıq programmalastırıw
Proceduralıq programmalastırıw — bul programma bir yamasa bir neshe proceduralardan (kishi programmalar yamasa funkciyalar dep te ataladı) quralǵan imperativ programmalastırıwdıń bir túri. Bul terminler kóbinese sinonim retinde paydalanıladı, biraq proceduralardı paydalanıw imperativ programmalardıń sırtqı kórinisine hám olardıń qurılıw usılına úlken tásir etedi. Jaǵday ózgerisleri proceduralarǵa lokalizaciyalanǵan yamasa anıq argumentler menen proceduralardan qaytarılatuǵınlar menen sheklengen kúshli proceduralıq programmalastırıw, strukturalıq programmalastırıwdıń bir forması bolıp tabıladı. 1960-jıllardan baslap, strukturalıq programmalastırıw hám ulıwma modulli programmalastırıw imperativ programmalardıń qollap-quwatlanıwın hám ulıwma sapasın jaqsılaw usılları retinde alǵa qoyıldı. Obyektke baǵdarlanǵan programmalastırıwdıń tiykarındaǵı koncepciyalar bul usıldı keńeytiwge háreket etedi.

Proceduralıq programmalastırıwdı deklarativ programmalastırıwǵa qaray bir qádem dep esaplawǵa boladı. Baǵdarlamashı kóbinese, tek proceduralardıń atlarına, argumentlerine hám qaytarılatuǵın tiplerine (hám baylanıslı kommentariyalarǵa) qarap, belgili bir proceduranıń neni islewi kerekligin, onıń nátiyjege qalay erisiwiniń detalların qarap shıqpastan, ayta aladı. Sol waqıtta, tolıq programma ele de imperativ bolıp qaladı, sebebi ol orınlanatuǵın operatorlardı hám olardıń orınlanıw tártibin úlken dárejede belgileydi.

## Imperativ programmalastırıwdıń negizi hám tiykarları
Derlik barlıq kompyuterler ushın programmalar dúziwde paydalanılatuǵın programmalastırıw paradigması ádette imperativ modelge boysınadı. Cifrlı kompyuter apparatlıq támiynatı kompyuterge tán bolǵan hám ádette imperativ stilde jazılǵan mashina kodın orınlaw ushın proektlestirilgen, degen menen Lisp mashinaları sıyaqlı ayırım arxitekturalar ushın basqa paradigmalardı paydalanatuǵın tómen dárejeli kompilyatorlar hám interpretatorlar da bar.

Bul tómen dárejeli kózqarastan, programma jaǵdayı yad mazmunı menen anıqlanadı, al operatorlar kompyuterdiń jergilikli mashina tilindegi kórsetpeleri bolıp tabıladı. Joqarı dárejeli imperativ tiller ózgeriwshilerdi hám quramalıraq operatorlardı paydalanadı, biraq ele de sol bir paradigmaǵa ámel etedi. Receptler hám processlerdiń tekseriw dizimleri, kompyuter programmaları bolmasa da, imperativ programmalastırıwǵa uqsas stildegi tanıs túsinikler; hárbir qádem kórsetpe, al fizikalıq dúnya jaǵdaydı uslap turadı. Imperativ programmalastırıwdıń tiykarǵı ideyaları konceptual jaqtan tanıs hám apparatlıq támiynatta tikkeley sáwlelengenlikten, kópshilik kompyuter tilleri imperativ stilde.

Menshiklew operatorları, imperativ paradigmada, yadta jaylasqan informaciyaǵa operaciya orınlaydı hám nátiyjelerdi keyinirek qollanıw ushın yadta saqlaydı. Joqarı dárejeli imperativ tiller, bunnan tısqarı, arifmetikalıq operaciyalar hám funkciyalardı bahalaw kombinaciyasınan ibarat bolıwı múmkin bolǵan quramalı ańlatpalardı bahalawǵa hám nátiyjedegi mánisti yadqa tayınlawǵa imkaniyat beredi. Ciklli operatorlar (while ciklleri, do while ciklleri hám for ciklleri sıyaqlı) operatorlar izbe-izligin bir neshe ret orınlawǵa imkaniyat beredi. Cikller óz ishine alǵan operatorlardı aldınnan anıqlanǵan san ret orınlawı yamasa belgili bir shárt orınlanǵanǵa shekem qayta-qayta orınlawı múmkin. Shártli tarmaqlanıw operatorları operatorlar izbe-izligin tek belgili bir shárt orınlanǵanda ǵana orınlawǵa imkaniyat beredi. Basqa jaǵdayda, operatorlar ótkizip jiberiledi hám orınlanıw izbe-izligi olardan keyingi operatordan dawam etedi. Shártsiz tarmaqlanıw operatorları orınlanıw izbe-izligin programmanıń basqa bólimine ótkiziwge imkaniyat beredi. Bularǵa sekiriw (kóp tillerde goto dep ataladı), switch hám kishi programma, kishi rutina yamasa procedura shaqırıwı kiredi (bul ádette shaqırıwdan keyingi kelesi operatorǵa qaytadı).

Joqarı dárejeli programmalastırıw tillerin islep shıǵıwdıń basında, bloktıń kirgiziliwi operatorlar hám járiyalanıwlar toparın bir operator sıyaqlı qarastırıwǵa bolatuǵın programmalar dúziwge imkaniyat berdi. Bul, kishi rutinalardıń kirgiziliwi menen birge, quramalı strukturalardı ápiwayı proceduralıq strukturalarǵa ierarxiyalıq dekompoziciya arqalı ańlatıwǵa múmkinshilik berdi.

Kóplegen imperativ programmalastırıw tilleri (Fortran, BASIC hám C sıyaqlı) assembler tiliniń abstrakciyaları bolıp tabıladı.

## Imperativ hám obyektke baǵdarlanǵan tillerdiń tariyxı
Eń dáslepki imperativ tiller dáslepki kompyuterlerdiń mashina tilleri boldı. Bul tillerde kórsetpeler júdá ápiwayı edi, bul apparatlıq támiynattı ámelge asırıwdı ańsatlastırdı, biraq quramalı programmalar jaratıwǵa kesent etti. Fortran, 1954-jıldan baslap Djon Bekus tárepinen International Business Machines (IBM) kompaniyasında islep shıǵılǵan, quramalı programmalar jaratıwda mashina kodınıń usınatuǵın tosqınlıqların alıp taslaǵan birinshi iri programmalastırıw tili boldı. Fortran atalǵan ózgeriwshilerge, quramalı ańlatpalarǵa, kishi programmalarǵa hám házirgi waqıtta imperativ tillerde keń tarqalǵan basqa da kóp ózgesheliklerge imkaniyat beretuǵın kompilyaciyalanatuǵın til edi. Keyingi eki on jıllıqta basqa da kóp iri joqarı dárejeli imperativ programmalastırıw tilleri islep shıǵıldı. 1950-jıllardıń aqırında hám 1960-jıllarda, ALGOL matematikalıq algoritmlerdi ańsat ańlatıwǵa imkaniyat beriw ushın islep shıǵıldı hám hátte geypara kompyuterler ushın operaciyalıq sistemanıń maqsetli tili bolıp xızmet etti. MUMPS (1966) imperativ paradigmanı logikalıq shegarasına alıp keldi, hesh qanday operatorları bolmay, tek buyrıqlarǵa súyendi, hátte IF hám ELSE buyrıqların bir-birinen ǵárezsiz etip, tek $TEST dep atalǵan ishki ózgeriwshi arqalı baylanıstırdı. COBOL (1960) hám BASIC (1964) ekewi de programmalastırıw sintaksisin inglis tiline uqsatıwǵa urınıslar boldı. 1970-jıllarda, Pascal Niklaus Virt tárepinen islep shıǵıldı, al C Dennis Ritchi tárepinen ol Bell Laboratories-te islep atırǵanda jaratıldı. Virt keyinirek Modula-2 hám Oberon-dı proektlestirdi. Amerika Qurama Shtatları Qorǵanıw Ministrliginiń mútájlikleri ushın, Jan Ichbia hám Honeywell-degi topar 1978-jılı Ada-nı proektlestiriwdi basladı, til ushın talaplardı anıqlaw boyınsha 4 jıllıq proektten keyin. Specifikaciya birinshi ret 1983-jılı járiyalandı, 1995, 2005 hám 2012-jıllarda dúzetiwler kirgizildi.

1980-jılları obyektke baǵdarlanǵan programmalastırıwǵa qızıǵıwshılıqtıń tez ósiwi baqlandı. Bul tiller imperativ stilde edi, biraq obyektlerdi qollap-quwatlaw ushın ózgeshelikler qostı. XX ásirdiń sońǵı eki on jıllıǵında bunday tillerdiń kópshiligi islep shıǵıldı. Smalltalk-80, dáslep 1969-jılı Alan Key tárepinen oylap tabılǵan, 1980-jılı Xerox Palo Alto Izertlew Orayı (PARC) tárepinen shıǵarıldı. Basqa bir obyektke baǵdarlanǵan til — Simuladaǵı koncepciyalardan ilhamlanıp (ol 1960-jıllarda islep shıǵılǵan dúnyadaǵı birinshi obyektke baǵdarlanǵan programmalastırıw tili dep esaplanadı) — Byarn Straustrup C++-ti, C-ge tiykarlanǵan obyektke baǵdarlanǵan tildi proektlestirdi. C++-tiń proektlestiriliwi 1979-jılı baslandı hám birinshi implementaciya 1983-jılı tamamlandı. 1980-jıllardıń aqırında hám 1990-jıllarda, obyektke baǵdarlanǵan koncepciyalarǵa súyenetuǵın belgili imperativ tiller Perl, 1987-jılı Larri Uoll tárepinen shıǵarılǵan; Python, 1990-jılı Gvido van Rossum tárepinen shıǵarılǵan; Visual Basic hám Visual C++ (ol Microsoft Foundation Class Library (MFC) 2.0-di óz ishine alǵan), Microsoft tárepinen 1991 hám 1993-jıllarda shıǵarılǵan; PHP, 1994-jılı Rasmus Lerdorf tárepinen shıǵarılǵan; Java, 1995-jılı Djeyms Gosling (Sun Microsystems) tárepinen, JavaScript, Brendan Eyx (Netscape) tárepinen hám Ruby, Yukihiro «Matz» Matsumoto tárepinen, ekewi de 1995-jılı shıǵarılǵan. Microsofttıń .NET Framework-i (2002) tiykarında imperativ bolıp tabıladı, sonday-aq onıń tiykarǵı maqsetli tilleri, VB.NET hám C# ta onda isley aladı; degen menen Microsofttıń F#-ı, funkcional tili, de onda isley aladı.

## Mısallar

### Fortran
Fortran (1958) «IBM matematikalıq formulasın awdarıw sisteması» retinde usınıldı. Ol qatar menen islesiw imkaniyatlarısız, ilimiy esaplawlar ushın proektlestirilgen edi. Járiyalanıwlar, ańlatpalar hám operatorlar menen birge, ol tómendegilerdi qollap-quwatladı:

* massivler
* kishi programmalar
* «do» ciklleri

Ol tabıslı boldı, sebebi:

* programmalastırıw hám sazlaw shıǵınları kompyuterdiń islew shıǵınlarınan tómen edi
* ol IBM tárepinen qollap-quwatlandı
* sol waqıttaǵı qosımshalar ilimiy edi.

Degen menen, IBM emes óndiriwshiler de Fortran kompilyatorların jazdı, biraq sintaksisi IBM kompilyatorınan ótpeytuǵın edi. Amerika Milliy Standartlar Instituti (ANSI) birinshi Fortran standartın 1966-jılı islep shıqtı. 1978-jılı Fortran 77 1991-jılǵa shekem standart boldı. Fortran 90 tómendegilerdi qollap-quwatlaydı:

* jazıwlar
* massivlerge kórsetkishler

### COBOL
COBOL (1959) «COmmon Business Oriented Language» (Ulıwma Bizneske Baǵdarlanǵan Til) degen sózlerdiń qısqartpası. Fortran simvollardı manipulyaciyaladı. Tez arada simvollardıń san bolıwı shárt emes ekenligi anıqlandı, sonlıqtan qatarlar kirgizildi. AQSH Qorǵanıw Ministrligi COBOLdıń rawajlanıwına tásir etti, bunda Greys Hopper úlken úles qostı. Operatorlar inglis tiline uqsas hám kóp sózli edi. Maqset menedjerlerdiń programmalardı oqıy alatuǵın til proektlestiriw edi. Degen menen, strukturalıq operatorlardıń joqlıǵı bul maqsetke kesent etti.

COBOLdıń rawajlanıwı qatań baqlanǵanlıqtan, ANSI standartların talap etetuǵın dialektler payda bolmadı. Nátiyjede, ol 1974-jılǵa shekem 15 jıl dawamında ózgertilmedi. 1990-jıllardaǵı versiyası obyektke baǵdarlanǵan programmalastırıw sıyaqlı áhmiyetli ózgerisler kirgizdi.

### ALGOL
ALGOL (1960) «ALGOrithmic Language» (Algoritmlik Til) degen sózlerdiń qısqartpası. Ol programmalastırıw tilin proektlestiriwge tereń tásir etti. Evropalı hám Amerikalı programmalastırıw tili ekspertleri komitetinen kelip shıǵıp, ol standart matematikalıq belgilewdi paydalandı hám oqılatuǵın strukturalıq dizaynǵa iye boldı. ALGOL birinshi bolıp óziniń sintaksisin Bekus-Naur forması járdeminde anıqladı. Bul sintaksiske baǵdarlanǵan kompilyatorlarǵa alıp keldi. Ol tómendegi ózgesheliklerdi qostı:

* blok strukturası, bunda ózgeriwshiler óz blogına lokal boldı
* ózgermeli shegaraları bar massivler
* «for» ciklleri
* funkciyalar
* rekursiya

ALGOLdıń tikkeley áwladları bir tarmaqta Pascal, Modula-2, Ada, Delphi hám Oberon-dı óz ishine aladı. Basqa bir tarmaqta C, C++ hám Java bar.

### BASIC
BASIC (1964) «Beginner's All Purpose Symbolic Instruction Code» (Jańa baslawshılar ushın ulıwma maqsetli simvollı kórsetpeler kodı) degen sózlerdiń qısqartpası. Ol Dartmut kolledjinde barlıq studentlerdiń úyreniwi ushın islep shıǵılǵan. Eger student kúshlirek tilge ótpesede, ol ele de BASICti eslep qalatuǵın edi. 1970-jıllardıń aqırında islep shıǵarılǵan mikrokompyuterlerge BASIC interpretatorı ornatıldı. Mikrokompyuter sanaatı ósken sayın, til de ósti.

BASIC interaktiv sessiyanı birinshi bolıp engizdi. Ol óz ortalıǵında operaciyalıq sistema buyrıqların usındı:

* 'new' buyrıǵı bos bet jarattı
* Operatorlar dárhal bahalandı
* Operatorlardı olardıń aldına qatar nomerin qoyıw arqalı programmalastırıwǵa bolatuǵın edi
* 'list' buyrıǵı programmanı kórsetti
* 'run' buyrıǵı programmanı orınladı

Degen menen, BASIC sintaksisi úlken programmalar ushın júdá ápiwayı edi. Sońǵı dialektler struktura hám obyektke baǵdarlanǵan keńeytpeler qostı. Microsofttıń Visual Basic-i ele de keń qollanıladı hám grafikalıq paydalanıwshı interfeysin payda etedi.

### C
C programmalastırıw tili (1973) óz atın BCPL tili B menen almastırılǵannan keyin aldı, al AT&T Bell Labs kelesi versiyanı «C» dep atadı. Onıń maqseti UNIX operaciyalıq sistemasın jazıw edi. C — bul salıstırmalı túrde kishi til — bul kompilyatorlar jazıwdı ańsatlastıradı. Onıń ósiwi 1980-jıllardaǵı apparatlıq támiynattıń ósiwin sáwlelendirdi. Onıń ósiwi sonıń menen birge onıń assembler tiliniń imkaniyatlarına iye bolıwı, biraq joqarı dárejeli sintaksisti paydalanıwı sebepli de boldı. Ol tómendegi aldınǵı qatar ózgesheliklerdi qostı:

* ishki assembler
* kórsetkishlerge arifmetika
* funkciyalarǵa kórsetkishler
* bit operaciyaları
* quramalı operatorlardı erkin biriktiriw

C baǵdarlamashıǵa maǵlıwmatlardıń yadınıń qaysı aymaǵında saqlanatuǵının basqarıwǵa imkaniyat beredi. Global hám statikalıq ózgeriwshilerdi saqlaw ushın eń az saat cikllerin talap etedi. Stek standart ózgeriwshi járiyalanıwları ushın avtomat túrde qollanıladı. Dáste (heap) yad `malloc()` funkciyasınan kórsetkish ózgeriwshisine qaytarıladı.

* Global hám statikalıq maǵlıwmatlar aymaǵı programma aymaǵınıń dál ústinde jaylasqan. (Programma aymaǵı texnikalıq jaqtan tekst aymaǵı dep ataladı. Bul jerde mashina kórsetpeleri saqlanadı.)

:* Global hám statikalıq maǵlıwmatlar aymaǵı texnikalıq jaqtan eki aymaq bolıp tabıladı. Bir aymaq inicializaciyalanǵan maǵlıwmatlar segmenti dep ataladı, bul jerde standart mánisler menen járiyalanǵan ózgeriwshiler saqlanadı. Ekinshi aymaq segment tárepinen baslanǵan blok dep ataladı, bul jerde standart mánislersiz járiyalanǵan ózgeriwshiler saqlanadı.
:* Global hám statikalıq maǵlıwmatlar aymaǵında saqlanǵan ózgeriwshilerdiń adresleri kompilyaciya waqtında ornatıladı. Olar óz mánislerin process dawamında saqlap qaladı.

:* Global hám statikalıq aymaq `main()` funkciyasınıń ústinde (sırtında) járiyalanǵan global ózgeriwshilerdi saqlaydı. Global ózgeriwshiler `main()` hám derek kodındaǵı basqa hár bir funkciya ushın kórinedi.

: Ekinshi tárepten, main() ishinde, basqa funkciyalarda yamasa { } blok shegaralawshıları ishinde járiyalanǵan ózgeriwshiler lokal ózgeriwshiler bolıp tabıladı. Lokal ózgeriwshilerge formal parametr ózgeriwshileri de kiredi. Parametr ózgeriwshileri funkciya anıqlamalarınıń qawsırmaları ishine alınadı. Olar funkciya ushın interfeys usınadı.

:* static prefiksi menen járiyalanǵan lokal ózgeriwshiler de global hám statikalıq maǵlıwmatlar aymaǵında saqlanadı. Global ózgeriwshilerden ayırmashılıǵı, statikalıq ózgeriwshiler tek funkciya yamasa blok ishinde ǵana kórinip turadı. Statikalıq ózgeriwshiler bárqulla óz mánisin saqlap qaladı. Mısal retinde `int increment_counter(){ static int counter = 0; counter++; return counter;}` funkciyasın keltiriwge boladı.

* Stek aymaǵı joqarı yad adresi qasında jaylasqan tutas yad blogı bolıp tabıladı. Stekke jaylastırılǵan ózgeriwshiler joqarıdan tómenge qaray toltırıladı. Stek kórsetkishi — bul sońǵı toltırılǵan yad adresin baqlap turatuǵın arnawlı maqsetli registr. Ózgeriwshiler stekke PUSH assembler kórsetpesi arqalı jaylastırıladı. Sonlıqtan, bul ózgeriwshilerdiń adresleri orınlanıw waqtında ornatıladı. Stek ózgeriwshileriniń kóriw sheńberin joytıw usılı — POP kórsetpesi arqalı.

:* static prefikssiz járiyalanǵan lokal ózgeriwshiler, sonıń ishinde formal parametr ózgeriwshileri, avtomat ózgeriwshiler dep ataladı hám stekte saqlanadı. Olar funkciya yamasa blok ishinde kórinip turadı hám funkciya yamasa bloktan shıqqanda kóriw sheńberin joytadı.

* Dáste (heap) aymaǵı stek astında jaylasqan. Ol tómennen joqarıǵa qaray toltırıladı. Operaciyalıq sistema dásteni stek kórsetkishi hám ajıratılǵan yad blokları dizimi arqalı basqaradı. Stek sıyaqlı, dáste ózgeriwshileriniń adresleri de orınlanıw waqtında ornatıladı. Dáste kórsetkishi hám stek kórsetkishi ushırasqanda yad jetispewshiligi qátesi payda boladı.

:* C dáste yadın ajıratıw ushın `malloc()` kitapxana funkciyasın usınadı. Dásteni maǵlıwmatlar menen toltırıw — bul qosımsha kóshiriw funkciyası. Dástede saqlanǵan ózgeriwshiler kórsetkishler arqalı funkciyalarǵa únemli túrde beriledi. Kórsetkishlersiz, pútkil maǵlıwmatlar blogı stek arqalı funkciyaǵa beriliwi kerek edi.

### C++
1970-jıllarda programmalıq támiynat injenerleri úlken proektlerdi modullerge bóliw ushın til qollap-quwatlawına mútáj edi. Bir anıq ózgeshelik — bul úlken proektlerdi fizikalıq jaqtan bólek fayllarǵa ajıratıw edi. Azıraq anıq ózgeshelik — bul úlken proektlerdi logikalıq jaqtan abstrakt maǵlıwmat tiplerine ajıratıw edi. Sol waqıtta, tiller pútin sanlar, haqıyqıy sanlar hám simvol qatarları sıyaqlı anıq (skalyar) maǵlıwmat tiplerin qollap-quwatlaytuǵın edi. Anıq maǵlıwmat tipleriniń kórinisi olardıń atınıń bir bólimi bolıp tabıladı. Abstrakt maǵlıwmat tipleri — bul jańa at berilgen anıq maǵlıwmat tipleriniń strukturaları. Mısalı, pútin sanlar dizimi `integer_list` dep atalıwı múmkin.

Obyektke baǵdarlanǵan jargon boyınsha, abstrakt maǵlıwmat tipleri klasslar dep ataladı. Degen menen, klass tek anıqlama; yad ajıratılmaydı. Klasqa yad ajıratılǵanda, ol obyekt dep ataladı.

Obyektke baǵdarlanǵan imperativ tiller klasslarǵa bolǵan mútájlik penen qáwipsiz funkcional programmalastırıwǵa bolǵan mútájlikti birlestiriw arqalı rawajlandı. Obyektke baǵdarlanǵan tilde, funkciya klasqa tayınlanadı. Tayınlanǵan funkciya keyin metod, aǵza funkciya yamasa operaciya dep ataladı. Obyektke baǵdarlanǵan programmalastırıw — bul obyektlerge operaciyalardı orınlaw.

Obyektke baǵdarlanǵan tiller kishi toplam/úlken toplam qatnasların modellestiriw ushın sintaksisti qollap-quwatlaydı. Toplamlar teoriyasında, kishi toplamnıń elementi úlken toplamdaǵı barlıq atributlardı miyras etip aladı. Mısalı, student — bul adam. Sonlıqtan, studentler toplamı adamlar toplamınıń kishi toplamı bolıp tabıladı. Nátiyjede, studentler barlıq adamlar ushın ulıwma bolǵan barlıq atributlardı miyras etip aladı. Bunnan tısqarı, studentlerdiń basqa adamlarda bolmaǵan unikal atributları bar. Obyektke baǵdarlanǵan tiller kishi toplam/úlken toplam qatnasların miyrasxorlıq arqalı modellestiredi. Obyektke baǵdarlanǵan programmalastırıw 1990-jıllardıń aqırına kelip ústem til paradigmasına aylandı.

C++ (1985) dáslep «Klasslı C» dep atalǵan. Ol Simula tiliniń obyektke baǵdarlanǵan imkaniyatların qosıw arqalı C-diń imkaniyatların keńeytiw ushın proektlestirilgen.

Obyektke baǵdarlanǵan modul eki fayldan turadı. Anıqlamalar faylı baslı fayl dep ataladı. Mine, ápiwayı mektep qosımshasındaǵı GRADE klassı ushın C++ baslı faylı:
```cpp
// grade.h
// -------

// Bir neshe derek fayllarınıń bul baslı fayldı
// qaytalanıw qátelersiz qosıwına imkaniyat beriw ushın qollanıladı.
// Qarań: https://en.wikipedia.org/wiki/Include_guard
// ----------------------------------------------
#ifndef GRADE_H
#define GRADE_H

class GRADE {
public:
  // Bul konstruktor operaciyası.
  // ----------------------------------
GRADE ( const char letter );
  // Bul klass ózgeriwshisi.
  // -------------------------
char letter;

  // Bul aǵza operaciyası.
  // ---------------------------
int grade_numeric( const char letter );

  // Bul klass ózgeriwshisi.
  // -------------------------
int numeric;

};
#endif
```
Konstruktor operaciyası — bul klass atı menen birdey atqa iye funkciya. Konstruktor operaciyası — bul klass atı menen birdey atqa iye funkciya.[26] Ol shaqırıwshı operaciya `new` operatorın orınlaǵanda orınlanadı.

Moduldiń basqa faylı — derek faylı. Tómende, ápiwayı mektep qosımshasındaǵı GRADE klassı ushın C++ derek faylı:
```cpp
// grade.cpp
// ---------
#include "grade.h"

GRADE::GRADE( const char letter )
{
// Obyektke 'this' gilt sózi arqalı silteme beriw.
// ----------------------------------------------
this->letter = letter;

// Bul Waqıtsha Baylanıs
// -------------------------
this->numeric = grade_numeric( letter );

}

int GRADE::grade_numeric( const char letter )
{
if ( ( letter == 'A' || letter == 'a' ) )
        return 4;
    else
    if ( ( letter == 'B' || letter == 'b' ) )
        return 3;
    else
    if ( ( letter == 'C' || letter == 'c' ) )
        return 2;
    else
    if ( ( letter == 'D' || letter == 'd' ) )
        return 1;
    else
    if ( ( letter == 'F' || letter == 'f' ) )
        return 0;
    else
        return -1;
}
```
Tómende, ápiwayı mektep qosımshasındaǵı PERSON klassı ushın C++ baslı faylı keltirilgen:
```cpp
// person.h
// --------
#ifndef PERSON_H
#define PERSON_H

class PERSON {
public:
    PERSON ( const char *name );
    const char *name;
};
#endif
```
Tómende ápiwayı mektep qosımshasındaǵı PERSON klassı ushın C++ derek faylı keltirilgen:
```cpp
// person.cpp
// ----------
#include "person.h"

PERSON::PERSON ( const char *name )
{
    this->name = name;
}
```
Tómende ápiwayı mektep qosımshasındaǵı STUDENT klassı ushın C++ baslı faylı keltirilgen:
```cpp
// student.h
// ---------
#ifndef STUDENT_H
#define STUDENT_H

#include "person.h"
#include "grade.h"

// STUDENT - bul PERSONnıń kishi toplamı.
// --------------------------------
class STUDENT : public PERSON{
public:
    STUDENT ( const char *name );
    ~STUDENT();
    GRADE *grade;
};
#endif
```
Tómende ápiwayı mektep qosımshasındaǵı STUDENT klassı ushın C++ derek faylı keltirilgen:
```cpp
// student.cpp
// -----------
#include "student.h"
#include "person.h"

STUDENT::STUDENT ( const char *name ):
    // PERSON úlken klass konstruktorın orınlaw.
    // -------------------------------------------------
    PERSON( name )
{
    // Basqa isleytuǵın nárse joq.
    // -------------------
}

STUDENT::~STUDENT() 
{
    // yad aǵıwınıń aldın alıw ushın
    // grade yadın bosatıw.
    // -------------------------------------------------
    delete this->grade;
}
```
Tómende demonstraciya ushın drayver programması keltirilgen:
```cpp
// student_dvr.cpp
// ---------------
#include <iostream>
#include "student.h"

int main( void )
{
    STUDENT *student = new STUDENT( "The Student" );
    student->grade = new GRADE( 'a' );

    std::cout 
        // Itibar beriń, student PERSONnıń name atın miyras etip aladı
        << student->name
        << ": Sanlı baha = "
        << student->grade->numeric
        << "\n";

    // yad aǵıwınıń aldın alıw ushın
    // student yadın bosatıw.
    // -------------------------------------------------
    delete student;

    return 0;
}
```
Tómende hámmesin kompilyaciyalaw ushın makefile keltirilgen:
```make
# makefile
# --------
all: student_dvr

clean:
    rm student_dvr *.o

student_dvr: student_dvr.cpp grade.o student.o person.o
    c++ student_dvr.cpp grade.o student.o person.o -o student_dvr

grade.o: grade.cpp grade.h
    c++ -c grade.cpp

student.o: student.cpp student.h
    c++ -c student.cpp

person.o: person.cpp person.h
    c++ -c person.cpp
```


## Derekler

__BÖLİDİMÖNDEMEW__