Програмчлалын хэл гэж юу вэ?

Орчин үеийн зарим автомат төхөөрөмж урьдчилан бэлдэж өгсөн зааврын дагуу уг төхөөрөмж
дээр биелэгдэх боломжтой олон тооны эгэл үйлдлүүдийг дараалан биелүүлэх замаар илүү
нарийн төвөгтэй үйлдлийг гүйцэлдүүлдэг. Ерөнхийд нь, ийм заавар бэлдэж өгөх үйл
ажиллагааг

програмчлал,

уг

төхөөрөмжид

“ойлгогдохоор”

заавар

бэлдэх

аргыг

програмчлалын хэл гэнэ. Жишээлбэл, зарим тооны машин дээр дараах мөрийг шууд
бичиж өгч бодуулж болно: “5*(2+3)“. Энд бид тооны машинд “2 дээр 3-ыг нэмээд үр дүнг нь
5-аар үржүүл” гэсэн заавар өгсөн хэрэг. Энэ жишээнд програмчлалын хэл маань тоонууд,
арифметикийн үйлдлүүд ба хаалтуудыг ашиглаж зөв илэрхийлэл бичих дүрмүүдээс тогтоно
гэсэн үг. Бидний бичсэн дээрх “програмыг” ажиллуулахын тулд “=” товчийг дарах
шаардлагатай боловч хялбарчлах үүднээс энд үүнийг манай “програмын” хэсэг биш гэж үзэж
байна.
Хамгийн анхны програмчлалын хэл Чарльз Баббажийн аналитик машинтай хамт үүссэн гэж
үзэж болно. Аналитик машины үндэс нь механикийн араанууд байсан ба араануудыг том
эсвэл жижиг араануудаар солих замаар програмчлах зарчимтай байжээ. 1942 онд бүтээгдсэн
анхны электрон компьютер ENIAC үндсэндээ аналитик машины цахилгаан хувилбар нь
байсан бөгөөд түүнийг програмчлах арга нь (програмчлалын хэл нь) одоогийн гэр ахуйн
цахилгаан халаагуурын тохируулгыг санагдуулам олон тооны утаснуудын холболтыг өөрчлөх
явдал байсан байна.
Жон фон Нейман 1945 онд Жон Маухли, Преспер Эккерт нартай хамтаар

EDVAC

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

WWW.CDEQ.MN

дүнгээс хамаарч санах ойн хаана байрлаж буй зааврыг гүйцэтгэх вэ гэдгийг шийдэж болох
боломж
юм.

Фон
Нейман
ба түүний
хамтрагчд
ын
дэвшүүлсэ
н
компьюте
рийн
архитекту
рын бүдүүвч бүтцийг авч үзье (Зураг 1). Уг бүдүүвч ѐсоор компьютер нь төв процессор (CPU),
шуурхай санах (RAM) ой ба оролт гаралтын төхөөрөмжүүд гэсэн үндсэн хэсгүүдтэй. Шуурхай
санах ойг дараалсан олон нүднүүдээс тогтох маш урт туузаар төсөөлж болно. Ихэнх
компьютерийн хувьд санах ойн эдгээр нүд болгон 0-ээс 255-ын хооронд орших ямар ч бүхэл
тоог хадгалах чадвартай бөгөөд нүд болгон өөрийн гэсэн дугаартай байдаг. Нэг ийм нүдийг
нэг байт (byte) мэдээлэл хадгалах чадвартай гэж ярьна. Мэдээллийг хадгалах бусад
байгууламжууд, жишээлбэл хатуу диск, оптик диск ба флаш-санах ой бүгд ийм байтуудын
дарааллыг

хадгалах

зориулалттай,

ер

нь

компьютер

нь

ийм

байтуудын

дарааллыг

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

WWW.CDEQ.MN

хооронд хөрвүүлэх ажиллагаа явагдана. Латин ба кирилл үсгүүд, бусад олон туслах
тэмдэгтүүдтэйгээ нийлээд 200 орчим тэмдэгт болох учир нэг тэмдэгтийг нэг байтаар
дүрслэхэд хангалттай. Ингэж кодлох олон янзын стандарт байдгийн хамгийн өргөн тархсан
нь ASCII кодчилол юм. Энд жишээ нь латин А үсгийн код 65, B үсгийн код 66 байдаг. Харин
олон янзын бичгийг зэрэг хэрэглэх, ялангуяа ханз үсэг хэрэглэх тохиолдолд дор хаяж хоѐр
байтын комбинацаар нэг тэмдэгтийг кодлох шаардлага гарна. Ийм кодчиллын тоонд Unicode
стандарт багтана.
Тэмдэгтийг ингэж кодчилохтой төстэйгээр төв процессорын гүйцэтгэх боломжтой коммандууд
мөн тодорхой тоонуудаар кодчилогсон байдаг. Ийм коммандуудыг машины коммандууд
(instructions) гэх бөгөөд төв процессор шуурхай санах ойн нүднүүдийг дэс дараалан уншиж
тэнд бичигдсэн машины коммандуудыг гүйцэтгэх замаар компьютер ажилладаг. Энэ тоон
кодуудын цогц нь тухайн процессорын хувьд програмчлалын хэл болох ба үүнийг машины
хэл гэж ярьна. Машины хэл дээр программ бичихийн тулд ямар коммандыг ямар тоогоор
дүрсэлдгийг (машины кодыг) цээжлэх шаардлагатайн дээр том програмыг уншиж ойлгох
болон засварлахад маш хүндрэлтэй байх нь ойлгомжтой. Жишээлбэл, 80×86 төрлийн
(Pentium гэх мэт) процессоруудын хувьд, EAX регистрт (регистр гэдэг нь процессор дотор
орших тусгай санах ойн нэр) буй тоог EBX регистр дэх тоон дээр нэмээд үр дүнг нь EAX
регистрт хадгалах коммандын машины код нь
3 195
хэмээх хоѐр байтаас тогтоно.
Програмд олон дахин ашиглагддаг хэсэг үйлдлийг санах ойд үндсэн програмаас тусдаа
байрлуулаад хэрэгтэй үед хаягаар нь дуудаж ашиглаж болно. Ингэж үндсэн програмаас
тусдаа байрласан, програмд шаардлагатай ямар нэг бодлогыг бие дааж шийдвэрлэх
чадвартай бүлэг үйлдлийг дэд програм (subroutine) гэж ярьдаг. Дэлгэц дээр үсэг гаргах,
дискний файлаас өгөгдөл унших гэх мэт маш ерөнхий зориулалттай дэд програмуудыг санах
ойд байнга байрлуулж, тухайн үед ажиллаж буй програм нь шаардлагатай дэд програмаа
сонгон авч хэрэглэдэг байвал эдгээр дэд програмуудыг програм болгон өөртөө “тээж” явах
албагүй болно. Ийм дэд програмуудын сан нь програм зохиогчийн ажлыг маш ихээр

WWW.CDEQ.MN

хөнгөвчлөх ба ерөнхийдөө машины хэлийг өргөтгөж түүнд өргөн хэрэглэгддэг олон чухал
коммандуудыг нэмсэн мэт үйлчлэл үзүүлдэг.
Програм бичих ажиллагааг ассемблер хэл (assembly language) ихээр хөнгөвчилдөг.
Ассемблер хэл дээр бичигдсэн програм нь жирийн текст бөгөөд ассемблер програмын мөр
болгон машины нэг коммандад харгалзана. Жишээ нь, дээрх машины коммандыг ассемблер
хэл дээр бичвэл
add eax, ebx
болно (add - англиар “нэм” гэсэн үг). Бэлэн болсон ассемблер програмыг машины хэл рүү
хөрвүүлэхийн

тулд

ассемблерын

хөрвүүлэгч

(assembler)

хэмээх

тусгай

програмыг

ашигладаг. Ассемблерын хөрвүүлэгчийг өөрийг нь бол шууд машины хэл дээр бичиж болно.
Машины коммандуудын цогц тухайн процессорын төрлөөс хамааран янз бүр байдаг тул
машины коммандуудын тоон кодчиллыг процессорын төрөл болгонд адилхан байхаар
стандартчилах боломжгүй. Тэгэхээр ассемблер хэл мөн процессорын төрлөөс хамаарч өөр өөр
байна гэсэн үг. Үүнтэй холбогдуулан машины хэл ба ассемблер хэлийг доод түвшний
програмчлалын хэл гэх нь бий.
Тэмдэглэл. Зарчмын хувьд санах ойд тоог дүрслэх маш олон арга байж болох боловч одоо
үеийн бараг бүх тоон төхөөрөмжид хоѐртын системийг ашигладаг. Бидний сайн мэдэх
аравтын системд дүрслэгдсэн тооны орон бүр 10-ын тодорхой зэрэг уг тоонд хэдэн удаа
агуулагдсаныг заадаг билээ. Жишээ нь, 902.3 гэсэн тоонд 9 ширхэг 100; 0 ширхэг 10; 2
ширхэг 1; ба 3 ширхэг 0.1 агуулагдсан байна. Үүнтэй төстэйгээр, хоѐртын системд
дүрслэгдсэн тооны орон бүр 2-ын зэргүүд уг тоонд хэдэн удаа агуулагдсаныг заана. Жишээ
нь, хоѐртын дүрслэл нь 101 байх тоо аравтын системд 8 + 0 + 1 = 9 гэж бичигдэнэ. Хоѐртын
нэг оронг нэг бит хэмээдэг бөгөөд нэг бит нь 0 юм уу 1 утгын аль нэгийг авч болдог. Мөн нэг
байт нь 8 биттэй тэнцүү болох нь тодорхой. Хоѐртын тооллын систем нь техникийн үүднээс
хялбар, 8 нь хоѐрын бүхэл зэрэг бөгөөд бидний хэрэглэдэг ихэнх тэмдэгтүүдийг 8 битийн
комбинацаар дүрсэлж болдог нь бит ба байтын үүсэлд нөлөөлсөн хэрэг.
Нэгэнт машины хэлийг стандартчилж болохгүй учир ямар ч програм зөвхөн тодорхой
төрлийн компьютерт л зориулагдсан байх ѐстой. Жишээлбэл, Микрософт Виндоус ( Microsoft
Windows) програмыг PowerPC процессортой Макинтош (Macintosh) компьютер дээр суулгаж

WWW.CDEQ.MN

ажиллуулах гэж оролдвол цагийн гарз болох вий. Цаашилбал, ямар ч програм зөвхөн
тодорхой орчинд (platform) ажиллахаар зориулагдсан байдаг. Програмын ажиллах орчин
гэдэгт компьютерийн төрөл, үйлдлийн систем (OS), түүнчлэн уг програмын ажиллагаанд
зайлшгүй шаардлагатай төхөөрөмжүүд ба програмуудын цогцыг ойлгоно. Ажиллах орчны гол
үзүүлэлт бол үйлдлийн систем мөн. Үйлдлийн систем нь програмд хатуу диск, дэлгэц, гар,
хэвлэгч гэх мэт системийн төхөөрөмжүүдийг ашиглах, бусад програмуудтай харилцан
үйлчлэх, хэрэглэгчтэй стандарт маягаар харьцах зэрэг боломжийг олгож, тусгай дэд
програмуудын санг гаргаж өгдөг. Эдгээр дэд програмуудын сан үйлдлийн системээс
хамааран өөрчлөгдөх тул програм нь зөвхөн нэг л үйлдлийн систем дээр ажиллаж чадна.
Жишээлбэл, Виндоус системд зориулагдсан програмыг Линукс (Linux) систем дээр (шууд)
ажиллуулж болохгүй. Линукс системд Виндоус орчинг зохиомлоор бүрдүүлж дотроо Виндоус
програм ажиллуулдаг тийм програмууд байдаг. Энэ тохиолдолд манай програмын ажиллах
орчин бүрэлдчихсэн байгаа нь илт бөгөөд түүнийг Линукс дээр ажиллаж байна гэж үзэх
хэрэггүй юм.
Ассемблер нь машины хэлний “махчилсан” орчуулга учраас түүн дээр, ялангуяа том програм
бичих нь маш төвөгтэй. Програмын текстэнд алдаа байвал түүнийг олоход үлэмж хэцүү
болохоос гадна платформ болгонд тохируулж програмаа дахин дахин бичих шаардлагатай.
Ассемблерын энэ дутагдлыг арилгахын тулд зохиогдсон илүү дээд түвшний програмчлалын
хэлнүүд уншиж ойлгоход хялбар, баргийн санамсаргүй алдааг хэл нь өөрөө зааж өгөх
механизмтай,

платформоос

хамааралгүй

програм

бичих

боломжтой

болсноороо

компьютерийн програм хангамжийг шинэ шатанд гаргасан юм. Дээд түвшний хэл дээр
бичигдсэн програм нь жирийн текст файл бөгөөд дээд түвшний хэлний нэг коммандад
машины хэдэн арван комманд харгалзаж болно. Бэлэн болсон програмын текст файлыг
хөрвүүлэгч буюу компилятор (compiler) хэмээх тусгай програмыг ашиглан машины хэлэнд
хөрвүүлж бие даан ажиллах чадвартай програмын биелэх файл (executable) болгодог.
Хөрвүүлэгдээгүй байгаа програмын текстийг мөн програмын эх код (source code) гэж
нэрлэдэг. Програмын эх кодыг хэд хэдэн платформ дээр хөрвүүлж болдог байхаар бичиж
болно. Ингэснээр бид зөвхөн нэг эх кодноос нэг програмын өөр өөр платформ дээр ажиллах
чадвартай хувилбаруудыг гарган авна гэсэн үг.
Түүх сөхвөл. Хамгийн анхны дээд түвшний програмчлалын хэлийг Жон Маухли 1949 онд
UNIVAC компьютерт зориулан зохиосон Богино Код (Short Code) хэмээх програмдаа

WWW.CDEQ.MN

хэрэгжүүлсэн гэж үздэг. Энэ програм нь өгөгдсөн алгебрын томъѐонуудын дагуу тооцоо хийж
үр дүнг нь гаргадаг програм ажээ. 1950 оноос фон Нейман АНУ-д шинээр дэвшигдэж байгаа
болон дундаа явагдаж буй технологийн төслүүдийг хянах зөвлөгчөөр ажиллаж байв. 1954
оны нэгэн ийм “шүүх ажиллагаанд” дээд түвшний анхны хэлнүүдийн нэг болох Фортран
хэлний төслийг IBM компанийн Жон Бакус авч оржээ. Фон Нейман үүнийг ямар ч шинэ зүйл
гэж үзсэнгүй, “яагаад машины хэлнээс өөр юм чамд хэрэгтэй байгааг ойлгохгүй байна”
хэмээсэн ба уг төслийг “үндсэндээ Жон Маухлийн Богино Код програмын санааг ашигласан
энгийн зүйл байна” гэж үзээд хэрэгсэхгүй орхисон байна. Мөн түүний оюутнууд бүх
програмыг машины хэл рүү гараараа хөрвүүлдэг байсан тухайгаа сүүлд дурдсан байдаг.
Нэгэн оюутан ассемблерын хөрвүүлэгч бичиж энэ ажиллагааг автоматжуулах гэж оролдож
байгааг фон Нейман мэдээд “шинжлэх ухааны үнэтэй цайтай төхөөрөмжийг бичиг цаасны
ажилд хэрэглэж үрэн таран хийх нь” хэмээн маш ихээр хилэгнэж байжээ. Жон Бакус фон
Нейманы энэ байр суурийг хайхралгүй ажилласаар 1957 онд Фортран хэлний анхны
хувилбарыг гаргасан ба сүүлд 1970-аад оноос фон Нейманы архитектурыг ноцтойгоор
шүүмжлэгчдийн нэг болсон юм. Фон Нейманы архитектурын нэг гол дутагдал нь төв
процессор ба шуурхай санах ойн хоорондох “нэг удаа хэдэн байт” дамжуулах боломжтой
“фон Нейманы хүзүү” гэж нэрлэгддэг маш нарийн суваг бөгөөд энэ нарийн “хүзүү” нь зөвхөн
тухайн нэг програмын өгөгдлийн чөлөөтэй урсгалыг хязгаарлаад зогсохгүй, өнөөгийн
програм зохиогчдын оюун ухаанд нягт шингэж тэднийг “нэг удаа хэдэн байт” хэлбэрээр
сэтгэхэд дасгадаг сэтгэхүйн өрөөсгөл хэв маяг юм. Анхны загваруудаас хойш компьютерын
бүтцэд их бага олон төрлийн өөрчлөлт хийгдэж үйл ажиллагаа нь төсөөлшгүй ихээр
сайжирсан боловч үндсэн бүтцэд нь фон Нейманы архитектур амь бөхтэй оршсоор байгаа
болно.
Машины хэл болон ассемблер дээрх дээрх бидний жишээ програмчлалын Си хэл дээр яаж
бичигдэж болохыг сонирхъѐ. Жирийн үед Си хэл процессорын регистрүүд болон санах ойтой
шууд ажилладаггүй бөгөөд програмын өгөгдлүүдийг хувьсагчаар төлөөлүүлдэг. Хувьсагч
гэдгийг санах ойн (дараалсан хэдэн байтаас тогтох) нэг хайрцагт өгсөн нэр гэж үзэж болно.
Жишээ нь, a нэртэй хайрцагт буй тоон дээр b нэртэй хайрцагт буй тоог нэмээд гарсан үр
дүнг нь a нэртэй хайрцагт хадгал гэхийг
a = a + b;

WWW.CDEQ.MN

гэж бичнэ. Энэ бичлэг дунд сургуулийн алгебрын томъѐотой төстэй боловч зарчмын хувьд
ялгаатай гэдгийг анхаараарай. Хэрэв дээрх бичлэг ийм томъѐо байсан бол b=0 гэж гаргах
байсан. Гэвч энд “=” тэмдэгтийн баруун тал дахь (a+b) утгыг зүүн талд буй (a) хайрцагт
хадгалах ажиллагаа явагдах ба a хайрцагт өмнө нь байсан утга арчигдаж хэрэгцээгүй болж
байна. Үүнд a ба b нь санах ойн яг хаана байгаа хайрцгууд болох нь хөрвүүлэгч ба үйлдлийн
системээс хамаарах бөгөөд энэ мэдээллийг Си хэл биднээс “нууж” компьютерийн физик
бүтцээс илүү дээгүүр түвшний нэгэн хийсвэр давхарга оруулж ирж буй хэрэг.
Дээд түвшний програмчлалын хэлнүүд нь компьютерийн техник хангамж, үйлдлийн систем
зэргээс хамаарахгүйгээр аливаа програмыг хялбархан бичих боломжийг бий болгох
зорилготой. Энэ зорилгыг гүйцэлдүүлэхийн тулд програмчлалын хэл болгон өөрийн гэсэн
хийсвэр ойлголтууд, эдгээр ойлголтуудыг ашиглан програмыг алдаагүй бичих дүрмүүдийг
(ө.х. уг хэлний зөв бичих дүрмийг) оруулж ирдэг. Тэгэхээр ямар нэг програмчлалын хэл дээр
програм бичих нь уг програмчлалын хэлийг шууд ойлгож биелүүлэх чадвартай хаа нэгтээ
байгаа хийсвэр компьютерт зориулан програм бичиж байгаатай адил юм. Програм нь энэ
хийсвэр машины шаардлагад зохицсон байх ѐстой бөгөөд програм бичиж буй хүн уг хийсвэр
машины боломжид тохируулан сэтгэх хэрэгтэй болно. Тэгвэл хөрвүүлэгч нь хийсвэр машины
хэл дээрх програмыг бодит машины хэл рүү орчуулах үүрэгтэй болж таарна. Хэрэв хийсвэр
машин нь бодит компьютерээс хэт их ялгаатай бол энэ орчуулах ажиллагаа хүндрэлд орж үр
дүнд нь маш удаан програм гарч ирнэ. Нөгөө талаас хийсвэр машин нь бодит компьютерт хэт
ойр бол програмчлалын хэл маань ассемблертэй улам бүр төстэй болж ирнэ. Энэ хоѐр
заагийн “алтан дундаж” болох платформоос хамааралгүй бөгөөд програм бичихэд хялбар,
мөн хурдан ажилладаг програм боловсруулах боломжтой тийм програмчлалын хэл амжилт
олох магадлал их. Ийм програмчлалын хэлнүүдийн нэг бол Си хэл юм. Үүнтэй холбоотойгоор
Си хэлийг дунд түвшний хэл гэж ярих нь ч бий. Си хэл нь өнөөдөр манай гариг дээр
хамгийн өргөн тархсан програмчлалын хэл бөгөөд Юникс (Unix), Виндоус, Макинтош
(MacOS), ба Линукс үйлдлийн системүүд болон тэдгээр дээрх хэрэглээний програмуудын
ихэнх хэсэг энэ хэл дээр бичигдсэн аж. 1970-аад оны сүүлчээр програмчлалын шинэ
хүчирхэг технологи болох Объект Хандалтат Програмчлал (ОХП, OOP) боловсруулагдаж
бий болсон. ОХП-ын технологи нь том хэмжээний програм бичих, бодит болон хийсвэр
системүүдийг загварчлахад маш тохиромжтой. Энэ технологийг ашиглан Си хэлний унаган
хүч чадлыг зөвөөр зохион байгуулж ашиглах зорилгоор Си++ (”си плас плас” эсвэл “си
нэмэх нэмэх” гэж уншина) хэмээх хэл 1980-аад оны эхээр зохиогдсон. Си++ хэл нь

WWW.CDEQ.MN

үндсэндээ Си хэлний нэгэн өргөтгөл бөгөөд Си хэлний хурд, олон төрлийн компьютер дээр
ажиллах чадварыг нь өвлөн авсан, ОХП-ын технологийг (хийсвэр биш) практик байдлаар
хэрэгжүүлэх боломжоор дээд зэргээр хангагдсан орчин үеийн хамгийн боловсронгуй
програмчлалын хэлнүүдийн нэг юм.

WWW.CDEQ.MN

Sign up to vote on this title
UsefulNot useful