1-hafta · Foundation

Kompyuter va dasturlash asoslari

Dasturlashni o'rganishdan oldin bitta savolga javob beramiz: kompyuter aslida qanday «o'ylaydi»? Bu darsda ikkilik sanoqni (0 va 1), matn va rang qanday saqlanishini, hamda yozgan kodimiz qanday qilib kompyuter tushunadigan tilga, ya'ni kompilyatsiyaga aylanishini interaktiv tarzda o'rganamiz.

1.1 Dasturlash nima?

Dasturlashda biz kompyuterga nima qilishni qadam-baqadam aytib beramiz. Kompyuter o'zi hech narsa o'ylab topmaydi; u sizning ko'rsatmalaringizni aniq, tartibli va hech qanday taxminsiz bajaradi.

Tasavvur qiling: do'stingizga choy damlashni tushuntiryapsiz. Odamga «choy damla» desangiz yetadi. Lekin kompyuter bunchalik aqlli emas, shuning uchun unga shunday aytish kerak:

  • Choynakka suv quy
  • Suvni qaynaguncha qizdir
  • Choy bargini sol va 5 daqiqa kut
  • Piyolaga quy

Mana shu aniq ko'rsatmalar ketma-ketligi algoritm deyiladi, uni kompyuter tilida yozish esa dastur deb ataladi. Bu kursda biz shunday ko'rsatmalarni yozishni o'rganamiz. Ammo avval kompyuter bu ko'rsatmalarni qanday «eshitishini» bilishimiz kerak.

1.2 Kompyuter va ikki holat: 0 va 1

Kompyuter ichida millionlab juda kichik «kalitlar» (tranzistorlar) bor. Har bir kalitning faqat ikki holati bo'ladi: tok bor yoki tok yo'q. Biz bularni shunday belgilaymiz:

  • 0 degani tok yo'q (o'chiq)
  • 1 degani tok bor (yoniq)

Bitta shunday 0 yoki 1 bit deb ataladi (eng kichik ma'lumot bo'lagi). Sakkizta bit birga bayt bo'ladi. Kompyuterdagi hamma narsa, ya'ni sonlar, harflar, rasmlar, video va musiqa, oxir-oqibat shunchaki 0 va 1 lar to'plami.

Savol tug'iladi: atigi 0 va 1 bilan qanday qilib katta sonlar, butun bir kitob yoki rangli rasm saqlanadi? Javobi quyidagi ikkilik sanoqda. Keling, qo'lda sinab ko'ramiz.

1.3 Ikkilik sanoq sistemasi

Biz kundalik hayotda o'nlik sanoqdan foydalanamiz, unda 10 ta raqam bor (0 dan 9 gacha). Kompyuter esa ikkilik sanoqdan foydalanadi, unda atigi 2 ta raqam bor: 0 va 1. Qo'rqmang, ikkalasining ham siri bitta oddiy g'oyada: har bir raqamning turgan o'rni muhim.

Avval tanish narsa: o'nlik son

«342» sonini olaylik. Aslida biz uni har kuni shunday «yig'amiz», faqat buni sezmaymiz. Har bir raqam o'z o'rin qiymatiga ko'paytiriladi:

100 lar
3
10 lar
4
1 lar
2
= 342

3×100 + 4×10 + 2×1 = 300 + 40 + 2 = 342

Diqqat qiling: o'ngdan chapga har o'rin 10 baravar kattalashadi: birlar, o'nlar, yuzlar...

Endi aynan shu g'oya ikkilikda

Ikkilikda ham xuddi shunday, faqat har o'rin 10 emas, 2 baravar kattalashadi: 1, 2, 4, 8, 16, 32, 64, 128. Bir bayt (8 bit) shu sakkiz o'rindan iborat. Qoida sodda: 1 turgan o'rin qiymati qo'shiladi, 0 turgani qo'shilmaydi.

Masalan, 00001101 sonini birga «o'qib» ko'ramiz:

128
0
64
0
32
0
16
0
8
1
4
1
2
0
1
1
= 13

Faqat yoniq (1) o'rinlarni qo'shamiz: 8 + 4 + 1 = 13

Endi navbat sizda. Pastdagi o'yinda bitlarni bosing va son qanday yig'ilishini o'z ko'zingiz bilan kuzating:

Bitlarni bosib o'ynang bitni yoqing/o'chiring
Natija: 0
0b00000000

Ko'ryapsizmi? Har bir yoniq bit o'z «o'rin qiymatini» qo'shadi. Masalan 01000001 = 64 + 1 = 65. Bir bayt bilan 0 dan 255 gacha, jami 256 ta turli son ifodalash mumkin.

«Menga bu nega kerak, men kod yozaman-ku?» Bu to'g'ri savol. Tinchlaning: kodlashda 0 va 1 ni qo'lda yozmaysiz. Lekin shu poydevorni bilsangiz, keyinroq xotira, ma'lumot turlari, ranglar va xatolar sizga «sehr» bo'lib tuyulmaydi; nima sodir bo'layotganini tushunasiz. Aynan shu narsa kuchli dasturchini boshqalardan ajratib turadi.

Ikkilik ↔ O'nlik o'giruvchi

Istalgan sonni yozing, ikkinchi tomonda uning ikkilik ko'rinishi paydo bo'ladi (va aksincha).

O'giruvchi

1.4 Ma'lumot o'lchovlari: bayt, KB, MB, GB

Bitta bayt deyarli hech narsa, atigi bitta harf. Lekin baytlar yig'ilib ulkan narsalarni tashkil qiladi. Telefoningizdagi «128 GB xotira» yozuvini ko'rgansiz; o'sha GB ham aslida baytlardan iborat. Har bir keyingi o'lchov avvalgisidan ~1000 baravar katta:

1 bayt1 harf
×1000
1 KBqisqa xabar
×1000
1 MB1 rasm
×1000
1 GB~30 daq video
×1000
1 TBminglab film

Demak fayl hajmi («3 MB rasm»), xotira («256 GB»), internet tezligi («50 Mbit/s»), bularning barchasi shu baytlar bilan o'lchanadi. Endi bu sonlarni ko'rganingizda ular siz uchun ma'noli bo'ladi.

Aniqlik uchun: kompyuter ikkilik bo'lgani sabab 1 KB = 1024 bayt (2¹⁰), 1000 emas. Lekin kundalik hayotda qulaylik uchun «taxminan 1000» deb yaxlitlanadi.

1.5 Harf, rang va hex qanday saqlanadi?

Agar bayt bilan 0–255 oraliqdagi sonni saqlay olsak, demak harflarni ham saqlay olamiz: har bir harfga shunchaki bitta son biriktirib qo'yamiz. Masalan, lotincha A = 65, B = 66, a = 97, bo'sh joy = 32.

«Nega aynan 65?» degan savol tug'ilishi tabiiy. Javob oddiy: bu butun dunyo kelishib olgan jadval (xuddi umumiy lug'at kabi), nomi ASCII. Hamma shu jadvalga amal qilgani uchun bir kompyuterda yozilgan matnni boshqasi ham xuddi shunday o'qiy oladi.

Quyiga biror so'z yozing, har bir harf ortida turgan son va uning 8-bitli ikkilik ko'rinishini ko'rasiz:

ASCII tekshirgich

Rang ham uchta son

Ekrandagi har bir nuqta (piksel) rangi uchta baytdan iborat: qancha qizil, qancha yashil, qancha ko'k (har biri 0–255). Bu RGB deyiladi.

Muhim nuqta: bu bo'yoq emas, yorug'lik aralashmasi (ekran nur sochadi). Shuning uchun bo'yoqqa teskari: uchalasi 0 bo'lsa yorug'lik yo'q, ya'ni qora; uchalasi 255 bo'lsa to'liq yorug'lik, ya'ni oq. Slayderlarni suring va rang qanday «sonlardan» tug'ilishini ko'ring:

RGB rang mikseri
R9101011011
G9101011011
B21411010110
#5B5BD6

O'zbekcha-chi? Unicode

ASCII jadvalida atigi 128 ta belgi bor: lotin harflari, raqamlar va tinish belgilari. Lekin dunyoda minglab belgi mavjud: kirill harflar, o'zbekcha oʻ va gʻ, xitoy ierogliflari, hatto emoji 😀. Bularning hammasini sig'dirish uchun Unicode degan kattaroq jadval bor. Unda bitta belgi 1 emas, bir necha baytni egallashi mumkin (eng keng tarqalgan ko'rinishi UTF-8).

Tepadagi ASCII tekshirgichga emoji yoki kirill harf yozib ko'ring, uning kodi 255 dan katta chiqadi, ya'ni bir baytga sig'maydi.

Hex: sonlarning qisqa tili

Rang natijasida #5B5BD6 kabi yozuvni ko'rdingiz. Bu o'n oltilik (hex) sanoq. Unda 16 ta «raqam» bor: 0–9, so'ng A, B, C, D, E, F (ya'ni 10, 11, 12, 13, 14, 15). Nega kerak? Chunki 2 ta hex belgi roppa-rosa 1 baytni (8 bit) ifodalaydi, bu juda ixcham. Masalan FF = 255 (eng katta bayt), 5B = 91. Shuning uchun ranglar hex'da yoziladi: #RRGGBB, ya'ni qizil, yashil va ko'kning bayt qiymatlari.

Demak matn, rasm, video va musiqa, hammasi sonlar, sonlar esa bitlar (0 va 1). Kompyuterning butun «sehri» shu oddiy g'oyaga asoslanadi.

1.6 Kompilyatsiya: kodni mashina tiliga o'girish

Biz dasturni odam o'qiy oladigan tilda yozamiz. Masalan, C tilida «Salom, dunyo!» chiqaruvchi dastur shunday ko'rinadi:

// salom.c (odam yozadigan kod) #include <stdio.h> int main(void) { printf("Salom, dunyo!\n"); }

Lekin protsessor bu matnni tushunmaydi, u faqat ikkilik mashina kodini (0 va 1) biladi. Shu sababli oraliqda bitta «tarjimon» kerak; u kompilyator deyiladi (C uchun mashhuri gcc). Kompilyator sizning kodingizni butunligicha o'qib, protsessor bajara oladigan ikkilik faylga aylantiradi.

Quyidagi tugmani bosing va kod qanday bosqichlardan o'tishini kuzating:

Kompilyatsiya jarayoni
salom.c
odam kodi
gcc
kompilyator
salom
mashina kodi · 01001
Ijro
dastur ishlaydi
$ tugmani bosing...

Agar xato qilsangiz-chi?

Kompilyator juda talabchan: agar kodda xato bo'lsa (masalan, nuqta-vergul tushib qolsa), u dasturni umuman yasamaydi va aniq qaysi qatorda xato borligini aytadi. Bu yaxshi narsa: dastur ishlamasdan oldin xato topiladi. Masalan:

salom.c:4:31: error: expected ';' before '}' token

Bu yozuv «4-qatorda, ; qo'yish unutilgan» degani. Keyingi haftalarda bunday xatolarni o'qishni va tuzatishni o'rganamiz.

Kompilyatsiya vs interpretatsiya

Hamma til ham kompilyatsiya qilinmaydi. C kabi tillar oldindan to'liq mashina kodiga aylantiriladi (kompilyatsiya), natijada tez ishlaydi. Python kabi tillar esa interpretator orqali qatorma-qator, ishlatish payti o'qiladi (alohida kompilyatsiya qadami yo'q); bu qulay, lekin sekinroq. Biz asoslarni C'da o'rganamiz: u kompyuter ichida nima sodir bo'layotganini eng ochiq ko'rsatadi.

Shuning uchun C «kompilyatsiya qilinadigan til» deyiladi. Kodni o'zgartirsangiz, qaytadan kompilyatsiya qilish kerak. Keyingi haftalarda haqiqiy C kodi yozib, brauzerda kompilyatsiya qilamiz.

1.7 Amaliy mashq: o'zingiz yeching

Bilimni mustahkamlashning eng yaxshi yo'li o'zi qilib ko'rishdir. Bu mashqda har safar bitta son chiqadi va ikki holatdan biri bo'ladi:

  • Agar son faqat 0 va 1 lardan iborat bo'lsa (ikkilik), uni o'nlik songa aylantiring.
  • Agar son oddiy bo'lsa (o'nlik), uni 8 bitli ikkilikka aylantiring.

Yechishda pastdagi tayanchdan foydalaning, bular o'rin qiymatlari. Ikkilikni o'qiganda yoniq (1) o'rinlarning qiymatini qo'shing. Masalan: 1010 = 8 + 2 = 10; aksincha, 10 = 00001010. Javobni yozib, Enter (yoki «Tekshirish») bosing. Maqsad: 10 ta to'g'ri javob to'plash.

Mashq mashinasi 0 / 10 to'g'ri
Tayanch (o'rin qiymatlari):1286432168421
🎉 Zo'r! 10 ta to'g'ri javob. Endi ikkilik sanoqni puxta egallabsiz!

1.8 Chuqurroq: ikkilik bilan hisoblash advanced

Bu bo'lim chuqurroq va ixtiyoriy. U sizni «ma'lumotni saqlash»dan «kompyuter qanday hisoblaydi»ga olib o'tadi. Chinakam tushunish shu yerdan boshlanadi.

Ikkilikda qo'shish

O'nlikdagidek qo'shamiz: 0+0=0, 0+1=1, 1+1 esa ikkilikda «10», ya'ni 0 yozib, 1 ni keyingi o'ringa o'tkazasiz (xuddi o'nlikda 9+1=10 dagidek «o'tkazma»). Misol: 3 + 1 = 4:

0011 (3) + 0001 (1) ------ 0100 (4)

Protsessor ichidagi mayda sxemalar aynan shu amalni soniyasiga milliardlab marta bajaradi. Kompyuterning «hisoblashi» mana shu.

Manfiy sonlar va ikki to'ldiruvchi

Faqat 0 va 1 bilan «minus» belgisi yo'q. Hiyla shunday: eng chapdagi bit belgi sifatida ishlatiladi, manfiy sonlar esa maxsus usulda, ya'ni ikki to'ldiruvchi (two's complement) bilan yoziladi. Bu hiylaning go'zalligi: protsessor +5 ni ham, −5 ni ham bir xil qo'shish sxemasi bilan hisoblaydi, alohida ayirish kerak emas. Tafsilotini keyingi haftalarda ko'ramiz.

Bit amallari (bitwise)

Ba'zan dasturchi bitlar ustida bevosita amal bajaradi. Asosiylari: AND (har ikkisi 1 bo'lsa → 1), OR (bittasi 1 bo'lsa → 1), XOR (faqat bittasi 1 bo'lsa → 1), NOT (0 va 1 ni almashtiradi), siljitish (bitlarni chap/o'ngga suradi). Slayderlarni surib, amallarni sinab ko'ring:

Bit amallari laboratoriyasi
A0101101090
B0011110060
Natija: 00011000
= 24 (o'nlik)

Mantiqiy elementlar: hammasi shulardan

Bu amallar protsessor ichida mantiqiy elementlar (logic gates: AND, OR, NOT) deb ataladigan mayda elektron sxemalar bilan bajariladi. Ulardan «qo'shuvchi» (adder), qo'shuvchilardan butun protsessor yig'iladi. Demak kompyuter millionlab AND/OR/NOT elementidan iborat. Atigi 0 va 1 dan butun raqamli dunyo mana shunday quriladi.

Bu bo'limni to'liq tushunmasangiz ham xavotir olmang, keyingi haftalarda yana qaytamiz. Asosiysi, endi «kompyuter sehrli quti emas, u 0/1 bilan hisoblaydigan mashina» ekanini bilasiz.

1.9 Bilim testi

Testdan oldin: yangi atamalar

Bu hafta o'rgangan asosiy tushunchalar. Test oldidan ko'z yugurtirib chiqing:

Biteng kichik ma'lumot, 0 yoki 1.
Bayt8 bit; 0–255 oraliqdagi bitta son.
Ikkilik sanoqfaqat 0 va 1 dan iborat sanoq sistemasi.
O'rin qiymatiraqamning turgan joyi (1, 2, 4, 8...).
ASCIIhar bir harfga son biriktirgan umumiy jadval.
RGBrang = qizil+yashil+ko'k (har biri 0–255).
Mashina kodiprotsessor tushunadigan ikkilik buyruqlar.
Kompilyatorodam kodini mashina kodiga o'giruvchi (gcc).

Endi sinab ko'ramiz

15 ta savol. Haftani yakunlash uchun kamida 11 tasiga to'g'ri javob bering.

Tabriklaymiz! 1-hafta yakunlandi

Endi siz kompyuter ichida hamma narsa 0 va 1 ekanini, sonlar, harf va ranglar qanday saqlanishini, hamda kompilyatsiya nimaligini bilasiz. Bu dasturlashning mustahkam poydevori.