14-блог: Компьютер кодты (коудты) қалай оқыйды? / Kompyuter koudtı qalay oqıydı?
Компьютер жазылған кодты қалай аўдарып, ядтан орын ажыратып, көрсетпелерди әмелге асыратуғынын әпиўайы тилде түсинемиз.
Жалпақ тилде, кодты (коудты) компьютер ушын жазылған буйрық гәп деп алсақ болады. IT тилинде, код бул компьютер ушын жазылған көрсетпе ҳәм инструкциялар жыйнағы есапланады.
Компьютер бул сизиң не қәлеўиңизди түсинип, оны орынлаўға таяр туратуғын "аўдармашы ҳәм жумысшы".
Не ушын аўдармашы ҳәм жумысшы ролин бир ўақытта орынлаўын әсте түсинип аламыз.
Кодты Python, Java яки JavaScript тиллеринде жазсақ болады. Бирақ ең қызығы, усы кодты компьютер тиккелей түсинбейди.

"Сонда қалай?"
Мәселен, мен Қубла Африкалылар сөйлесетуғын свахили тилин билмеймен. Егер сол тилде маған "Мына жерге отыр" деп айтсаңыз да сизге қарап тура беремен. Компьютер де программаластырыў тиллерин тиккелей түсинбейди.
Себеби, программаластырыў тиллериниң көпшилиги жоқары абстрактлы тиллер қатарына киреди. Инглизшесине high-level language деп аталады. Неге компьютер түсинбейтуғын тилде код жазамыз?
Себеби, компьютер түсинетуғын тилде код жазыў жүдә қурамалы болар еди.
Жоқары абстрактлы тиллерди адам, яғный бизлер аңсат оқып, жазып, түсине аламыз.
1. Жоқары ҳәм төмен абстрактлы тиллер
"Яқ, мен компьютер түсинетуғын тилде код жазғым келеди" деп ойласаңыз, Assembly деген төмен абстрактлы тилди үйренсеңиз болады.
Assembly бул компьютер түсинетуғын машина тилине жақынлаў. Нағыз компьютердиң тили деп айталмайман, себеби Assemblyде жазылған код та машина кодына "аўдармаланады".
Төмендеги фотода Python тилинде жазылған код Assembly тилинде қалай жазылатуғыны көрсетилген.

Демек, программаластырыў тиллери жоқары ҳәм төмен абстрактлы болып бөлинеди. Python бул жоқары абстрактлы тил. Соның ушын оны үйрениў/үйретиў аңсатлаў. Java да жоқары абстрактлы тиллер қатарына киреди. C тили компьютердиң қурылмасына жақынлаў болғаны ушын төменирек абстракциялы тил деп қаралады.
Бағана айтып өткен "аўдармашы" басқа тилде жазылған кодты компьютер әмелге асыра алатуғын формаға аўдарып береди.
Бул дегени, мен мәселен свахили тилин түсинбесем де, мийимдеги нейронлар оны тиккелей қарақалпақ тилине аўдарып берип турады. Жүдә зор болар еди! Бирақ бизлер компьютер емеспиз. Бизлерге өз алдына свахили тилин түсинетуғын дилмаш зәрүр болады (яки өзим свахили тилин үйрениўим керек).
Ал, компьютерлерге усы "дилмаш программаларды" орнатып алсақ болады.
2. Код жазыў
Python тилинде код жазыў бул компьютерге көрсетпе бериў дегени. Мәселен, төмендеги әпиўайы кодты алып қарайық.
x = 4
y = 12
sum = x + y
print(sum)Компьютерге қандай көрсетпе берип атырмыз?
-
xдеп аталатуғын ядтан орын ажыратып (код тилинде өзгериўши/айныўшы делинеди), оның ишине 4 деген санды (мәнисти) қой. -
yдеп аталатуғын ядтан және бир орын жаратып, оған 12 деген санды (мәнисти) қой. -
Енди,
xмененyмәнислерин қосып, қосындыны басқаsumдеп аталатуғын ядтағы орынға жайғастыр. -
sumдеген орындағы мәнисти көрсет.
Компьютер бул кодты оқып, орынлаўы ушын, әлбетте оның системасында тийисли программа болыўы керек. Python кодын иске қосыў ушын Python интерпретаторы, Java ушын Java виртуал машинасы (JVM), ал C++ кодын машина кодына аўдарыў ушын C++ компайлер керек болады. Таяр C++ программаны иске қосыў ушын компайлерди ҳәр бир компьютерге орнатыў шәрт емес.
3. Компьютер кодты қалай түсинеди?
Компьютерлер ең соңында 0 яки 1 деген санлардан ибарат бинар (binary) көринистеги машина кодын түсинеди.
"Сонда мен жазған код кейин ала 0 яки 1 деген санларға аўдарылама?"
Аўа!
Бирақ бул процесс бағдарлама тилине қарай ҳәр түрли болады. Мәселен, Python интерпретаторы сиз жазған кодты оқып, көбине оны биринши байткодқа (bytecode) айландырады. Python виртуал машинасы усы байткодты орынлайды. Ең ақырында процессор машина көрсетпелерин әмелге асырады.

4. Ядтан неге орын ажыратамыз?
"Компьютерди компьютер қылатуғын бул яд (memory)". Ҳәзил! Компьютер яды не екенин түсиндирип отырмасам да болатуғын шығар.
Ҳәр бир бағдарлама тили ушын компьютердиң яды әҳмийетли. Қандай да бир кодты иске қосқанымызда ол тиккелей компьютер ядынан пайдаланады.
"Неге ондай?"
Алысқа кетпей, жоқарыдағы кодты алайық.
x = 4
y = 12
sum = x + y
print(sum)x яки y деп аталатуғын өзгериўши/айныўшы (variable/переменный) жаратқанымызда, компьютер өзінің ядынан сол айныўшылардың мәнисин сақлап қоятуғын орын ажыратыўы зәрүр.
Компьютердиң яды миллионлаған-миллиардлаған тартпаларға ийе гиганттай үлкен шкаф деп елестетип көриң. Ҳәр бир тартпаның өзінің адреси бар. Мәселен, сол көптен-көп тартпалардың биреўин сайладыңыз. Қарасаңыз оның адреси мынадай 0x1M2E3H4R5I.

Сөйтип, сол тартпаның ишин ашып, бос екенин көрип, өз затыңызды қойдыңыз. Тартпаның сыртына атыңыз жазылған кишкене қағазды жазып кеттиңиз. Енди усы тартпа сиздики. Егер ҳәмме тартпа бәнт болғанында, ҳеш нәрсе қыла алмас едиңиз. Тартпаларды бир тексерип, пысыңыз қурып, қайтып кетер едиңиз.
Тап сондай, компьютерде программаға жетерли бос яд болса ғана программа иске қосылады.
x = 4 Компьютер x деп аталатуғын өзгериўши/айныўшы ушын ядтан бир "тартпа" ажыратып, оған 4 деген мәнисти қойды.
y = 12 Компьютер y деп аталатуғын өзгериўши/айныўшы ушын ядтан бир "тартпа" ажыратып, оған 12 деген мәнисти қойды.
sum = x + y Компьютер енди x ҳәм y деген тартпаларды ашып, олардың ишиндеги мәнислерди қосып, қосындыны (16) жаңа бир тартпаның ишине қойды. Ҳәм сол тартпаны sum деп атады.
Бул процесс "ядты бөлистириў" (memory allocation) деп аталады. Программа мағлыўмат сақлап қалыў ушын компьютер ядының бир бөлиминен орын алып атыр.
5. Өзгериўши/айныўшы дегенимиз не?
x ҳәм y яки sum деп жазғанымызды инглизшесине variable деп атайды. Қарақалпақшасына, сол өзгериўши яки айныўшы деп алған мақул шығар деп, солай атаған едим.
Атынан көринип турғандай, x, y яки sum деген айныўшылардың мәниси өзгеретуғын болғаны ушын да айныўшы деп алады.

Инглизшесине, variable сөзи vary деген сөзден келип шыққан. "vary" дегенимиз өзгериў/парық қылыў/айныў/аўыў деген мәнисти береди.
Қалай өзгереди дерсиз? Программа жазыўдың жақсы жери усы айныўшылар себепли.
Жоқарыда бизлер 4 ҳәм 12 санларын қосып көрдик. Енди, 500 ҳәм 145 санларын қосып көрмекшимиз. Ал, мениң бухгалтер достым 765 000 ҳәм 72 190 санларын қосып көрмекши.
Сонда, программаны және еки рет жазып отырыў керекпе?
Әлбетте, яқ. Код жазыўдың мақсети қайта-қайта қылатуғын жумысты азайтыў. Соның ушын программаны бир рет жазып, айныўшылардың мәнисин өзгертип отырсақ болады.
x = 500
y = 145
sum = x + y
print(sum)Мәселен, телефонда калькулятордан пайдаланғанда ҳәр сапар калькулятор программасын "А" дан баслап кодинг (коудинг) қылып жаратпаймызғо.
6. Кодты иске қосыў
Кодты иске қосыў бул жазған кодымызды компьютерге орынлаттырыў. Инглизшесине "run code", "execute code" деп те айтылады.
Компьютер жазған кодымызды тийисли программа арқалы оқып, ядтан орын ажыратып болғаннан кейин, нәтийжени көрсетип береди. Усы процести "кодты иске қосыў" деп айтсақ болады.
Нәтийжени экранда көрсетип беретуғын бөлеги print(sum) деген код қатарына дурыс келеди.
-
Ядтан
sumдеп аталатуғын тартпаны ашып, ишиндеги мәниске қарайды. -
Сол мәнисти "тартпадан" алып, экранға шығарып береди.
7. Пердениң артында не жүз береди?
"Пердениң артында" деп компьютердиң ишки қурылысын айтқан едим.
Көзге көринбейтуғын тәрепте нелер жүз беретуғынына бир қарап көрейик.
Компьютер жазған кодымызды оқып, аўдармалап, иске қосқанда, сол компьютердиң ишинде нелер әмелге асады?
7a. Процессор машина кодын орынлайды
Процессор бул мектепте информатика сабағында үйренген компьютер қурылмаларының бири. (Процессор, монитор, клавиатура ҳәм тағы басқа). Процессорды CPU деп те атайды. Ол компьютердиң мийи.
CPU Python байткодын тиккелей оқымайды. Python интерпретаторы ҳәм виртуал машинасы байткодты орынлап атырғанда, CPU ең соңында соған тийисли машина көрсетпелерин орынлайды.
CPU машина көрсетпелерин бирме-бир оқып, расшифровка қылады (өзи түсинетуғын әмеллерге айландырады).
CPU сол көрсетпелерди әмелге асырады. (Мәселен, санларды қосады, алады, қосындыны экранға шығарыў процесине қатнасады ҳәм тағы басқа).
7b. RAMда яд бөлистириледи
Және бир рет информатика сабағын еске алайық. RAM дегенимиз бул оператив память еди.
Компьютерде ядтың бир неше түри бар. Соның бири оператив яд. Ол дата яки мағлыўматты ўақытша сақлап турыўға арналған болады.
RAM бул жоқарыда түсиндирип өткен миллионлаған тартпалар бар шкаф.
Код иске қосылғанда, программа усы оператив ядта бағана жазып кеткен x, y ҳәм sum деген айныўшыларды (variable) сақлап турады. Бирақ мәңгиликке сақламайды.
Программа жумысын тамамлағанда, сол айныўшылар ушын ажыратылған RAM орны босатылады.
7c. Аўдармашы программа CPUға жәрдем береди
Жоқарыда түсиндирип өткендей, кодтың орынланыў усылы ҳәр бир тилде ҳәр түрли. Мәселен, Python интерпретаторы жазылған кодты байткодқа (bytecode) айландырыўы мүмкин. Байткод бул машина коды емес, программа коды менен машина кодының ортасындағы код.
Python виртуал машинасы усы байткодты орынлайды. Ең ақырында CPU машина көрсетпелерин әмелге асырады.
Усы жерде тағы бизлер компайлер, интерпретатор, виртуал машина ҳәм машина коды деген темалар ҳаққында да айтсақ болатуғын еди. Олар ҳаққында кейинги блогларда түсиндирип өтемен.
Ҳәзирше усы айтып өткенлеримди де билип алсаңыз жүдә жақсы 😌