Компьютер программчлал

Чөлөөт нэвтэрхий толь Википедиагаас

Компьютер програмчлал буюу програмчлал нь програмчлалын хэлээр компьютер программыг бичих, шалгах, сахих процесс юм.

Алгоритмыг дүрслэх хэд хэдэн арга байдаг. Эдгээрийн нэг нь програмын хэл ашиглан алгоритм зохиох арга буюу програмчлал юм.

Зохиосон алгоритмыг гүйцэтгэгч нь компьютер. Тэгвэл үг ба график дүрслэлийн аргаар илэрхийлсэн алгоритмыг компьютер “ойлгохгүй”. Учир нь компьютер аливаа мэдээллийг дүрслэх өөрийн гэсэн хэлтэй. Түүгээр нь илэрхийлсэн мэдээллийг л “ойлгоно”. Ийм компьютерын хэл дээр зохиогдсон алгоритмыг програм, харин програм зохиох процессыг програмчлал хэмээн нэрийддэг.

Компьютерын хэл гэж ямар юм байх вэ? Орчин үеийн компьютер бол нарийн бүтэцтэй дижитал электрон төхөөрөмж гэдгийг бид мэднэ. Түүний мэдээлэл боловсруулах үйл ажиллагаа дотор талын логик элементүүдэд (схемүүдэд) өгөгдсөн хүчдэлээр зохицуулагдана. Логик элемент нь “асаалттай”, “унтраалттай” (эсвэл “үнэн”, “худал”) гэсэн хоёр тогтвортой логик төлвийн аль нэгд оршдог. Ихэвчлэн +5В хүчдэл өгөгдсөн байвал асаалттай төлөв (гүйдэл байна), харин 0-1В хүчдэл өгөгдсөн байвал унтраалттай төлөв (гүйдэл байхгүй) гэнэ. Харин хүн эдгээр төлөвийг тоогоор илэрхийлж загварчилна. Тухайлбал “асаалттай” төлвийг 1, “унтраалттай” төлвийг 0-ээр кодлодог. Тиймээс энэ хоёр цифрийн тодорхой дараалал ө.х. олон тооны логик элементийн комбинациар ямар ч мэдээллийг кодлож (дүрсэлж) болно. Ингэж ч кодлодог. Үүнийг компьютерын хэл гээд байгаа юм.

Image:pic1.jpg

Түүнээс гадна энэ хэл дээр мэдээллийг гүйцэт зөв кодлохын тулд компьютерын логик элементийн тоо асар их (хэдэн тэрбум) байх ёстой болдог. Тийм ч байдаг.

Хэдэн үндсэн цифрийг ашиглан дурын тоог илэрхийлэх аргачлалыг тооллын систем гэдэг. 0 ба 1 гэсэн хоёрхон цифрийг ашигласан тооллын системийг 2-тын тоолол (BIN-Binary) хэмээн нэрийднэ. Тэгэхээр компьютерын техникт бол 2-тын тооллын системийг ашигладаг ажээ. Энэ тооллын системд, 0 ба 1-ийн дурын дараалал ямар нэгэн 2-тын тоо болно. Ө.х. компьютерын хэл дээрх мэдээлэл гэдэг нь дандаа 2-тын тоонуудаар кодлогдсон байх нь. Ийм кодын “хоёр талд” хэрэглэгч, компьютер хоёр “сууж” байх бөгөөд компьютер уг кодыг логик элементүүдийн дараалал мэтээр шууд “уншиж” байхад хэрэглэгч бол уг кодыг мэдээлэл болгон тайлж уншина. Эсрэгээр мөн мэдээллээ кодлон “бичнэ”. Үүнийг програмчлал гээд байгаа.

Агуулга

[Өөрчлөх] Тооллын системд ажиллах

Компьютер бол 2 үндсэн ялгаатай төлвийг л “ойлгох” учраас 2-тын тооллын системд ажилладаг гэдгийг өмнөх сэдвээс үзлээ. Гэтэл хүмүүс бид өдөр тутмын амьдралдаа 2-тын тооллыг хэрэглэдэггүй. Бид 10-тын тооллыг (DEC-Decimal) хэрэглэдэг. Магадгүй бидний гар 10 хуруутай, эдгээрийнхээ тусламжтайгаар бид 10 ялгаатай төлвийг тун хялбархан ойлгож, дүрсэлж чадах учраас тэр байх. Ингэхээр хоёр өөр тооллын системд харилцан шилждэг байх зайлшгүй шаардлага гарч ирнэ.

2-тын тоолол {0, 1}, 10-тын тоолол {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} гэсэн цифрүүдээс тогтоно. Тухайн системийн цифрийн тоог суурь (base) гэнэ. Суурийг p-ээр тэмдэглэвэл 2-тын тооллын p=2, 10-тын тооллын p=10 байна. Цифрүүдийн комбинаци тухайн системд ямар нэг тоог илэрхийлнэ. Тухайн тооны бичвэрт цифрийн эзлэх байрыг байрлал гэнэ. Байрлалын дугаарыг орон гэдэг. 2-тын тоололд орныг бит (bit-Binary digiT) хэмээн нэрийднэ. Орон буюу битүүд нь хамгийн баруун гар талаасаа 0-ээр эхлэн зүүн тийш өсч дугаарлагдана. Дараалсан хоёр битийн их дугаартайг нь ахлах бит, бага дугаартайг нь бага бит гэнэ.

[Өөрчлөх] Эерэг бүхэл тоо

Ямар нэг X гэсэн эерэг бүхэл тоо нь p суурьтай тооллын системд n ширхэг xi (i=0,n-1) цифрээс тогтоно гэвэл, ө.х.

xn-1xn-2...x1­x0

гэж бичигдсэн байвал энэ бичвэрийн 10-тын эквивалент нь:

X(10) = xn-1 * pn-1 + xn-2 * pn-2 + ... + x1 * p1 + x0 * p0 (to10a)

гэсэн томъёогоор олдох юм. Ж.нь 110102 гэсэн 2-тын тоог үзье. Дээрх томъёог хэрэглэхэд 2610 гэж гарна.

Эсрэгээр, эерэг бүхэл 10-тын тоог бусад тооллын систем рүү яаж шилжүүлэх вэ гэдгийг үзье. X гэсэн 10-тын тоог p суурьтай тооллын систем рүү хөрвүүлэхдээ дараах алгоритмыг баримтлана. Энэ алгоритмыг (from10a) алгоритм гэе.

1. X-ийг p-д хувааж, ноогдвор q, үлдэгдэл a-г олно.

2. Хэрэв 1-р алхмаар олдсон ноогдвор q≠0 байвал түүнийг X болгон аваад, харин үлдэгдэл a-г өмнө нь олсон үлдэгдлүүдийн зүүн талд нэмж бичнэ. 1-р алхамд шилжинэ.

3. Хэрэв 1-р алхмаар олдсон ноогдвор q=0 байвал алгоритм зогсоно. Харин олсон бүх үлдэгдлүүдийн дараалал бол анхны X тооны p суурьт систем дэхь эквивалент байна.

Ж.нь 7510 гэсэн 10-тын тоог 2-тын тоонд хувиргавал:

Image:Pic2.jpg

Мэдээж энэ 2-тын кодод (to10a) томъёог хэрэглэхэд буцаад 7510 гарна. Нэг зүйлийг тэмдэглэхэд, 2-тын кодын зүүн талд 0 битүүдийг нэмж бичлээ гээд 10-тын эквивалент өөрчлөгдөхгүй болох нь (to10a) томъёоноос харагдаж буй байх. Харин 1-ийг залгавал өөр тоо гарна. Тухайлбал 001001011 гэсэн 9 битийн код бол мөн л 7510 байна.

Сая 7510-ыг 2-тоор дүрслэхэд 7 бит боллоо. Том тоог дүрслэхэд бүр олон бит бичигдэх нь. Ж.нь 12810=10000000 (8 бит), 200610=11111010110 (11 бит), 6500010=1111110111101000 (16 бит), 10610=11110100001001000000 (20 бит) г.м. Зөвхөн бичихэд ийм. Гэтэл бас эдгээр дээр арифметик үйлдэл хийх хэрэгтэй болно. Компьютер үүнийг төвөггүй хийчихнэ. Харин хүн бол үйлдэл хийх байтугай “уншихад” төвөгтэй. Иймээс 16-тын тоолол (HEX-Hexadecimal) оруулж ирдэг.

[Өөрчлөх] 16-тын тоолол (HEX-Hexadecimal)

16-тын систем хэрэглэснээр 2-тын код 4 дахин богиносно. Энэ тооллын цифрийн олонлог нь {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}, суурь нь p=16 байна. Дараах хүснэгтэд, 16-тын тооллын үндсэн цифрүүд 10-т болон 2-тын тоололд ямар эквиваленттай байхыг харуулжээ.

Image:Pic3.jpg

Эндээс үзэхэд 16-тын эхний 10 цифр нь 10-тын цифрүүдтэй адил бөгөөд түүнээс хойших, латин үсгээр тэмдэглэгдсэн 6 цифрт 10-тын тооллын хувьд нийлмэл тоонууд харгалзаж байна. Харин 16-т ба 2-тын хувьд, 16-тын цифрүүдэд 2-тын системийн эхний 16 тоо харгалзаж байна. Эдгээр тоог 4 битийн урттай бичсэн байна. Ийм 4 бит буюу 16-тын нэг цифрийг нибл (nibble) хэмээн нэрийддэг. Одоо ниблүүдийн ачаар 2-тын код хэрхэн богиносч буйг харъя. 100101102 гэсэн 2-тын кодыг баруун талаас эхлээд нибл, ниблээр салгавал 1001 0110 болно. Тэгээд дээрх хүснэгтийг харж байгаад 1001 ниблийг 916, 0110 ниблийг 616­ гэсэн 16-тын цифрүүдээр солиход 9616 гэсэн 16-тын тоо гарах юм. 8 оронтой бичвэр 2 оронтой бичигдсэн байгаа биз дээ. Өөр нэг жишээ. 1111110000010112-ыг 16-таар бичье. Баруун гар талаас ниблүүдээр салгах гэтэл 15 бит байна. Тиймээс зүүн гар талд 0 нэмье. Ингэлээ гээд тооны утга өөрчлөгдөхгүй:

111111000001011 = 0111111000001011 = 0111 1110 0000 1011 = 7E0B16

Хэрэвзээ 16-тын тоог 2-т руу хөрвүүлье гэвэл сая хийснийхээ эсрэгээр хийх хэрэгтэй.

16-тын тоог 10-т руу шилжүүлэхдээ (to10a) томъёог ашиглана. 10-тын тоог 16-т руу шилжүүлэхдээ (from10a) алгоритмыг хэрэглэнэ. Ж.нь 7510-ыг 16-т руу хөрвүүлэх:

Image:pic4.jpg

Нэмэх, хасах, үржих, хуваах арифметик үйлдлүүдийг хэрхэн гүйцэтгэх вэ? Тоонуудыг хооронд нь баганаар нэмж, хасах, үржих, өнцөглөн хуваах яг л 10-тын тооных шиг зарчмаар хийгдэнэ. Ж.нь:

· Хамгийн том цифр дээр 1-ийг нэмнэ гэхэд түүний оронд хамгийн бага цифр бичигдэж, урд талын цифр 1-ээр нэмэгдэнэ

· Хамгийн бага цифрээс 1-ийг хасна гэхэд түүний оронд хамгийн том цифр бичигдэж, урд талын цифрээс 1-ийг хасна

· Тоог 0-д хувааж болохгүй

г.м. 2-тын тоололд зарим нэг жишээ үзье.

Image:pic5.jpg

16-тын хувьд арай төвөгтэй байж мэднэ. Хамгийн гол нь энд F16+116=1016 гэсэн тэнцэтгэл биелэнэ гэдгийг санах хэрэгтэй.

Image:pic6.jpg

[Өөрчлөх] Сөрөг бүхэл тоо

Энэ хүртэл бид дандаа эерэг бүхэл тоо авч үзлээ. Хэрэв сөрөг бүхэл тоог 2-т, 16-тын системд дүрслэе гэвэл модулийнх нь урд хасах тэмдэг тавьж болно (яг 10-т шиг). Ж.нь -18510 → -101110012. Тэгээд (to10a) томъёо, (from10a) алгоритм, арифметик үйлдлүүдийг хийж болох юм. Ж.нь

-510 – 210 = -710 → -1012 – 102 = - (1012 + 102) = -1112

Харин яг компьютерын санах байгууламжид сөрөг тоог дүрслэх нь үүнээс нэлээн ялгаатай байдаг. Энэ талаар хойно дурдана.

[Өөрчлөх] Бодит тоо

2-т, 16-тын системд бодит тоог яаж бичих вэ? Ийм тоо нь бүхэл, бутархай гэсэн хоёр хэсгээс тогтдог. 10-тын системд бүхэл, бутархай хэсгүүдийг нь таслалаар тусгаарлан бичдэг. Яг үүний адилаар 2-т, 16-т системүүдэд бичнэ. Ө.х. ямар нэг X гэсэн эерэг бодит тоо

xn-1xn-2...x1­x0, x-1x-2...­x-m

гэж дүрслэгдэнэ. Энд xi - цифр, n - бүхэл хэсгийн орны тоо, m - бутархай хэсгийн орны тоо буюу нарийвчлал. Ж.нь

1011,12

5E,A716

г.м.

Харин бодит тооны 10-тын эквивалентыг олохдоо (to10a) томъёотой ер нь бол адилхан дараах томъёог ашиглана. Энэ томъёог (to10b) гэе.

X(10) = xn-1 * pn-1 + xn-2 * pn-2 + ... + x1 * p1 + x0 * p0 + x-1 * p-1 + x-2 * p-2 + ... + x-m * p-m (to10b)

Ж.нь

1011,22 = 1 * 23 + 0 * 22 + 1 * 21 + 1 * 20 + 1 * 2-1 = 8 + 2 + 1 + 0,5 = 11,510

5E,A716 = 5 * 161 + E * 160 + A * 16-1 + 7 * 16-2 = 80 + 14 + 0,625 + 0,02734375 = 94,6523437510

10-тын системийн бодит тоог бусад систем рүү яаж шилжүүлэх вэ? Мэдээж бүхэл ба бутархай хэсгийг тус тусад нь шилжүүлнэ. Бүхэл тоог хэрхэн шилжүүлэхийг өмнө үзсэн ((from10a) алгоритм). Тиймээс бутархай хэсгийг шилжүүлэх асуудал үлдэж байна.

0,62510 гэсэн 10-тын бутархайг авч үзье. Үүнийг

0/100 + 6/101 + 2/102 + 5/103 = 6 * 10-1 + 2 * 10-2 + 5 * 10-3

гэж 10 суурьтай бүхэл зэргүүдээр задлана. Нөгөө талаас 0,62510-ыг

0,5 + 0,125 = 1/2 + 1/8 = 1/21 + 1/23 = 1 * 2-1 + 1 * 2-3

гэж бичье. Илүү дэлгэрэнгүйгээр бол

0/20 + 1/21 + 0/22 + 1/23 = 0 * 20 + 1 * 2-1 + 0 * 2-2 + 1 * 2-3

гэж болно. Энд (to10b) томъёо бичигдсэн байгааг анзаарав уу.

Image:pic7.jpg

Тиймээс үржвэрүүдийн эхний гишүүдийг түүж, 20-ийн өмнөх цифрийг таслалын зүүн талд, бусдыг баруун талд бичихэд

0,101

гэж гарна. Энэ бол 0,62510-ын 2-тын код юм.

Дээрх гаргалгаанаас нэг дүгнэлт хийж болно. Зөвхөн 1/2-ын бүхэл зэргүүдээр гүйцэд задарч чадах тийм бутархайнууд л төгсгөлөг 2-тын код үүсгэнэ. Тиймээс 3/4, 7/8 г.м.-ийг 2-тоор яг нарийн дүрслэх боломжтой бол 1/3, 2/5 г.м.-ийг боломжгүй. Эдгээрийг зөвхөн тодорхой нарийвчлалтай кодлож болно (битийн тоог хүн өөрөө хязгаарлаж). Ж.нь

2/5 = 0,410 = 0,011001100112 (11 битийн нарийвчлалтай)

Аравтын бутархайг 16-тын систем руу шилжүүлнэ гэвэл тэр тоо мөн л 1/16-ын бүхэл зэргүүдээр гүйцэд задардаг байх ёстой. Үгүй бол тодорхой нарийвчлалтайгаар кодлоно.

Ерөнхий тохиолдолд X гэсэн 10-тын бутархайг p суурьтай тооллын систем рүү хөрвүүлэхдээ дараах алгоритмыг баримталж болох юм. Энэ нь:

1. X-ийг p-ээр үржинэ.

2. Хэрэв 1-р алхмаар олдсон үржвэрийн бутархай хэсэг нь 0 болоогүй эсвэл заасан нарийвчлалд хүрээгүй бол энэ бутархайг X болгон аваад 1-р алхамд шилжинэ.

3. Хэрэв 1-р алхмаар олдсон үржвэрийн бутархай хэсэг нь 0 болсон эсвэл заасан нарийвчлалд хүрсэн бол алгоритм зогсоно. Харин энэ хүртэл олсон бүх үржвэрийн бүхэл хэсгүүдийн шууд дараалал бол анхны X бутархайн p суурьт систем дэхь эквивалент болно.

Энэ алгоритмыг (from10b) гэж нэрийдье.

[Өөрчлөх] Өгөгдлийг компьютерт дүрслэх

Компьютер програмыг биелүүлэхийн тулд програм болон өгөгдлүүдийг шуурхай санах ойд түр зуур байрлуулна. Түүний хувьд програм ба өгөгдлийн хооронд ялгаа байхгүй бөгөөд бүгдийг нь өгөгдөл гэж “үзнэ”. Санах ой нь дараалсан олон жижиг хэсгүүдээс тогтсон байдаг. Нэг ийм хэсгийг нүд (cell) гэнэ. Нүд болгон өөрийн гэсэн үл давтагдах дугаартай байна. Түүнийг нь хаяг (address) гэнэ.

Image:pic8.jpg

Нэг нүд ямар хэмжээний мэдээлэл хадгалах багтаамжтай вэ? Өнгөц бодоход 1 бит баймаар санагдавч тийм биш харин 8 бит байдаг байна. Тэгээд энэ 8 битийг 1 байт (byte) гэж нэрлэнэ. Учир нь ганц бит хангалттай мэдээллийг дүрсэлж чадахгүй. Харин бүлэг бит бол тэгж чадна. Жишээ нь 1 байт бол латин цагаан толгойн нэг үсгийг кодлоход яг хүрэлцдэг байна. Ийнхүү санах ойн нэгжээр битийг биш байтыг авсан учраас санах ойн нүд гэхийн оронд санах ойн байт, нүдийн хаяг гэхийн оронд байтын хаяг гэх мэтээр заримдаа ярьж, бичдэг. Харин байт дотроо битүүд нь 0-7 хүртэл дугаарлагдсан байна. Дугаар баруунаас зүүн тийш өсч эрэмбэлэгдэнэ.

1 байт хамгийн багадаа 000000002=010, хамгийн ихдээ 111111112=25510=28-1 гэсэн утга авна. Тиймээс нийтдээ 25610=28 янзын утга авах боломжтой. Түүнчлэн:

Image:pic9.JPG

16-тын системд 1 байт гэдэг нь 2 нибл. Тэгэхээр 1 нибл бол хагас байт. Иймээс 16-тын 2 цифрээр нэг байтыг бичнэ. Тэгээд 2 байтыг 4 цифрээр, 4 байтыг 8 цифрээр г.м.

Компьютерын санах ойд өгөгдлийг хэрхэн дүрслэх вэ?

[Өөрчлөх] Эерэг бүхэл тоо

Санах ойд ихэвчлэн 1 юм уу 2 байт (нүд) эзэлдэг. Дүрслэхэд хамгийн хялбар. Шууд 2-тын бичлэгээр нь хадгалдаг. Тухайлбал, тооны 2-тын кодыг олж, шаардлагатай бол зүүн талд нь 0-үүд нэмээд, 1 байт (8 бит) эсвэл 2 байтын (16 бит) нүд эзлүүлнэ. 2 байтын тохиолдолд зүүн гар талын 8 битийг ахлах байт (high byte), баруун гар талын 8 битийг бага байт (low byte) гэх бөгөөд санах ойн дараалсан нүднүүдэд цуварч байрлана.

Зарим нэг жишээ.

7210 гэсэн тоог авч үзье.

Image:pic10.jpg

Энд 72 гэсэн тоо санах ойн дурын i (болон i+1) хаягтай нүдэнд хэрхэн байрлахыг үзүүлжээ. Ганц байтын дүрслэлд бол хачирхалтай зүйл алга, тоо ганц нүдэнд байрлана. Харин 2 байтын дүрслэлээр, их хаягтай нүдэнд ахлах байт нь суусан байгааг анхаараарай. Энэ бол Pentium бүлийн процессоруудын онцлог юм.

175810 гэсэн тоог авч үзье. Үүнийг 1 байтаар дүрслэхэд багталцахгүйг анзаарсан байх аа (1758>255).

Image:pic11.jpg

Хэрэв дүрслэх тоо 2 байтаас илүү зай эзлэх бол 4 байт зориулна. Гэхдээ ихэнх програмчлалын системд бүхэл тоон өгөгдлийн утгын мужийг дээд талаас нь 231-оор (32-битийн процессор бүхий компьютерт) хязгаарладаг.

Дан эерэг утга авдаг бүхэл хэмжигдхүүн математик тооцоонд тийм ч их таардаггүй боловч компьютерын програм хангамжид өргөн хэрэглэгддэг. Ж.нь санах ойн нүдний хаяг дандаа эерэг бүхэл тоо байна. Мөн санах ойн нүдэнд хадгалагдах тоо өөрөө ямагт эерэг байх ёстой.

[Өөрчлөх] Тэмдэгт бүхэл тоо

Эерэг юм уу сөрөг утга авах боломжтой бүхэл тоог ингэж нэрийдсэнийг ойлгож буй байх. Санах ойд 1, 2 эсвэл 4 байт (нүд) эзэлдэг.

Image:pic12.jpg

Хүн сөрөг тоог дүрслэхийн тулд “-” гэсэн тусгай тэмдгийг ашигладаг. Гэтэл компьютерын санах ойн нүд ямагт эерэг утга агуулж байхаар “цаанаасаа” зохицолдсон (1 байтын утгын муж 0..255). Тиймээс сөрөг тоог тэмдгийнх нь хамт шууд 2-тын бичлэгээр нь хадгалах боломжгүй юм. Ө.х. сөрөг тоог ямар нэг аргаар эерэг бүхэл тоо болгож кодлох хэрэгтэй болдог. Ингэхэд ямар аргууд хэрэглэгддэг вэ? Үүнд:

· Шууд код

· Нэмэлт код буюу Хоёрын гүйцээлт (Two’s complement)

г.м.

Эдгээр нь сөрөг тоог өөр өөрөөр кодлоно. Гэхдээ кодын хамгийн ахлах битийг тэмдгийн битээр сонгож авдгаараа адилхан. Энэ бит 1 байх нь “-”, 0 байх нь “+” тэмдгийг заана. Эерэг бүхэл тооны шууд ба нэмэлт код нь тэр тоо өөрөө байна.

· Шууд код

Хамгийн энгийн арга. Хамгийн ахлах битийг тэмдгийн битээр сонгож авна. Үлдсэн битүүдээр тооны абсолют утгыг дүрслэнэ. Ж.нь -110 гэсэн тоог 1 байтын форматаар шууд кодын аргаар дүрслэвэл:

Image:pic13.jpg

Одоо -110+110=010 байгаа эсэхийг шалгаад үзье:

Image:pic14.jpg

0-ийн оронд -2 гараад иржээ. Хэдийгээр кодлох процесс нь хялбар боловч ердийн нэмэх үйлдэл энэ аргад таарахгүй байна. Иймээс нэг бол сөрөг тоог нэмэх өөр арга зохиох эсвэл сөрөг тоог дүрслэх өөр арга олох хэрэгтэй болно.

· Нэмэлт код буюу 2-ын гүйцээлт

Энэ арга нь ямар нэг m гэсэн сөрөг тоог

2N - |m| > 0

гэсэн ялгаврын 2-тын кодоор бичих явдал юм. Энд N - шаардлагатай битийн тоо (8, 16, 32 г.м.). |m| - модуль. Ө.х. сөрөг тооны модуль дээр нэмэхэд 2N гарч байх тэр нэмэлтийг бичих учраас энэ аргыг Нэмэлт код гэдэг.

Гэхдээ практикт дээрх ялгаврыг шууд бодох нь тохиромжгүй байдаг. Учир нь 2N-ыг олохын тулд нэмэлт бит шаардагдана. Ж.нь N=8 битийн форматаар (1 байтаар) бичнэ гэхэд 28=25610=1 0000 00002 гээд 9 бит буюу 0000 0001 0000 00002 гээд 2 байт болох нь ээ. Тиймээс Нэмэлт кодын оронд түүнтэй адил үр дүн өгдөг “2-ын гүйцээлт” хэмээх алгоритмыг ашиглана. Энэ алгоритмыг томъёолбол:

1. Сөрөг тооны модулийн 2-тын кодыг олох

2. Энэ кодын бит бүрийг инверслэх: 0-ийг 1, 1-ийг 0 болгох (үүнийг урвуу код гэнэ)

3. Гарсан код дээр 1-ийг нэмэх

алхмуудаас тогтоно. Эдгээрийг дэс дараалан гүйцэтгэхэд олдох кодыг m тооны 2-ын гүйцээлт гэдэг. Энэ нь бас m тооны нэмэлт код юм. Бас m тооны санах ой дахь дүрслэл болно. Ж.нь -5 гэсэн тооны 2-ын гүйцээлтийг 1 байтын форматаар олъё.

Image:pic15.jpg

Одоо -510+510=010 байгаа эсэхийг шалгаад үзье:

Image:pic16.jpg

Нийлбэр хэдийгээр 9 битийн урттай болсон ч 9 дэхь битийг компьютер “хаядаг”. Учир нь нийлбэрийн үр дүн 1 байтын урттай байх ёстой. Ингээд үлдсэн хэсэг 0 болж байна. Хариу зөв байна. Дээрх тооцоог 2, 4 байтын форматаар хийхэд адил чанараа алдахгүй.

Өөр нэгэн жишээ. -310–710=-1010 болохыг үзэцгээе. Нэг байтын форматаар бичье.

Image:pic17.jpg

Гарсан код дээр дахин “2-ын гүйцээлт” хийгээд -10 гэсэн тоо болохыг мэдэж болно.

Ийнхүү 2-ын гүйцээлтээр олсон кодуудыг ердийн нэмэх үйлдлээр нэмэх боломжтой байгаа нь түүний давуу тал юм. Орчин үеийн компьютерүүдэд энэ арга ихэвчлэн хэрэглэгддэг.

Хэрэв ямар нэг сөрөг тооны нэмэлт код өгөгдсөн үед түүнээс энэ тооны модулийг яаж олох вэ гэсэн асуулт мэдээж гарч ирнэ. Үүний тулд нэмэлт код дээр “2-ын гүйцээлт” хийнэ. Ингэхэд олдох код сөрөг тооны модуль байх болно. Ж.нь 11111000 гэсэн код өгөгджээ. Хэрэв энэ нь 2-ын гүйцээлт бол ямар сөрөг тоог дүрсэлсэн болохыг олъё:

Image:pic18.gif

-810 гэсэн тоог дүрсэлсэн байжээ.

[Өөрчлөх] Өгөгдлийн төрөл

Яг үнэндээ бол, санах ойн нүдэнд байрлах 2-тын код сөрөг тоог дүрсэлж байна уу, үгүй юу гэдгийг тухайн кодтой ажиллах машины команд шийддэг. Хэрэв командын алгоритмд “өгөгдлийг тэмдэгт бүхэл тоо гэж үз” гэсэн заавар байвал кодын ахлах битийг 1 байна уу, 0 байна уу гэдгийг шалгаад, 1 байвал түүнийг сөрөг тооны 2-ын гүйцээлт мэтээр “ойлгож” зохих үйлдлийг хийнэ. 0 байвал эерэг тоо гэж “ойлгоно”. Харин “эерэг тоо гэж үз” гэсэн заавар байвал кодыг шууд тэр чигээр нь “ойлгоно”. Өгөгдлийг ингэж өөр өөрөөр “хүлээн авдаг” командууд “Өгөгдлийн төрөл” (Data type) гэсэн ойлголттой салшгүй холбоотой. Энэ нь програмчлалын нэгэн чухал ойлголт (бүрдэл хэсэг) юм.

[Өөрчлөх] Бодит тоо

Бүхэл тоон олонлогоос ялгаатай нь бодит тоон олонлог бол тасралтгүй, мөн төгсгөлгүй байдаг. Тиймээс бүхэл тоонуудыг ямар нэг “но”-гүйгээр үл давтагдах төгсгөлөг 2-тын кодуудаар дүрсэлж болдог бол бодит тооны хувьд ийм биш. Ө.х. зарим бодит тоог төгсгөлөг кодоор дүрслэх боломжтой байхад зарим нь боломжгүй. Энэ талаар бид өмнө нь үзсэн.

Асуудлын гол нь компьютерын санах ой төгсгөлөг тооны нүдээс тогтдог явдал юм. Үүнээс шалтгаалан компьютерын ажиллаж чадах бодит тоон олонлог мөн дискрет, бас төгсгөлөг байх ёстой болно.

Компьютерын ухаанд бодит тоог хөвөгч цэгтэй тоо (floating-point number) гэж нэрлэдэг. Яагаад ингэдгийн учиртай танилцъя.

Дурын X бодит тоог p суурьт тооллын системд:

X = (±M) * p±q

гэсэн зэрэгт хэлбэрээр бичиж болдог. Энд M-ийг X тооны мантисс (mantissa) гэж нэрлэнэ. Мантисс гэдэг нь тухайн тооны 0-ээс ялгаатай цифрүүдийг агуулсан үржигдэхүүн юм. Харин q-г X тооны p систем дэхь зэрэг (exponent) гэнэ. Ийм бичиглэлийг хөвөгч цэгтэй дүрслэл гэж нэрлээд байгаа. Ж.нь 30000.0 гэсэн тоог 3.0*104, 0.3*105, 0.03*106 г.м.-ээр олон янз бичиж болно. Энд, бутархайн орны таслалыг “урагш, хойш хөдөлгөх” маягаар мантиссыг өөр өөр нарийвчлалтайгаар бичиж байна. Үүнийг зэргийн тусламжтайгаар гүйцэтгэнэ. Зэрэг нь мантиссын хамгийн эхний цифртэй харьцангуй таслалын байрлалыг зааж өгч байна. Ийм учраас хөвөгч цэгтэй тоо гэж нэрлэдэг. Дашрамд дурдахад бутархайн таслалын оронд цэгээр тэмдэглэдэг.

2-тын системийн хувьд энэ нь мөн хэрэгжинэ. Ж.нь 2,62510 гэсэн тоог:

10.1012 = 1.01012 * 21 = 0.101012 * 210

г.м.-ээр бичнэ. Энд сүүлийн тооны зэргийг 2-тын кодоор бичсэнийг анхаараарай (102=210).

Компьютерын санах ойд бодит тоо яг ингэж мантисс ба зэрэг гэсэн хоёр хэсэг болон хадгалагддаг. Мантисс болон зэргийг дүрслэх битүүдийн тоог урьдаас тогтоосон байх болно.

Хэрэв хөвөгч цэг мантиссын хамгийн эхний 0-ээс ялгаатай цифрийн өмнө байрлаж байвал тухайн тоо хамгийн өндөр нарийвчлалтайгаар дүрслэгддэг байна. Үүний тулд мантиссыг ямагт 1-ээс бага, цэгийн яг ард талын цифр 0-ээс ялгаатай байхаар бичих хэрэгтэй. Ө.х.:

0.12 ≤ M < 12

нөхцлийг хангах ёстой. Энэ нөхцлийг хангаж дүрслэгдсэн тоог нормалчлагдсан (normalized) гэж нэрлэнэ. Ямар ч тоог хялбархан нормалчилж болно. Ж.нь

Image:pic19.jpg

Сая дурдагдсан нормалчлал бол сонгодог хэлбэр юм. Нормалчлалын өөр хэлбэр бас бий. IBM PC төрлийн (Intel маркийн микропроцессор бүхий) компьютерүүдэд, хөвөгч цэг мантиссын хамгийн эхний 0-ээс ялгаатай цифрийн ард байрлаж байхаар дүрсэлдэг. Ө.х. мантиссын бүхэл хэсэг ямагт 1 байна: 12 ≤ M < 102

Ж.нь

Image:pic20.jpg

Ийнхүү мантиссын эхний цифр ямагт 1 байх учраас тоог санах ойд хадгалахдаа энэ 1-ийг хаядаг. Мөн цэгийг ч дүрслэх шаардлагагүй. Ингэснээр бутархай хэсгийн дахиад нэг орныг нэмж хадгалах боломжтой болно. Ө.х. тоог дүрслэх нарийвчлалыг ихэсгэнэ. “Хаягдсан” 1-ийг “далд нэгж” (hidden bit) гэх бөгөөд яг тооцоо хийх болохоороо процессор мэдээж түүнийг “ил гаргаж ирдэг”.

Бодит тоо санах ойд 4 юм уу, 6, 8 эсвэл 10 байт (харгалзан 32, 48, 64, 80 бит) зай эзлэнэ. Ингэхдээ түүний бүх бүрдэл хэсгүүд:

• мантиссын тэмдэг

• мантисс

• зэргийн тэмдэг

• зэрэг

бүгд хадгалагдах ёстой. Гэхдээ мантиссыг хэдэн байтын урттай авах вэ, зэргийг хэдэн байтын урттай авах вэ, мантисс ба зэргийг ямар дарааллаар байрлуулах, тэдгээрийн тэмдгийг яаж тооцох вэ г.м. нь компьютерын төрлөөс хамаарч өөр өөр байж болно.

IBM PC төрлийн машинууд дараах загварыг (олон улсын IEEE Standard for Binary Floating-Point Arithmetic - ANSI/IEEE Std 754-1985 стандарт) баримталдаг. Энэ загварын дагуу, хэрэв тоо нийт n ширхэг битээр (n/8 байт) дүрслэгдэнэ гэвэл тэдгээрийн хамгийн ахлах байтын ахлах бит мантиссын тэмдгийг (0 – эерэг мантисс, 1 - сөрөг мантисс) үлдсэн n-1 ширхэг бит нь зүүнээс баруун тийш чиглэлд зэрэг ба мантиссыг хадгална.

Image:pic21.jpg

Зэргийг санах ойд:

<Шилжсэн Зэрэг> = <Зэрэг> + 2k-1-1

гэсэн томъёогоор хувиргаж хадгалдаг. Энд k бол зэргийг дүрслэх битийн тоо. Үүнийг зэргийн шилжүүлэлт гэнэ. Энэ нь зэрэг эерэг тоо юу сөрөг тоо гэдгээс үл хамааран түүнийг ямар нэг эерэг бүхэл тоогоор “орлуулж” байгаа хэрэг юм. Тоон дээр хийх арифметик үйлдлийн хурдыг ихэсгэж өгдөг ач холбогдолтой. Хэрэв зэрэг сөрөг тоо байвал түүний нэмэлт кодыг зэргийн оронд бичнэ гэдгийг сануулъя.

Мантиссыг дүрслэх битийн тоо түүний нарийвчлалыг тодорхойлдог нь ойлгомжтой. Битийн тоо олон байх тусам тооны нарийвчлал ихэснэ.

IEEE стандарт бодит тоог хадгалах дараах форматуудыг санал болгодог:

Image:pic22.jpg

Жишээ авч үзье. -15.37510 гэсэн тоог дан нарийвчлалаар хэрхэн кодлохыг харцгаая. 2-тын код нь -1111.011 байна. Нормалчилсны дараа -1.111011*211 болно. Бүхэл хэсгийг “хаявал”:

111011

болно. 112=310 гэсэн зэргийг шилжүүлбэл:

3 + 28-1 - 1 = 3 + 128 – 1 = 13010 = 1000 00102

Одоо нийт 32 битийг зүүн гар талаас эхлэн бичнэ. 31 дугаартай хамгийн зүүн захын бит тэмдгийг заах учраас 1 байна (хасах тэмдэг):

1

30-р битээс эхлээд 23-р битийг дуусталх 8 битэд зэргийг бичнэ:

1 1000 0010

22-р битээс эхлээд 0-р битийг дуусталх 23 битэд мантиссыг бичнэ. Манай тохиолдолд мантисс маань 6 цифрээс тогтох тул үлдсэн 17 битийг шууд 0-ээр бөглөнө:

1 1000 0010 11101100000000000000000

Ингээд нийт 32 битийн урттай боллоо. Одоо үүнийг байт байтаар салгавал:

11000001 01110110 00000000 00000000

гэсэн 4 байт болно. Санах ойн дараалсан нүднүүдэд байрлахдаа хамгийн бага байт нь эхнийхэд, ахлах байт нь төгсгөлийнхэд очих тул:

00000000 00000000 01110110 11000001

Товчлохын үүднээс 16-тын кодоор бичвэл:

Image:pic23.jpg

Өмнөх тоог давхар нарийвчлалаар дүрслэх байдал:

Image:pic24.jpg

Компьютерын бодит тоон олонлог төгсгөлөг учраас дээд, доод хязгаар гэж мэдээж гарч ирнэ. Бодит тооны утгын мужийг түүний зэрэг нь тодорхойлдог. Дараах хүснэгтэд дан ба давхар нарийвчлалаар нормалчлагдан дүрслэгдэх тооны утгын мужийг харуулав. Хялбарыг бодож 10-тын тоогоор бичлээ.

Image:pic25.jpg

Нормалчлагдсан тооны хувьд мантисс нь ямагт 0-ээс их байна гэдгийг дахин сануулъя.

Дан болон давхар нарийвчлалт дүрслэлийн хувьд дээрх хүснэгтэд ороогүй зарим онцгой тохиолдлууд бий. Эдгээрийг дараах хүснэгтэд харууллаа.

Image:pic26.jpg

Бодит тооны арифметикт ±0 гэсэн хоёр 0 байдаг ажээ. Эдгээрийн мантисс нь адилхан 0, ганцхан тэмдгийн битээрээ ялгагдана. Нормалчлагдаагүй тоонууд бол хамгийн бага эерэг нормалчлагдсан тоо ба хамгийн их сөрөг нормалчлагдсан тооны хоорондох завсрыг (0-ийг оруулахгүйгээр) “бөглөнө”. 0-д маш ойрхон тоонууд гэсэн үг. Бодит тооны арифметикт ±∞ гэсэн хоёр ∞ байдаг ажээ. Хамгийн их эерэг нормалчлагдсан тооноос их бол +∞, хамгийн бага сөрөг нормалчлагдсан тооноос бага бол -∞ гэдэг байна. NaN гэсэн утга бол 0/0 г.м. байж болохгүй үйлдлийн үр дүнг илэрхийлнэ.

Ийнхүү бодит тоог компьютерт дүрслэх нь бүхэл тоог дүрслэхээс нэлээн төвөгтэй байна. Ийм тоотой ажиллахад зарцуулах хугацаа илүү болно. Нэгэнт л санах ой төгсгөлөг учраас тооны мантиссын дүрслэгдэх нарийвчлал бас анхнаасаа хязгаарлагдмал байна. Ө.х. дурын бодит тоог дүрсэлж чадахгүй. Тиймээс тэдгээр дээр хийсэн үйлдлийн үр дүн үргэлж тодорхой хэмжээний алдааг агуулж байх болно. Энэ алдааг үнэлнэ гэдэг бие даасан, нэлээн төвөгтэй ажил байдаг. Гэсэн хэдий ч орчин үеийн компьютер бодит тоотой төвөггүйхэн ажиллаж чаддаг. Ж.нь Intel маркийн микропроцессорууд (Pentium, Celeron г.м.) бүгд математик копроцессор (floating-point processor) хэмээх тусгай блокийг агуулах ба тэр нь бодит тоотой ажиллах бүх үйлдлийг гүйцэтгэж байдаг.

[Өөрчлөх] Текст

Хамгийн анхны компьютерүүд зөвхөн тоон өгөгдөл боловсруулах чадвартай байсан бол дараа үеийн компьютерүүд мөн текст өгөгдөл боловсруулж чаддаг болсон.

Цагаан толгойн үсэг г.м. тэмдэгтүүдээс тогтох өгөгдлийг текст гэнэ. Мэдээж ийм өгөгдлийг дүрслэнэ гэдэг нь түүнийг бүрдүүлэгч тэмдэгтүүдийг кодлож хадгална гэсэн үг. Компьютерт, санах ойн 1 байтаар (8 битээр) нийт 256 ширхэг ялгаатай тэмдэгтийг кодлох боломжтой байдаг. Ингээд энэхүү 256 боломжийг эрэмбэлэн харуулсан мөн тооны нүдтэй хүснэгт үүсгэж болох ба үүнийг тэмдэгтийн хүснэгт (character table) хэмээн нэрийднэ. Харин хүснэгтийн нэг нүдний дугаарыг тэр нүдэнд байрлах тэмдэгтийн код (character code) гэнэ. Тэмдэгтийн код 0..255 завсарт оршино. Аливаа тэмдэгт компьютерын санах ойд энэ кодоор хадгалагддаг.

Тэмдэгтийн хүснэгтийг тухайн компьютерын мэддэг цагаан толгой гэж ойлгож болно. Тэгвэл өөр өөр төрлийн компьютерүүдийн цагаан толгой нь ялгаатай байдаг. Ө.х. тэмдэгтийн хүснэгтэд байрлах тэмдгүүд нь ялгаатай байна. Тэр бүү хэл, нэг компьютерт байрлах өөр өөр ҮС-ийн тэмдэгтийн хүснэгтүүд ялгаатай байдаг. Үүнээс болоод нэгэнд нь зүв зүгээр харагдах текст нөгөөд нь үл ойлгогдох “ангарагийн бичээс” болж хувирах нь бий.

Гэхдээ ихэнх компьютер ASCII (American Standard Code for Information Interchange) хэмээх загварын дагуу тэмдэгтийн хүснэгтийг “бөглөсөн” байдаг. Ийм хүснэгтийг ASCII-хүснэгт гэнэ. ASCII-хүснэгтийн эхний 128 нүд (0-127 хүртэлх) үл өөрчлөгдөх байнгын “эзэн”-тэй болон стандартчилагдаж, харин үлдсэн 128 нүд (128-255 хүртэлх) стандартчилагдаагүй байна. Үүнээс улбаалан, эхний 128 тэмдэгт нь адил боловч, сүүлийн 128 тэмдэгт нь янз бүр байх өөр өөр ASCII-хүснэгтүүд гарч ирдэг.

Тухайлбал том, жижиг латин үсгүүд, араб цифрүүд ба бусад тэмдэгтүүд стандарт хэсэгт орсон учраас латин үсгээр бичсэн текст дурын компьютер дээр “эвдрэлгүй” гарах жишээтэй. Гэтэл кирилл үсгүүд стандартчилагдаагүй учраас зарим ASCII-хүснэгтийн 128-255 хэсэгт огт ороогүй байж болно, заримд нь орсон байж болно. Хэрэв орсон байлаа гэхэд өөр өөр хүснэгтэд өөр өөр кодтой байж болно. Ж.нь Windows ба MS-DOS үйлдлийн системийн ASCII-хүснэгтүүдийн кирилл үсгийн код адилхан биш. Үүнээс ямар үр дагавар гарахыг та төсөөлж буй байх.

ASCII-хүснэгтийн тэмдэгтийг ASCII-тэмдэгт гэх ба түүний кодыг ASCII-код гэдэг. Дараах хүснэгтэд ASCII-хүснэгтийн стандарт хагасын 32-127 код бүхий хэсгийг харуулав. Эдгээр нь гаралтын төхөөрөмжид дүрслэгдэх боломжтой тэмдэгтүүд юм:

Image:pic27.jpg

Ж.нь 32 гэсэн код бол сул зай (энэ чинь бас л тэмдэгт шүү дээ), 65 гэсэн код бол A үсэг, 97 гэсэн код бол a үсэг юм.

0-31 хүртэлх кодыг удирдах кодууд гэдэг. Удирдах код нь ямар нэг тэмдэгт илэрхийлэхгүй (дүрслэгдэх тэмдэгт байхгүй), харин ямар нэгэн үйлдлийг төлөөлнө. Ж.нь 8 гэсэн код курсорыг зүүн гар тийш нэг шилжүүлэх, 12 гэсэн код дэлгэц цэвэрлэх үйлдлийг заана г.м.

Санах ойд тэмдэгт ASCII-кодоороо хадгалагдана. Гэтэл ASCII-код бол хүснэгтэд байрлах дугаар. Ө.х. санах ойд тэмдэгтийн хэлбэр дүрс нь хадгалагддаггүй ажээ. Компьютерт өөрт нь байдаг тэмдэг дүрслэгч (character generator) хэмээх хэрэгсэл хадгалагдсан ASCII-кодоор ямар тэмдэгт болохыг таньж компьютерын дэлгэц, эсвэл цаасан дээр хэвлэдэг байна.

Дэлхийн олон орны цагаан толгой 256-аас их тэмдэгттэй байдаг. Ийм цагаан толгой ASCII-хүснэгтэд багтахгүй. Үүнээс улбаалан тэмдэгтийг 2 байтаар кодлох аргачлал орчин үед бий болжээ. Ингэснээр нийт 65536 ялгаатай тэмдэгт агуулсан тэмдэгтийн хүснэгт үүсгэдэг. Ийм хүснэгтийг UNICODE-хүснэгт гэнэ. Ж.нь кирилл монгол үсгүүд UNICODE-хүснэгтэнд стандартчилагдсан байдаг.

Текст өгөгдөл эцсийн эцэст мөн л тоогоор дүрслэгдэж байгааг анзаарав уу. Үүний адилаар зураг график, дуун өгөгдөл бас л тоогоор дүрслэгдэнэ. Гол ялгаа нь ямар аргаар дүрслэлээ хийж байна вэ гэдэгт оршино.

[Өөрчлөх] Програмчлалын хэлүүд

Програм зохиох процессыг програмчлал гэдэг бол програмчлал үйлдэхдээ хэрэглэх аргыг програмчлалын хэл (programming language) гэнэ. Өнөөгийн байдлаар дэлхий дээр хэдэн зуун програмчлалын хэл байна. Эдгээрийг, програм зохиож буй хүндээ хэр ойлгомжтой байна вэ, эсрэгээр, компьютертээ мөн хэр ойлгомжтой байна вэ гэдгээр нь:

1. Доод төвшний програмчлалын хэл (Low-level programming language)

2. Дээд төвшний програмчлалын хэл (High-level programming language)

хэмээн ангилдаг. Энэ нь боломжит олон ангиллуудын түгээмэл нэг хувилбар гэдгийг хэлэх хэрэгтэй.

[Өөрчлөх] Доод төвшний програмчлалын хэл

Эхлээд компьютерын бүтэцтэй танилцах хэрэгтэй. Бараг ямар ч компьютерыг дараах блок-схемээр бүдүүвчлэн дүрсэлж болно. Энэ схемийг тайлбарлая. Хэрэглэгч мэдээллийг Оролтын блокоор компьютерт оруулна. Тэр нь Санах ойд (Memory) байрлана. Процессор Санах ойгоос мэдээллийг авч боловсруулаад үр дүнг мөн Санах ойд байрлуулна. Тэндээс Гаралтын блокоор хэрэглэгчид хүрнэ. Мэдээлэл боловсруулах үйлдлийг, төхөөрөмжүүдийг хооронд нь холбох үүргийг процессор гүйцэтгэж байна. Ингэхдээ, урьдчилан тодорхойлогдсон хэсэг бүлэг командын тусламжтайгаар гүйцэтгэдэг. Эдгээр командыг машины командууд (machine commands) гэх бөгөөд бүгд харгалзан өөр өөрийн гэсэн кодтойгоор Санах ойд байрлаж байдаг. Энэ кодуудын цогцыг машины хэл (machine language) гэнэ. Машины хэлээр програм зохиохыг доод төвшний програмчлал гэнэ. Харин програм гэдэг маань тодорхой машины командуудын дараалал болж таарч байна.

Image:pc_scheme.jpg

Процессорын үйлдэл гүйцэтгэгч хэсгийг УТ, АЛТ гэсэн хоёр блокт хуваасан байна. Энд:

· АЛТ - өгөгдлийг боловсруулах (арифметик тооцоо хийх, нөхцөл шалгаж шийдвэр гаргах г.м.)

· УТ - санах ойтой харьцах, бусад хэсгүүдийнхээ ажлыг удирдах г.м.

үүргийг гүйцэтгэдэг. Ө.х. УТ - командыг дамжуулдаг хэсэг, АЛТ - дамжуулсан командыг биелүүлдэг хэсэг гэж ойлгож болно. Ж.нь УТ бол оролтонд өгч буй мэдээллийг хэзээ санах ойд байрлуулах вэ гэдгийг Оролтын блокт, санах ойд байрлах өгөгдөл дээр хэзээ тооцоо хийж эхлэх вэ гэдгийг АЛТ-д, санах ойд байрласан үр дүнг хэзээ гаргах вэ гэдгийг Гаралтын блокт зааварлана.

Процессорт өөрт нь мөн Регистрүүд (Registers) хэмээх санах байгууламжууд бий. Эдгээрийн нэг хэсэг нь АЛТ-д, нөгөө хэсэг нь УТ-д харьяалагддаг. Регистрүүд нь, үйлдэл гүйцэтгэгч хэсгүүдийг үндсэн санах ой, оролт/гаралтын блокуудтай холбогч завсрын “зууч” ой юм. Санах ойд ачаалагдсан програм команд командаар гүйцэтгэгдэх явцад биелсэн/биелэгдэх командын хаяг, код, өгөгдлийн хаяг г.м.-үүд нь регистрүүдээс “арчигдаж”/”бичигдэж” байдаг. Процессорын ажлын хурдыг ихэсгэх зориулалттай гэж үзэж болно.

Машины хэлээр програмчлах үед санах ой, регистр, процессорын командууд гээд түүний бүх нөөцийг хэрэглэгч бүрэн хянах боломжтой. Мэдээж програм шууд компьютерын хэлээр бичигдсэн байх тул компьютерт туйлын ойлгомжтой, нийцтэй байдаг. Гэтэл нөгөө талаас ийм програмыг хүн уншиж ойлгоход маш төвөгтэй болно. Тухайн нэг машины команд ямар кодтой байдгийг сайн мэдэх хэрэгтэй болно. Энэ нь машины хэлээр томоохон програм бичих боломжийг үгүй болгодог.

Үүний улмаас, доод төвшний програм бичих процессыг хялбарчлах зорилгоор бүр 1950-иад оноос ассемблерын хэл (assembler language) хэмээх програмчлалын хэлийг ашиглах болжээ. Энэ хэлийн онцлог нь машины командуудыг богино англи маягийн үгээр төлөөлүүлэн сольсон явдал юм. Ингэснээр, машины хэлээр бол учиргүй тоон цуваа болох байсан програм уншиж ойлгоход дөхөмтэй, тодорхой үгнүүдээс тогтсон текст болж хувирдаг. Ө.х. ассемблерын програмын мөр болгон цаанаа машины нэг командад харгалзах боломжтой. Доорхи жишээнд, a=5 ба b=3 байхад c=a+b үйлдлийг хийж, үр дүнг дэлгэцэнд хэвлэх програм машины болон ассемблерын хэл дээр хэрхэн бичигдсэнийг харуулжээ. Ассемблерын текст хүн харахад арай ойлгомжтой байгаа нь илт. Гэхдээ түүнийг машины хэл рүү хувиргаагүй цагт компьютерт ойлгомжгүй хэвээр байх болно. Хувиргахын тулд ассемблер (assemblers) хэмээх тусгай хөрвүүлэгч програмыг ашиглана. Хэрэв процессорууд хоорондоо ялгаатай бол харгалзах машины командууд нь мөн өөр өөр байдаг. Тиймээс машины хэл ба түүний үгчилсэн “хувилбар” болох ассемблерын хэл нь мөн ялгаатай болж таарна. Тухайлбал энд үзүүлсэн жишээ IBM PC төрлийн компьютерт тохирох аж.

Image:machine_code_sample.jpg

Машины болон ассемблерын стандарт хэл гэж байхгүй. Энэ нь эдгээр хэлээр бичсэн програмыг универсал бус, локал шинжтэй (компьютерээс хамаарсан) болгож байгаа юм. Гэхдээ, нийцэх компьютертэйгээ гүнзгий доод төвшинд буюу аппаратын төвшинд шууд харьцдаг учраас санах ойд эзлэх зай бага, биелэх хугацаа хурдан г.м. сайн талтай. Харин програм бичих процесс нь өөрөө маш төвөгтэй, их хөдөлмөр орсон, програм зохиож буй хүн компьютерын архитектур, ажиллах зарчмыг дээд зэргээр мэдэх шаардлагатай. Ийм учраас машины болон ассемблерын хэлийг гүнзгий буюу доод төвшний програмчлалын хэлүүд гэдэг.

[Өөрчлөх] Дээд төвшний програмчлалын хэл

Компьютерын техник хөгжихийн хэрээр түүнийг хэрэглэх хүрээ улам л өргөжиж, яваандаа олон ажил мэргэжлийн хүмүүс програм бичих хэрэгтэй болсон. Үүнтэй уялдан, компьютерын дотоод зохион байгуулалт, ажиллах зарчим зэргийг нэгт нэгэнгүй тооцох нүсэр хөдөлмөрөөс програм зохиогчийг чөлөөлөх зорилгоор дээд төвшний програмчлалын хэлүүд зохиогджээ.

Эдгээр хэлүүд нь хүний хэл ярианд (ихэвчлэн англи хэлд) илүү ойр, уншиж ойлгоход хялбар, математикийн стандарт тэмдэглэгээнүүдийг өргөн ашигладаг г.м. шалтгаанаар хүн хэрэглэхэд илүү тохиромжтой тул их биш хугацаанд нүсэр хөдөлмөр зарцуулахгүйгээр програм бичихэд тохиромжтой юм. Мөн сурахад хамаагүй хялбар ажээ.

Ийм хэлээр бичсэн програм жирийн л текст байдаг. Тиймээс компьютерийн төрлөөс үл хамааран нэгээс нөгөө рүү амархан зөөгддөг юм. Текстийг мөр мөрөөр (lines) бичигдсэн бүтэцтэй гэж ойлгох хэрэгтэй. Нэг ийм мөрийг илэрхийлэл (expression) эсвэл оператор (statement) хэмээн нэрийднэ. Ямар нэг утга илэрхийлсэн мөрийг илэрхийлэл гэнэ. Харин ямар нэг үйлдлийг илэрхийлсэн мөрийг оператор гэнэ. Операторыг биелэх (executable), үл биелэх (non-executable) гэж ангилдаг. Биелэх оператор нь ямар нэг машины командыг төлөөлнө.

Програмын ийм текстийг машины хэл рүү хувиргаагүй цагт компьютерт ойлгомжгүй хэвээрээ байдаг. Хувиргахын тулд компилятор (compiler) буюу хөрвүүлэгч хэмээх тусгай програмыг ашигладаг. Компилятор нь текстийг нэг удаа бүхэлд нь хөрвүүлнэ. Хэл болгон өөрийн гэсэн компилятортай байна.

Хэл ба хөрвүүлэгч нь салшгүй ойлголтууд юм. Өнөө үед олон төрлийн компьютер, мөн тэдгээрт суух олон янзын үйлдлийн системүүд (платформууд) байгаагаас шалтгаалан нэг програмчлалын хэлний хэд хэдэн ялгаатай хөрвүүлэгч байдаг. Ж.нь UNIX/Linux-т зориулсан хөрвүүлэгч, MS-DOS үйлдлийн системд зориулсан хөрвүүлэгч, Windows-т зориулсан хөрвүүлэгч г.м.

Image:different_compilers.jpg

Хөрвүүлэгдээгүй байгаа текстийг эх код (source code), түүнийг хөрвүүлэхэд үүсэх машины кодыг объект код (object code) гэж нэрлэдэг. Програм бичихдээ бид эдгээр нэр томъёог байнга ашиглах болно. Дээрх зургийг харахад, эх код бол нэг платформаас нөгөө рүү хялбар зөөгдөх боломжтой байна. Гэтэл объект кодууд ингэх боломжгүй. Учир нь өөр өөр хөрвүүлэгчээр үүсгэгдсэн байна.

Дээд төвшний хэл болгон өөрийн гэсэн “зөв бичих” дүрэмтэй. Хэрэв хөрвүүлж буй эх кодонд дүрэм зөрчсөн алдаанууд байвал компилятор объект кодыг үүсгэлгүйгээр, тэр тэр мөрөнд тийм тийм алдаа байна, нийт тэдэн алдаа байна гэсэн мэдээлэл гаргадаг. Эдгээр алдааг бүгдийг нь арилгасан тохиолдолд л объект код үүснэ.

Нэгэнт дээд төвшний програмчлалын хэлүүд нь хүний хэл ярианд ойр бүтэцтэй учраас эсрэгээр компьютерын хэлээс хол ялгаатай болж ирэх нь зүй. Ийм нөхцөлд, түүнийг машины хэлэнд хөрвүүлэх процесс удааширч ирдэг. Үүнээс болоод програмын биелэгдэх хурд доод төвшний хэл дээрх програмыг бодвол харьцангуй удаан, санах ойд эзлэх зай их болно. Гэхдээ үүнийг үл тооцон, өнөөдөр буй ихэнх хэрэглээний програмыг өндөр төвшний хэлүүдээр зохиодог. Дээд төвшний хэлүүдийг:

· Процедур хандалдат програмчлалын (ПХП) хэлүүд

· Объект хандалдат програмчлалын (ОХП) хэлүүд

г.м.-ээр ангилна. Энэ нь боломжит олон ангиллуудын түгээмэл нэг хэлбэр юм.

Процедур хандалдат програмчлал (Procedure oriented programming - POP) гэдэг нь, аливаа програмыг өөр хоорондоо холбоотой хэд хэдэн бие даасан жижиг хэсгүүд болох дэд програмуудаас тогтсон, нарийн эмх журамтай цогц мэтээр авч үздэг технологи болно. Дэд програм гэдэг нь тодорхой нэрээр нэрлэгдсэн хэсэг бүлэг үйлдэл юм. Ингэснээр аливаа том бодлого түүний зөвхөн тодорхой жижиг хэсгийг бодох үүрэгтэй олон дэд бодлогод хуваагддаг. Ө.х. ямар ч бодлогыг олон дэд бодлогод хувааж, тэдгээрийг алхам алхамаар шийдэх замаар зорилгодоо хүрэх зарчмыг хэрэгжүүлдэг ажээ.

Нэгэнт програм нь ингэж олон дэд програмд хуваагддаг бол тухайн програмыг ажиллуулж эхлэнэ гэдэг маань эдгээр дэд програмуудын аль нэг нь бусдаасаа түрүүлж биелж эхлэнэ гэсэн үг. Ө.х. аль нэг дэд програм бусдаасаа давуу эрхтэй байх ёстой. Энэхүү давуу эрхтэй дэд програм хамгийн түрүүнд ажиллаж эхлээд, дараа нь бусад дэд програмуудаа дуудан ажиллуулах ёстой. Түүнийг үндсэн програм (main program) хэмээн нэрийддэг. Тиймээс:

Процедур хандалдат програм = Үндсэн програм + Дэд програмууд

гэж томъёолж болно.

Дэд програм нь бүтцийн хувьд процедур (procedure) эсвэл функц (function) гэсэн хэлбэртэй байна. Функц, процедур болгон өөрийн гэсэн оролт, гаралт буюу эхлэл, төгсгөлтэй байна. Тэдгээр нь хоорондоо оролт болон гаралтанд илгээгдсэн өгөгдлүүдээр холбогдоно. Түүнээс гадна функц хэлбэрийн дэд програм нь утгатай (хариутай) байна. Харин процедур төрлийн дэд програмд ийм утга гэж байхгүй.

Дэд програмыг гарал үүслийн хувьд стандарт ба хэрэглэгчийн гэж ангилдаг. Програмчлалын хэлэнд урьдаас тодорхойлогдож, түүний хөрвүүлэгчийн бүрдэлд орсон байдаг дэд програмыг стандарт дэд програм гэнэ. Байнга хийгдэж байдаг үйлдлүүдийг ингэж стандарт дэд програм болгодог. Ө.х. хэрэглэгч нь стандарт дэд програмыг бэлнээр нь шууд ашиглана. Олон тооны стандарт дэд програмууд нийлээд тухайн хэлний стандарт сан (standard library) гээчийг бүрдүүлнэ.

Алгоритмыг ихэвчлэн процедурт програмчлалын хэлүүдээр програмчилдаг учраас