Thursday, March 15, 2007

Ogvvlberees vg tooloh algoritm




#include<conio.h>


#include<stdio.h>


#include<string.h>


void main()


int word=0,sLength,m=1;


char *sentence;


char buffer[256];


sentence=buffer;


puts("Please insert any sentence:");


gets(sentence);


strcat(sentence," ");


sLength=strlen(sentence);


while (m<sLength)


if(sentence[m]==' ')


if(sentence[m-1]!=' ')


word=word+1;


m++;


printf("There are %d words in this sentence.\n",word);


getch();

Tuesday, March 13, 2007

Анхдагч тоо мөн эсэхийг олдог алгоритм. ( C хэл дээр )

Tailbar programminhaa code-dotor tailbar bichihdee
" // tailbar" , "/* tailbar */" ashiglaj bichdeg. Ehniih ni neg mor tailbart , 2 dahi ni olon mor tailbar bichihed ashiglana.

*************************************************************
#include

int main(void)
{
int num, i, is_prime;

printf("Enter a number: ");
//delgetsend "enter number" gesen text heblej bna.

scanf("%d", &num);
// d - gedeg ni garaas integer torliin utgiig avah bogood num
//gesen huvisagchid hadgalna.



is_prime = 1;

for(i = 2; i <= num / 2; i = i + 1)
// dabtalt ni 2-oos num/2 buyu nu/2 iin bvhel heseg hvrtel 1 eer nemegdej dabtana.
//i=i+1 gesen negeer nemegdene gej oilgooroi.

if((num%i)==0)
// "%" temdeg ni toonii vldegdeliig oldog vildliin temdeg.
//Jishee 15%2=1 baina gesen vg.


is_prime =
0;

if(is_prime==1)
// nohtsol shalgah vildel hiij bna. tentsvv esehiig shalgahdaa == gej shalgana

printf(" is prime.");
/*ankhdagch too mon gedgiig heblej bna.
Hereb vnen nohtsoliin door 1-ees olon vildel baih um bol {} haaltand hiij gvitsetgeh heregtei. */

else
printf("not prime.");

return 0;
}



Wednesday, March 7, 2007

7 азийн тоо мөн үү?

Монголчууд 7-ийн тоог дордохын 7 хэмээн дургүй тоондоо оруулдаг. Гэвч 7 гэдэг тоо маань азийн тоо юм байна.

  • There is on a Scottish Mason's apron seven tassels on each side and when the apron was placed around me for the very first time these same seven tassels intrigued me so much that it led me to the field of research of our Great Order.

  • Ихэнх эртний систэмд 7-ийн тоо их давтагдаж орсон байдаг байна.

  • Pythagorean-chuud 7-ийн тоог төгс тоо хэмээн үздэг байна. Учир нь 7=4+3 -ын нийлбэр болдог бөгөөд энэ нь төгс хэлбэртэй тэгш өнтцөгт , гурвалжинг илэрхийлдэг гэж үздэг байна.

  • Долоон эртний гариг байсан. Нар нь хамгийн гайхалтай нь бөгөөд түүний дараа нь сар ордог байна. 7 дох өдөр бур гялалзсан сайхан байдлаа өөрчилдөг байна.


  • In Persian mysteries there were seven spacious caverns through which the aspirants had to pass.

  • The Goths had seven deities, as did the Romans, from whose names are derived our days of the week.

  • In Scriptural history there is a frequent recurrence to this number. E.g. in Revelation 1:16 -- "and He had in His right hand seven stars, " alluding to the seven churches of Asia. (The seven stars are depicted on a RWM's apron in the Scottish Constitution).

  • For us as Masons, King Solomon was seven years building the Temple. It was dedicated to the glory of God in the seventh month and the festival lasted seven days.

  • There are, as you stated, Brother Chris, our seven liberal arts and sciences.

  • We require seven Brethren to make a Lodge perfect and we have our seven steps on the winding staircase.

  • Reverting back to the Masonic apron, in the course of time aprons became embellished with much ornamentation until the present form of apron was instituted. There was no deliberation on the part of our ancient Brethren to place seven tassels on each side of the apron because the number seven has and probably always will be a sacred number in Masonic symbolism.

  • ***********************************************************
    Азын тоо олдог алгоритм ( PL/I хэл дээр бичлээ.)

    LuckyNumber:
    proc options(main);
    dcl i fixed dec(5);
    dcl stVar3 fixed dec(5);
    dcl stVar2 fixed dec(5);
    dcl limit fixed dec(5);

    stVar3=1;
    stVar2=1;
    get list(limit);

    do i=1 to limit;

    if(mod(i,2)=1) then
    if(stVar3!=3) then
    do;
    if(stVar2!=7) then
    do;
    put skip list("Lucky number",i);
    stVar3=stVar3+1;
    stVar2=stVar2+1;
    end;
    else stVar2=1;
    end;
    else do;
    stVar3=1;
    end;
    else;


    i=i+1;
    end;
    end;
    ***********************************************************

    The result is : 1 3 7 9 13 15 21 23 27 29 33 35 41 43 47 49 ... etc.



    Ene hayagnaas ta bvhen http://www.cplusplus.com/ C bolon C++ helnii function library-iin tuhai unshij bolno.

    "666" гэсэн энэ тоо ямар учиртай тоо вэ?

    Рокууд, сатанистууд, ид шидийг шүтэгчид тэр ч бүү хэл поп хамтлаг хүртэл "666" гэсэн тоогоор чамирхана, бас сүрдүүлнэ. Библийн хамгийн сүүлчийн ном болох Илчлэлт номонд дэлхийн сүйрэл, түүнээс өмнө болон тэр үед юу болох тухай билэгдлийн олон дүрс, үг, тоогоор илэрхийлсэн байдаг. Ийм төрөл жанраар бичсэн бичлэгийн хэлбэрийг "Апокалиптик" гэдэг. Эрт цагт Иудейчууд Апокалиптик бичлэгийн жанраар дэлхийн эцсийн тухай тэнгэрийн нууцуудыг бичдэг байв. Энэ жанрын онцлог нь үзсэн үзэгдэл, зүүд, тэнгэр элчийн учрал, билэгдлийн амьтад, тоо, дүрсээр нууцыг илэрхийлдэгт байгаа юм. Ийнхүү бичих нь сүнслэг нууцыг цөвүүн цагт итгэгчдэд дамжуулан хэлж өгөх, тэднийг итгэлээр нь баттай зогсоход нь зоригжуулах үүрэгтэй байжээ.
    Тэгвэл энэхүү билэгдлийн "666" гэгч энэ тоо ямар учиртайг Библийн эх сурвалжаас болон түүхэн тайлбаруудаас харцгаая. Библид:
    Илчлэлт 13:18
    Энд мэргэн ухаан байна. Ухаантай нэгэн нь араатны тоог бодогтун. Учир нь энэ нь хүний тоо бөгөөд түүний тоо бол зургаан зуун жаран зургаа юм.
    Эндээс харвал хэн нэгнийг 666 гэсэн тоогоор илэрхийлжээ. Энэ нь тийм ч шинэ зүйл биш юм. Аливаа хүнийг одоо ч тоогоор илэрхийлдэг. Хүн бүр өөрийн гэсэн тоон дугаартай байдаг шүү дээ. Тухайлбал, регистрийн дугаар, пастортын дугаар гэх мэт. Тэр дугаараар тухайн хүнийг хэн болохыг мэдээллийн баазаас олж тогтооно. Үүний адил Манай Эзэний 1-р зууны сүүлчээр бичигдсэн элч Иоханы "Илчлэлт" хэмээх номд өгүүлсэн "666" хэмээх тооны талаар олон зууны туршид янз бүрээр тайлбарлаж иржээ. Үүнээс хамтдаа суралцъя:
    Тоо болон үсгээр, аль алинаар нь нэг юмыг илэрхийлж болдог. Тухайлбал, өнөөгийн Иудейн рабби (Иудейн шашны багш нар) нарын судрууд араб тоогоор бус Еврей үсгээр бүлэг болон ишлэлээ дугаарласан байдаг. Еврейчүүдийн хувьд үсэг нь тоо, тоо нь үсэг болдог гэсэн үг. Үүнээс үүдэн зарим рабби гематрийн ухааныг ашиглан судрыг тоогоор кодлох дуртай болж. Тэр ч бүү хэл Матай нэгдүгээр бүлэгт буй удам судрын бичигт арван дөрвөн үеийг гурвантаа бичсэнийг Давидын нэр хэмээнэ. Еврей бичиг нь эгшиггүй, дан гийгүүлэгчээр бичдэг тул Давид гэдгийг ДВД гэж бичнэ. Мэдээж уншихдаа "Давид" гэнэ л дээ. Ямар эгшиг хаана нь яаж дуугарахыг тэмдэглэсэн "эгшгийн тэмдэглэгээ" ч бас бий. Тэгээд ДВД гэсэн нэр нь Еврей цагаан толгойн дарааллаар бол 4 + 6 + 4 буюу 14 болдог байна. Үүнчлэн эрт цагт Грекүүд Есүсийн нэрийн үсгийг тоо болгон хувиргаад "888" гэсэн тоог ч гаргасан байдаг. Гэвч араб тоо хэрэглэсэн цагаас хойш нэрийг ийнхүү кодлох хэвшил алга болжээ.
    Тэгэхээр "666" гэсэн тоо ямар учиртай байж болох вэ? Энэ тооны цаана ер бусын нэр нуугдаж байна уу? Зарим хүмүүс үүнийг Ромын Цезарь Неро гэж тооцдог. Учир нь Неро Христэд итгэгчдийг ихэд хавчин гадуурхан алсан бөгөөд дараа нь тэр өөрийн амийг егүүтгэснээс Илчлэлт номын энэхүү тоогоор түүнийг хэлсэн гэж тайлбарлах нэг хэсэг байдаг аж. Мөн зарим нь Ромын өөр нэгэн Цезарь болох Домитианыг "666"-д яг таардаг гэж хэлнэ. Домитиан бол өөрийгөө "бурхан" гэж өргөмжилж, бүх шүтээнүүдийн толгойг цавчин өөрийн толгойг тавьсан бурхан бол жүжиглэсэн хүн байв. Тэр ч гэсэн Христийн эсрэг олон бузар үйл хийсэн нүгэлтэн. Гэвч энэхүү тооны онолоор бол Илчлэлт номыг бичигч Иохан уншигчдаараа тоо бодуулах гэсэн нь юу л бол. Тэгээд ч, Домитианы нэр яагаад ч "666" болж чаддаггүй нь энэхүү тайлбарыг сулруулдаг. Тэр ч бүү хэл үүнээс ч илүү геометрийн бодлого шиг тайлбар хүртэл бий1.
    Гэвч үүнээс арай дээр тайлбар бол "666" бол зургаа гэсэн тоог гурвантаа давтан хэлсэн "6" гэсэн тооны бичлэг гэх тайлбар юм. Билэгдлийн тоонуудын тайлбараас харвал "7" хэмээх тоо нь "төгс" тоо буюу үүнийг Бурханы тоо гэж хэлдэг байна. Харин 6 гэсэн тоог хүний тоо гэж үздэг байна. Өөрөөр хэлбэл, "6" гэдэг нь долоод дөхөх авч дутаж буй төгс бус тоо. Библид "666" гэдгээр анти-Христ хүнийг илэрхийлдэг болохоор дээрх тайлбарт Неро, Домитиан орсон хэрэг л дээ. Харин Анти-Христ бүхий л талаараа төгс "бурхан" болох гэж хичээнэ гэдэг нь яахын аргагүй үнэн. Христийг дууриах, түүнтэй адил гайхамшигуудыг хийх, хүмүүст нөлөөлөх гэж оролдох авч анти-Христийн чадал дутна. Тэрээр яасан ч төгс болж чадахгүй гэдгийг Библи өөрөө гэрчилдэг.
    Харин анти-Христ засаглах үедээ "666" хэмээн энэхүү тоог дэлхийд байгч хүмүүсийн дух болон гарт тэмдэг болгон тавина гэснийг анхаарах хэрэгтэй. Дух болон гарт яг бодит тамга дарна гэхээсээ илүү хүмүүсийн хүсэл, бодол тэдний үйл хөдлөлд мөрөө үлдээнэ гэсэн тайлбар илүү дөхөх болов уу. Библид, анти-Христ аль хэдийнээ идэвхтэй ажиллаж байгаа (1 Иохан 2:18) гэж хэлсэн байдаг. Тэгэхээр, Христэд итгэгч бид амьдарч байгаа цаг үедээ мэдрэмжтэй хандаж, бодол санаагаа улам бүр цэгцлэн явах ёстой бус уу. Бодол сэтгэлээ Бурханы үгээр шинэчлэн сэргээх нь зүй бус уу. Бурханы мэргэн ухаан тантай байх болтугай2.
    Зүүвэр:
    [1]1Kaiser, W. C. 1997, c1996. Hard sayings of the Bible . InterVarsity: Downers Grove, Il
    2Pat Robertson, Answers to 200 of Life's Most Probing Questions, Thomas Nelson, 1984.


    Та дээрх өгүүлэмжийг уншсан биздээ. Тэгэхээр 7 болон 6 аль нь тогс тоо болж байна вэ? 7 төгс тоо болж чадах уу !

    Гэрийн даалгавар No1

    1. Анхны тоо мөн эсэхийг шалгах алгоритм болон С хэл дээр код бичих / анхны тоо өөртөө болон 1т хуваагддаг тоо/
    2. Төгс тоо мөн эсэхийг шалгах алгоритм болон С хэл дээр код бичих / төгс тоо нь өөрөөсөө ялгаатай хуваагчуудынхаа нийлбэртэй тэнтцүү тоо /
    3.Өгөгдсөн өгүүлбэрээс үгийн тоо олох алгоритм болон С хэл дээр код бичих

    Тавигдах шаардлага
    Ямар ямар хувьсагч ашигласан , ашиглах болсон шалтгаан болон алгоритмын тухай тайлбар оруулах

    С хэлний хичээл No 03

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

    Хөрвүүлэгчдийг тус тусад нь авч үзэхээс өмнө энэ хичээлийн турш таныг ямар хөрвүүлэгч ашиглавал зохистой вэ гэдэг талаар санал хэлье. Хэрэв та Линуксын хэрэглэгч бол GNU C++, Виндоусын хэрэглэгч бол Bloodshed Dev-C++ эсвэл Microsoft Visual C++ Toolkit 2003, Digital Mars C++, Borland C++ 5.5 коммандын мөрний хөрвүүлэгчдийн аль нэгийг (бүгд үнэгүй бөгөөд дискэн дээр 30-60М зай эзэлдэг) хэрэглэхийг зөвлөж байна. Нөгөө талаас Cygwin нь Виндоус систем дээр Линукстэй төстэй орчинг бүрдүүлдэг тул Линукс руу аажмаар шилжих гүүр болж чадна. Танд Borland C++ Builder эсвэл Microsoft Visual C++ бүтээгдэхүүн байгаа бол их сайн. Гэвч шинэ програм суулгаж түүнийгээ тогтвортой ашиглах боломжтой хэрэглэгчдийн хувьд Bloodshed Dev-C++ нь Си++ хэлийг эхлэн суралцахад илүү тохиромжтой гэж бодож байна.

    Виндоус системийн хувьсагчдыг тохируулах. Бидний авч үзэх хөрвүүлэгчдийн ихэнх нь Виндоус системийн коммандын мөрөнд (Command Prompt) ажилладаг хөрвүүлэгчид бөгөөд тэдгээрийг хэрэглэж эхлэхийн өмнө системийн зарим хувьсагчдын утгыг өөрчлөх шаардлагатай. Бид энд жишээ болгож системийн PATH хувьсагчид c:\cpp\djgpp\bin утгыг нэмэх, DJGPP нэртэй шинэ хувьсагч үүсгэж c:\cpp\djgpp\djgpp.env утгыг олгох үйлдлийг яаж гүйцэтгэж болохыг тайлбарлая.

    DOS, Windows 3.X ба Windows 95 системүүдийн хувьд:

    - Системийн дискний үндсэн каталог (ихэвчлэн C:) дахь AUTOEXEC.BAT файлыг (EDIT, NotePad гэх мэт) текст редакторын тусламжтай нээж дараах мөрүүдийг нэм.

    set DJGPP=c:\cpp\djgpp\djgpp.env
    set PATH=c:\cpp\djgpp\bin;%PATH%

    Windows 98 системийн хувьд:

    - START цэснээс Programs->Accessories->System Tools->System Information коммандыг сонго;
    - Tools цэсний "System Configuration" коммандыг сонго;
    - AUTOEXEC.BAT файлд дараах мөрүүдийг нэм.

    set DJGPP=c:\cpp\djgpp\djgpp.env
    set PATH=c:\cpp\djgpp\bin;%PATH%


    Windows ME системийн хувьд:

    - START цэснээс Run коммандыг сонгож, msconfig.exe гэж бичээд OK товчийг дар;
    - "Environment" хавтанг сонго;
    - PATH системийн хувьсагчийг “Edit” хийж c:\cpp\djgpp\bin утгыг нэм;
    (нэмэх гэдгийг өмнө нь байсан утгын ард (эсвэл өмнө) цэгтэй таслалаар тусгаарлан өгөгдсөн утгыг бичиж өгөх гэж ойлгоно)
    - DJGPP шинэ хувьсагч үүсгэж c:\cpp\djgpp\djgpp.env утгыг олго.

    Windows NT системийн хувьд:

    - "My Computer" дүрсэн дээр хулганын баруун товчийг дарж, "Properties" коммандыг сонго;
    - "Environment" хавтанг сонго;
    - PATH системийн хувьсагчийг “Edit” хийж c:\cpp\djgpp\bin утгыг нэм;
    (нэмэх гэдгийг өмнө нь байсан утгын ард (эсвэл өмнө) цэгтэй таслалаар тусгаарлан өгөгдсөн утгыг бичиж өгөх гэж ойлгоно;
    хэрэв та системийн администратор биш бол хэрэглэгчийн хувьсагчдийг ашиглаж болно,
    эсвэл PATH нэртэй шинэ хувьсагч үүсгэж утга олговол уг утга өмнөх утган дээр нэмэгдэнэ);
    - DJGPP шинэ хувьсагч үүсгэж c:\cpp\djgpp\djgpp.env утгыг олго.

    Windows 2000 ба Windows XP системүүдийн хувьд:

    - "My Computer" дүрсэн дээр хулганын баруун товчийг дарж, "Properties" коммандыг сонго;
    - "Advanced" хавтанг сонгож, "Environment Variables" товчийг дар;
    - PATH системийн хувьсагчийг “Edit” хийж c:\cpp\djgpp\bin утгыг нэм;
    (нэмэх гэдгийг өмнө нь байсан утгын ард (эсвэл өмнө) цэгтэй таслалаар тусгаарлан өгөгдсөн утгыг бичиж өгөх гэж ойлгоно;
    хэрэв та системийн администратор биш бол хэрэглэгчийн хувьсагчдийг ашиглаж болно,
    эсвэл PATH нэртэй шинэ хувьсагч үүсгэж утга олговол уг утга өмнөх утган дээр нэмэгдэнэ);
    - DJGPP шинэ хувьсагч үүсгэж c:\cpp\djgpp\djgpp.env утгыг олго.

    Програмын эх текстийг бэлтгэх. Зарим хөрвүүлэгчийг эх текст бэлдэх редактор, хөрвүүлэх болон зүгшрүүлэх үйлдлийг цэсний коммандуудаар шууд гүйцэтгэж үр дүнг нь тохиромжтой байдлаар хүлээн авах боломжтой Програм Боловсруулах Интегралчлагдсан Орчин (ПБИО, IDE – Intrgrated Development Environment) дагалдаж ирдэг. Харин коммандын мөрний хөрвүүлэгч хэрэглэж буй үед, эсвэл хөрвүүлэгчийн өөрийнх нь редактор танд таалагдахгүй бол програмын эх текстийг ямар нэг гадны (XEmacs, Nedit, Notepad, WordPad, Word гэх мэт) текст редактор ашиглан бэлтгэх болно. Notepad дээр эх текст бэлдэж буй үед файлыг хадгалахдаа (.txt биш) тусгай өргөтгөлтэй хадгалахаа мартаж болохгүй. Үүний тулд Notepad-ын Save цонхны “File Name” талбарт файлын нэрийг кавычкатай (“test.cpp” гэх мэт) оруулах, эсвэл “Save as type” талбарт “All Files” сонголтыг сонгож файлын нэрийг кавычкагүй оруулах аргыг хэрэглэнэ. WordPad, Word гэх мэт форматтай редакторуудын хувьд эх файлыг хадгалахдаа “Text Only” (“Plain text”, “Text Document”) форматаар хадгалах хэрэгтэй. Мөн интернет дээр програмын эх текст бэлдэхэд зориулсан олон сайн авсаархан програм үнэгүй тараагддагийн нэг нь Ф.Балмерийн зохиосон Виндоус орчны Notepad2 редактор бөгөөд үүнийг дараах хаягаар орж татаж авч болно.

    http://www.flos-freeware.ch

    Коммандын мөрний зарим коммандууд. Коммандын мөрний хөрвүүлэгчийг хэрэглэхийн тулд та юуны түрүүнд коммандын мөрний интерфейсийг ажиллуулж сурах хэрэгтэй. Виндоус орчинд бол START цэсний RUN коммандыг сонгож, command гэж бичээд OK товчийг дарж коммандын мөрний цонхыг нээх ба exit коммандаар түүнийг хаана. Харин Линукс орчинд ихэвчлэн “New Terminal” коммандыг ашиглаж шинэ терминал цонх нээдэг. Бид коммандын мөрөнд програмыг яаж хөрвүүлэх вэ гэдгээс гадна файл, каталогтой ажилладаг зарим коммандыг мэдэж байх нь чухал. Хамгийн түрүүнд cd (change directory) коммандыг дурдаж болно. Коммандын мөрний (эсвэл терминал) цонх болгоныг идэвхтэй каталог гэж нэрлэгдэх нэг каталог “дотор” ажиллаж байна гэж төсөөлж болох ба cd комманд нь энэ идэвхтэй каталогийг солих үүрэгтэй. Жишээ нь, Виндоус орчинд

    cd \cpp\projects

    коммандаар \cpp\projects каталог идэвхтэй каталог болж хувирна. Линукс орчны

    cd /cpp/projects

    комманд дээрхтэй ижил үйлчлэлийг үзүүлнэ. Идэвхтэй каталогийн нэр Виндоус орчны коммандын мөрөнд бэлэн харагдаж байдаг бол Линукс орчинд pwd (print working directory) коммандыг дуудах хэрэгтэй. Идэвхтэй каталог дахь файлуудын жагсаалтыг Виндоус орчинд dir (directory), Линукс орчинд ls (list) коммандуудаар хардаг. Виндоус ба Линукс орчинд харгалзан файл хуулах copy ба cp, файл зөөх move ба mv, шинэ каталог үүсгэх md ба mkdir, файл устгах del ба rm коммандууд байдаг боловч эхлэн суралцагсдын хувьд эдгээр үйлдлүүдийг график интерфейс ашиглан гүйцэтгэх боломж бий гэдгийг санахад илүүдэхгүй. Нөгөө талаас тодорхой төрлийн хэрэглээнүүдэд коммандын мөртэй ажиллах нь график интерфейсээс дутахааргүй хурдан бөгөөд зарим үед илүү тохиромжтой байдаг.

    GNU C++ (ГНУ Си++). Зөвөөр суулгагдсан Линукс систем бүхэнд энэ хөрвүүлэгч агуулагдах ёстой. Тэгэхээр та Линукс системийн хэрэглэгч бол Си++ хэлний хөрвүүлэгчтэй болохын тулд юу ч хийх шаардлагагүй гэсэн үг. Энэ хөрвүүлэгч нь Си++ хэлний стандартыг хамгийн сайн хангасан бөгөөд хамгийн хурдан ажилладаг програм боловсруулдаг хөрвүүлэгчдийн тоонд орно. g++ хэмээх програм Си++ хэлний хөрвүүлэгч ба холбогчийн үүргийг зэрэг гүйцэтгэдэг бөгөөд бид ийм програмыг цаашид илүү өргөтгөсөн утгаар мөн “хөрвүүлэгч” гэж ярьж байх болно. Тухайлбал, hello.cpp нэртэй эх текст файлыг хөрвүүлж hello нэртэй биелэх файл болгохын тулд

    g++ -o hello hello.cpp

    коммандыг ашиглана. Хэрэв гаралтын биелэх файлын нэрийг -o гэж зааж өгөөгүй бол a.out нэртэй биелэх файл гаргадаг. Энэ хөрвүүлэгчтэй хамтаар ГНУ зүгшрүүлэгч gdb болон gprof профайлерийг ихэвчлэн ашигладаг. Бусад нэмэлт програмуудыг дараах холбоосоор орж татаж авч болно.

    http://gcc.gnu.org/

    Cygwin C++. Энэ багц програм нь ГНУ хөрвүүлэгчид, зүгшрүүлэгчид болон хэд хэдэн текст редактор програмуудыг агуулдаг бөгөөд Виндоус систем дээр Линукстэй төстэй орчинг бүрдүүлдэг. Ингэснээр Линукс орчинд зориулсан олон програмыг Виндоус дээр хөрвүүлж ашиглах боломжтой. Дискэн дээр дор хаяж 400М зай эзэлдэг. Cygwin системийг суулгахын тулд эхлээд setup.exe инсталл програмыг дараах холбоосоор орж татаж авна.

    http://www.cygwin.com/

    Энэ инсталл програм нь Cygwin системийг интернетээс шууд татаж суулгах үүрэгтэй. Бүрэн хувилбарыг татахад маш их хугацаа зарцуулж мэдэх бөгөөд эхлэн суралцагчид devel хэсгийн binutils, gcc, gdb, ба make програмууд, Doc хэсгийн man болон newlib-man лавлах системүүд, Editors хэсгээс vim, эсвэл xemacs редакторыг сонгон авч суулгахад хангалттай. Cygwin системийг, жишээ нь, c:\cpp\cygwin каталогт суулгасан бол одоо PATH системийн хувьсагчид c:\cpp\cygwin\bin утгыг нэмж өгөх хэрэгтэй. Линуксийн ГНУ системтэй адилаар Си++ хэлний хөрвүүлэгч нь g++ програм.

    DJGPP C++. ДОС-ын хамгаалагдсан горимд (DOS Protected Mode) ажиллах програм боловсруулахад зориулж ДиЖей Делорийн ГНУ хөрвүүлэгч дээр суурилан зохиосон цогц програм. Дискэн дээр хамгийн багадаа 200М орчим зай эзэлдэг. Үүнийг суулгахын тулд эхлээд дараах холбоосоор орж зохих файлуудыг татаж авах хэрэгтэй.

    http://www.delorie.com/djgpp/zip-picker.html

    Файлуудыг татаж авсны дараа, жишээ нь, c:\cpp\djgpp нэртэй каталог (хавтас) үүсгэж үүн дотроо эдгээр файлуудаа задлана. Ингээд PATH системийн хувьсагчид c:\cpp\djgpp\bin утгыг нэмж, DJGPP нэртэй шинэ системийн хувьсагч үүсгэж c:\cpp\djgpp\djgpp.env утгыг олгоно. Си++ эх файл хөрвүүлэхэд gpp эсвэл gxx програмыг ашиглана.

    MinGW C++. ГНУ Си/Си++ хөрвүүлэгчид дээр суурилсан Виндоусын биелэх файл үүсгэдэг өөр нэг систем. Cygwin системийг бодвол Виндоус орчны програмыг илүү хурдан болгодог. Дараах хаягаар орж татаж авч болно.

    http://www.mingw.org/

    Bloodshed Dev-C++ (IDE). MinGW хөрвүүлэгч, зүгшрүүлэгч болон профайлерыг ашигладаг Виндоус орчны ПБИО. Си++ хэлийг эхлэн суралцагсдад маш тохиромжтой. Дискэн дээр нийтдээ 50М орчим зай эзэлдэг. Дараах хаягаар орж татаж авна уу.

    http://www.bloodshed.net/devcpp.html

    Коммандын мөрний хөрвүүлэгчдээс давуутай тал нь програмын эх текст бэлтгэх, програмыг хөрвүүлэх, ажиллуулах болон зүгшрүүлэх үйлдлүүдийг нэг интегралчлагдсан орчинд гүйцэтгэх боломжтой. Нэг програмын эх код хэд хэдэн текст файлаас бүрдэж болдог гэдгийг дээр дурдсан. Эдгээр текст файлууд болон програмд шаардлагатай бусад (жишээ нь, зураг болон өгөгдлийн) файлуудын нэгдлийг төсөл (эсвэл проект) гэж нэрлэдэг. Dev-C++ дээр .dev өргөтгөлтэй файл бүр нэг төслийг төлөөлөх ба уг файлд тухайн төслийн бүрэлдэхүүн, төслийг хөрвүүлэх үед хэрэглэгдэх тохируулгууд гэх мэт мэдээллийг агуулна. Dev-C++ орчинд шинэ төсөл нээхийн тулд

    - File->New->Project коммандыг сонгоно;
    - Гарч ирэх диалог цонхонд Empty Project ба C++ Project сонголтуудын хийнэ;
    - Name талбарт төслийн нэрийг оруулна;
    - Дараагийн диалог цонхонд төслийн .dev файлыг хадгалах каталогоо сонгоно;

    Одоогоор таны төсөлд нэг ч файл байхгүй байгаа. Төсөлд шинэ файл нэмэхийн тулд

    - File->New->Source File (эсвэл Ctrl+N) коммандыг сонгоно;
    - Асуусан асуултанд Yes гэж хариулна;
    - File->Save (эсвэл Ctrl+S) коммандыг сонгоно;
    - Гарч ирэх диалог цонхонд файлын нэр, өргөтгөл (.cpp) болон хадгалах каталогийг оруулна;

    Ингээд та (хоосон хэдий ч) нэг эх файл бүхий төсөлтэй боллоо. Эх файлыг хөрвүүлэхэд Execute->Compile (Shift+Ctrl+F9), төслийг бүхэлд нь хөрвүүлэхэд Execute->Compile (Ctrl+F9), хөрвүүлсэн програмыг ажиллуулахад Execute->Run (Ctrl+F10), энэ хоёр үйлдлийг дараалуулж гүйцэтгэхэд F9 (Compile & Run) коммандуудыг ашиглана.

    Digital Mars C++. Алдарт Symantec C++ хөрвүүлэгч одоо ийм нэрээр үнэгүй тараагдаж байна. ГНУ Си++ хөрвүүлэгчийн дараагаар Си++ хэлний стандартыг хамгийн сайн хангадаг бөгөөд хамгийн хурдан ажилладаг програм боловсруулдаг хөрвүүлэгчдийн тоонд орно. Гаргаж буй биелэх файлын хэмжээ бусад хөрвүүлэгчдийг бодвол их авсаархан болдог. Хөрвүүлэгч өөрөө дагалдах програмуудынхаа хамт дискэн дээр 40М орчим зай эзэлдэг. Энэ хөрвүүлэгчийг суулгахын тулд эхлээд дараах хаягаар орж хөрвүүлэгчийн үндсэн файлуудыг STLPort багцтай хамт татаж авах хэрэгтэй.

    http://www.digitalmars.com/

    Файлуудыг татаж авсны дараа, жишээ нь, c:\cpp нэртэй каталог (хавтас) дотор эдгээр файлуудаа задлана (энэ нь dm нэртэй каталогийг автоматаар үүсгэнэ). Ингээд PATH системийн хувьсагчид c:\cpp\dm\bin утгыг нэмж, c:\cpp\dm\bin каталогийн sc.ini файлд дараах өөрчлөлтийг хийнэ.

    PATH="c:\prog\dm\bin;"%PATH%
    BIN="c:\prog\dm\bin"
    INCLUDE="c:\prog\dm\stlport\stlport";"c:\prog\dm\include";%INCLUDE%
    LIB="c:\prog\dm\lib";%LIB%

    Си++ хөрвүүлэгчийнх нь нэр dmc.exe бөгөөд, жишээ нь, hello.cpp эх файлыг хөрвүүлэхийн тулд коммандын мөрөнд

    dmc hello

    коммандыг өгөхөд хангалттай.

    OpenWatcom C++. Хуучны Watcom C++ хөрвүүлэгч одоо ийм нэрээр үнэгүй тараагдаж байгаа. Харьцангуй хурдан ажилладаг, хэмжээгээр авсаархан програм гаргадаг боловч Си++ хэлний стандартад нийцтэй байдлаараа нилээд доогуур байранд ордог. Мөн хуучирсан дизайнтай хэдий ч өөрийн ПБИО нь дагалдаж ирдэг. Дискэн дээр бүхэлдээ 130М орчим зай эзэлдэг. Веб хаяг нь

    http://www.openwatcom.org/

    бөгөөд хөрвүүлэгчийг c:\cpp\watcom каталогт суулгасан гэж үзвэл системийн хувьсагчдыг дараах байдлаар өөрчлөх хэрэгтэй.

    WATCOM = c:\cpp\watcom
    PATH = %WATCOM%\binnt;%WATCOM%\binw; (утгыг нэмэх)
    EDPATH = %WATCOM%\eddat
    INCLUDE = %WATCOM%\h;%WATCOM%\h\nt


    Си++ хөрвүүлэгчийнх нь нэр wcc.exe болно.

    Borland C++ 5.5 коммандын мөрний хөрвүүлэгч. Борланд фирмийн Си++ хөрвүүлэгч нь хамгийн өргөн тархсан хөрвүүлэгчдийн нэг бөгөөд Си++ хэлний стандартад нийцтэй байдлаараа ГНУ ба Digital Mars хөрвүүлэгчдийн дараагаар 3-р байрыг эзэлнэ. Хамгийн хурдан ажилладаг програм боловсруулдаг хөрвүүлэгчдийн тоонд ордог. Гаргаж буй биелэх файлын хэмжээ харьцангуйгаар авсаархан болдог. Борланд фирм Си++ хөрвүүлэгчийнхээ коммандын мөрний хувилбарыг үнэгүй тарааж байгаа бөгөөд энэ багц зүгшрүүлэгчтэйгээ хамтаар дискэн дээр 50М орчим зай эзэлдэг. Дараах хаягаар орж FreeCommandLineTools.exe нэртэй инсталл файлыг татаж авч болно. (Борландын зүгшрүүлэгчийн инсталл TurboDebugger.exe мөн тэнд бий.)

    http://www.borland.com/products/downloads/download_cbuilder.html

    Ингээд уг файлыг ажиллуулж хөрвүүлэгчийг, жишээ нь, c:\cpp\bcc каталогт суулгана. Үүний дараагаар PATH системийн хувьсагчид c:\cpp\bcc\bin утгыг нэмнэ. Одоо bcc32.cfg нэртэй тохируулгын файлыг c:\cpp\bcc\bin каталогт үүсгэж дараах мөрүүдийг бичиж хадгалах хэрэгтэй.

    -I”c:\cpp\bcc\include”
    -L”c:\cpp\bcc\lib”

    Үүнтэй төстэйгөөр ilink32.cfg нэртэй нэртэй тохируулгын файлыг мөн каталогт үүсгэж дараах мөрүүдийг бичиж хадгална.

    -L”c:\cpp\bcc\lib”

    Си++ хөрвүүлэгчийнх нь нэр bcc32.exe бөгөөд, жишээ нь, коммандын мөрөнд

    bcc32 hello.cpp

    коммандыг өгснөөр hello.cpp эх файлыг хөрвүүлж hello.exe биелэх файл гаргаж авна.

    Borland C++ Builder (IDE). Том хэмжээний програм хангамжийг маш хурдан хугацаанд боловсруулах боломжтой Си++ програмчлалын хүчирхэг орчин. Виндоус, өгөгдлийн бааз, сүлжээ болон Интернеттэй ажиллах өргөн боломжоор хангагдсан. C++ Builder орчинд шинэ төсөл нээхийн тулд

    - File->Close All коммандаар нээлттэй байгаа бүх файлуудыг хаана;
    - Project->Add New Project коммандыг сонгоно;
    - “Console Wizard” сонголтыг хийж OK товчийг дарна;
    - Гарч ирэх диалог цонхонд “Source Type” талбарыг C++ гэж сонгоно;
    - Баруун гар тал дахь талбарт зөвхөн “Console Application” гэдгийг сонгож OK товчийг дарна;
    - File->Save Project As коммандыг сонгоно;
    - Эх (.cpp) файлын нэр ба хадгалах каталогийг оруулж Save товчийг дарна;
    - Төслийн (.bpr) файлын нэр ба ба хадгалах каталогийг оруулж Save товчийг дарна;

    Ингээд та нэг эх файл (C++ Builder-ын нэр томъёогоор бол Unit) бүхий төсөлтэй боллоо. Үүнд онцын шаардлагагүй боловч зарим код автоматаар үүссэнийг бас харж болно. Эх файлыг хөрвүүлэхэд Project->Compile Unit (Alt+F9), төслийг бүхэлд нь хөрвүүлэхэд Project->Make (Ctrl+F9), хөрвүүлсэн програмыг ажиллуулахад Run->Run (F9) коммандуудыг ашиглана.

    Microsoft Visual C++ Toolkit 2003 коммандын мөрний хөрвүүлэгч. Микрософтын хөрвүүлэгчид бол хамгийн хурдан бөгөөд жижигхэн програм гаргадаг, хамгийн өргөн тархсан хөрвүүлэгчдийн тоонд орно. Сүүлийн үеийн (ялангуяа 6.0 хувилбараас хойших) хувилбарууд нь Си++ хэлний стандартад маш нийцтэй болж байгаа. Микрософт фирм Visual Studio .NET Professional 2003 бүтээгдэхүүний бүрэлдэхүүнд ордог оптималчлагч Си++ хөрвүүлэгчийнхээ (дискэн дээр 30М орчим зай эзэлдэг) коммандын мөрний хувилбарыг үнэгүй тарааж байна.

    http://msdn.microsoft.com/visualc/vctoolkit2003/

    Уг хөрвүүлэгчийг суулгаснаар START цэсэнд “Visual C++ Toolkit 2003 Command Prompt” нэртэй нүд бий болох ба хөрвүүлэгчийг ашиглахын тулд энэ нүдийг товшиж коммандын мөрний зохих цонхыг нээх хэрэгтэй. Си++ хөрвүүлэгчийнх нь нэр cl.exe бөгөөд, жишээ нь, коммандын мөрөнд

    cl /GX hello.cpp

    коммандыг өгснөөр hello.cpp эх файлыг хөрвүүлж hello.exe биелэх файл гаргаж авна. Энэ хөрвүүлэгчийг ашиглаж Windows орчны програм боловсруулахын тулд Microsoft Platform SDK багцыг дараах хуудаснаас үнэгүй татаж авч болно.

    http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

    Microsoft Visual C++ (IDE). Виндоус эсвэл Интернетэд зориулан маш хурдан ажилладаг програм хангамж боловсруулахад хамгийн тохиромжтой. Веб браузеруудаас эхлээд цэргийн болон эмнэлгийн зориулалтын критик тооцоо хийдэг програм хүртэл дэлхийн төвшний ихэнх програм хангамж энэ системийг ашиглан бүтээгдсэн.

    Visual C++ орчинд хэд хэдэн төслүүдийг нэгтгэн ажлын талбар (workspace) эсвэл шийд (solution) гэж нэрлэдэг. Энэ нь олон төсөлтэй ажиллах үед маш тохиромжтой. Жишээлбэл, төслүүдийг зорилгоор нь ангилж өөр өөр ажлын талбарт байрлуулж болно. Visual C++ орчинд шинэ ажлын талбар нээхийн тулд

    - File->New коммандыг сонго;
    - “Workspaces” хавтанг сонго;
    - Ажлын талбарын нэр ба каталогийг оруулж OK товчийг дарна;

    Одоогоор энэ ажлын талбарт нэг ч төсөл байхгүй байгаа. Шинэ төсөл үүсгэхийн тулд

    - File->New коммандыг сонго;
    - “Projects” хавтанг идэвхжүүл;
    - “Win32 Console Application” гэдгийг сонго;
    - “Project name” талбарт төслийн нэрийг, “Location” талбарт каталогийг оруулна;
    - “Add to current workspace” товчийг идэвхжүүл; “Dependency of” сонголт идэвхгүй байх ёстойг анхаар;
    - OK товчийг дарна;
    - Дараагийн цонхонд “An empty project” сонголттойгоор OK товчийг дарна;

    Шинэ эх файл үүсгэхийн тулд

    - Projects->Set Active Project коммандаар хүссэн төслөө идэвхжүүлнэ;
    - File->New коммандыг сонго;
    - “Files” хавтанг идэвхжүүл;
    - “C++ Source File” гэдгийг сонго;
    - “File name” талбарт файлын нэрийг (өргөтгөлгүйгээр) оруулна;
    - “Add to project” товчийг идэвхжүүлж төслийн нэр зөв эсэхийг шалга;
    - OK товчийг дарна;

    Ингээд та (хоосон хэдий ч) нэг эх файл бүхий төсөлтэй боллоо. Эх файлыг хөрвүүлэхэд Build->Compile (Ctrl+F7), төслийг бүхэлд нь хөрвүүлэхэд Build->Build (F7), хөрвүүлсэн програмыг ажиллуулахад Build->Execute (Ctrl+F5) коммандуудыг ашиглана.

    Бусад. MinGW хөрвүүлэгч, зүгшрүүлэгч болон профайлерыг ашигладаг Виндоус орчны Quincy хэмээх ПБИО байдаг. Энэ систем нь хэрэглэгчийн график интерфейстэй ажилладаг FLTK объектуудын сан, Борландын хуучин BGI график програмчлалын интерфейсийг Виндоуст зориулж өргөтгөсөн WinBGIm сан, хоёр хэмжээст график зурахад ашиглаж болох koolplot сангуудыг агуулдаг. Энэ багц дискэн дээр 80М орчим зай эзэлдэг. Веб хаяг нь:

    http://www.codecutter.net/tools/quincy/

    Интел (Intel) фирмийн сайн хөрвүүлэгчид байдгийн Линукст зориулсан хувилбар үнэгүй тараагдаж байна:

    http://www.intel.com/software/products/compilers/clin/noncom.htm

    Дараах хаягаар орж Макинтош системд зориулсан хөрвүүлэгчдийн талаар мэдээлэл авч, зарим хөрвүүлэгчдийг татаж авах боломжтой.

    http://developer.apple.com/tools/mpw-tools/

    Мөн эдгээрээс гадна IBM VisualAge, Metrowerks CodeWarrior гэх мэт олон хөрвүүлэгчид байдаг бөгөөд нилээд олон үнэгүй хөрвүүлэгчдийн жагсаалтыг агуулсан дараах хуудсыг сонирхож болно.

    http://www.thefreecountry.com/compilers/cpp.shtml

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

    http://www.thefreecountry.com/
    http://www.freeprogrammingresources.com/


    Tankhimiin Ts.Gantomor-iin niitlelelees

    С хэлний хичээл No 02

    Cи++ хичээл2.
    Си++ хэлэнд програмын эх код нь жирийн текст байдаг гэдгийг дээр дурдсан. Хөрвүүлэгч нь үндсэндээ ийм текстийг машины хэл рүү хөрвүүлж компьютер дээр шууд ажиллахаар хэлбэрт оруулах үүрэгтэй. Энэ процесс нь үнэндээ нилээд нийлмэл процесс бөгөөд үүнийг бид энд нарийвчлан авч үзэх гэж байна.

    Юуны түрүүнд програмын эх код нь хэд хэдэн текст файлаас бүрдэж болдог. Хөрвүүлэгчээр нэг удаа оруулж болохуйц хэд хэдэн ийм эх файлын нэгдлийг модуль (эсвэл хөрвүүлэлтийн буюу компиляцын нэгж) гэж нэрлэнэ. Нэг програм хэд хэдэн модультай байж болно. Модуль болгонд үндсэн файл гэж нэрлэгдэх цор ганц файл байх ёстой бөгөөд энэ файл дотор түүнтэй хөрвүүлэлтийн үед нэгтгэх бусад файлуудыг зааж өгдөг. Энэ нэгтгэгдэж байгаа файлуудыг толгой файлууд гэж нэрлэдэг. Үндсэн файлаас хэдэн ч толгой файлыг дуудан нэгтгэж болно. Үндсэн файл нь ихэвчлэн “.cpp”, “.cc”, эсвэл “.C” өргөлгөлтэй, толгой файл нь ихэвчлэн “.h”, “.hpp”, эсвэл “.H” өргөтгөлтэй, стандарт сангийн толгой файл бол өргөтгөлгүй байдаг. Жишээ болгож Зураг 1-д нэгэн хөрвүүлэлтийн процессыг дүрсэлжээ. Үүнд test.cpp нэртэй үндсэн файлд test.h ба iostream нэртэй хоёр толгой файлыг нэгтгэхийг шаардсан комманд бичигдсэн байгаа. Ингээд test.cpp файлыг (модулийг) хөрвүүлэх үед хамгийн түрүүнд уг файл препроцессороор боловсруулагдана. Препроцессор нь test.cpp файлын эхэнд test.h ба iostream хоёр файлыг залган нэгтгэж нэг урт текст болгож хувиргахаас гадна энэ текстэд бичигдсэн препроцессорын директивүүд гэж нэрлэгдэх тусгай коммандуудыг гүйцэтгэж програмын эх кодыг өөрчлөх ажиллагаа явуулна. Толгой файлуудыг холбох комманд нь препроцессорын директивийн нэг жишээ болно. Препроцессорын ажиллагааны үр дүнд програм маань Си++ хэл дээрх текст хэвээрээ үлдэнэ гэдгийг анхаараарай. Үүний дараагаар програм нь Си++ хэлний хөрвүүлэгчээр ассемблер хэл рүү хөрвүүлэгдэх ба эцэст нь ассемблерийн хөрвүүлэгчээр орж машины кодыг агуулсан объект модуль (буюу объект файл) гэгдэх тусгай форматад хувирна. (Энд объект гэдэг үг объект хандалтат програмчлалтай ямар ч холбоогүй гэдгийг анхаар.) Объект файлууд нь ихэвчлэн “.obj” эсвэл “.o” өргөтгөлгэй байдаг. Үнэндээ орчин үеийн хөрвүүлэгчид эдгээр бүх алхмуудыг нэгтгэсэн мэтээр ажиллаж шууд объект файлыг гаргадаг бөгөөд завсрын үр дүнгүүдийг, жишээ нь препроцессороос юу гарч байгааг харахын тулд тусдаа препроцессор ашиглах эсвэл хөрвүүлэгчийн тохируулгыг өөрчлөх хэрэгтэй юм.

    Объект файлыг шууд “ажиллуулж” болохгүй бөгөөд биелэх файл гаргаж авахад дахиад нэг алхам хэрэгтэй. Нэгдүгээрт, хэрэв програм маань Си++ хэлний стандарт сангаас ямар нэг функц (Си++ хэлэнд дэд програмыг функц гэнэ) дуудаж ашигладаг бол энэ функцын код нь манай объект модульд байхгүй. Хоёрдугаарт, хэрэв програм олон модультай бол модуль дамнасан функц дуудах процесс эрт орой хэзээ нэгэн цагт явагдах ба нэг объект файл зөвхөн нэг л модульд харгалзах функцүүдыг агуулдаг. Гуравдугаарт, биелэх файлууд үйлдлийн системээсээ хамааран түүнийг ажилладаг програм гэдгийг нь илтгэх тусгай “толгойн хэсэгтэй” байх ёстой бөгөөд объект модуль нь ийм толгойн хэсэггүй. Дөрөвдүгээрт, Си++ хэл дээр бичигдсэн програм ажиллаж эхлэхийн өмнө зарим хувьсагчдыг байрлуулж утга олгох, стек санах ойг бэлдэх, програмд ирсэн параметрүүдийг цуглуулах, програмыг ажиллуулахад системийн нөөц хүрэлцэхгүй тохиолдолд програмаас гарах гэх мэт үүрэг гүйцэтгэдэг эхлүүлэх модуль ажиллах шаардлагатай байдаг. Объект модуль нь эхлүүлэх модультай нэгэн адил биелэх програмыг бүрдүүлэгч нэгж бөгөөд тэдгээр нь аль нэгийгээ агуулдаггүй. Нэг модуль - нэг объект модулийг (объект файлыг) үүсгэхэд зориулагддаг болохыг уншигч ажигласан байх. Тэгэхээр хэрэв програм олон модультай бол модуль болгонд харгалзах объект файлуудыг үүсгэх хэрэгтэй. Үүний дараагаар тухайн програмд харгалзах бүх объект файлуудыг холбогч (linker, компоновщик) хэмээгдэх програмын оролтонд өгөх ёстой. Холбогч програм нь объект модулиуд дахь, гадны функцэд хандсан коммандуудын “ээдрээг” бусад объект модулиуд ба стандарт сангуудаас тохирох функцүүдийг хайж олох замаар “тайлж”, стандарт сангуудаас ашиглагдаж буй функцүүдийг объект модулиудын идэвхтэй хэсгүүд ба эхлүүлэх модультай нэгтгэн нэг биелэх файл болгох үүрэгтэй. Стандарт сан гэдэг нь үнэндээ мөн урьдчилан хөрвүүлэгдсэн объект модулиудын нэгдэл бөгөөд дотроос нь ямар нэг функц дуудагдсан объект модуль бүрийг биелэх файлтай холбодог. Зөвхөн дуудагдсан функцүүд биш, мөн бүхэл сан тэр чигээрээ биш, хэрэгтэй дэд програмыг агуулсан объект модулиуд холбогдож буйг анхаараарай. Програм зохиогч сүүлд ашиглах зорилгоор санч (librarian, библиотекарь) хэмээх програмыг ашиглаж объект файлуудыг нэгтгэн өөрийн гэсэн дэд програмуудын санг байгуулж болно. Ингэхдээ нэг объект файлд аль болох цөөн функцүүд байрлуулбал биелэх файлын хэмжээ бага байна гэсэн үг.

    Объект файлд програмын идэвхтэй кодоос гадна түүнд агуулагдаж буй өөр модулиас дуудагдах боломжтой (функцүүд, хувьсагчид гэх мэт) объектуудын хаяг ба нэрсийг агуулсан глобаль тэмдэгтүүдийн хүснэгт, мөн тухайн модуль дотроос дуудагдсан өөр модульд орших объектуудын нэрс ба дуудсан коммандуудын хаягийг агуулсан гадагш хандалтын хүснэгт хадгалагддаг. Эдгээр хүснэгтүүд дэх мэдээллийг ашиглаж холбогч програм харгалзах объектын хаягийг уг объектыг дуудаж буй газар орлуулан тавьснаар модулиудын хооронд байнгын логик холбоосыг бий болгодог. Ерөнхий тохиолдолд програмаас функцийг дуудахад түүний ажиллагаанд шаардлагатай аргументуудыг дамжуулж, функцийн ажиллагааны үр дүн болсон буцсан утгыг хүлээж авдаг. Холбогч нь зөвхөн функцийн нэрийг ашигладаг тул холбогчийн түвшинд функцийг тохирох төрлийн аргументуудтай дуудаж тохирох төрлийн хувьсагчид утгыг буцааж авч байна уу гэдгийг шалгах арга байхгүй. Паскаль гэх мэт хэлнүүдэд тусгай форматтай (жишээ нь, Дельфи-гийн хувьд “.dcu” өргөтгөлтэй) “объект” файлд эдгээр мэдээллүүдийг хадгалдаг бол Си++ хэл нь универсаль хэл болох үүднээс ийм стандарт бус объект файлын форматыг ашигладаггүй. Дуудагдаж буй функцийн аргументууд ба буцсан утгын төрлийн зөв эсэхийг зөвхөн хөрвүүлэгчийн түвшинд шалгадаг. Үүний тулд функцийн прото-төрөл буюу зарлалт хэмээх ойлголтыг хэрэглэнэ. Зарлалт нь тухайн функцийг ямар төрлийн аргументууд авч ямар төрлийн утга буцаахыг зааж өгсөн (өөр ямар ч мэдээлэл агуулаагүй) бүтэц бөгөөд модуль тус бүрийн хувьд гадагш нь “экспорт” хийж буй функцүүдийн зарлалтыг нэг толгой файлд байрлуулаад уг функцэд ханддаг бүх модульд нэгтгэж хөрвүүлдэг. Мөн сангийн функцийн зарлалтыг толгой файлд байрлуулах ба уг функцэд ханддаг бүх модульд нэгтгэж хөрвүүлдэг. Ингэснээр функц зөв аргументтай дуудагдаж буй эсэхийг хөрвүүлэгч уг толгой файл дахь зарлалттай жишиж тодорхойлох боломжтой болох юм.

    Олон модультай програмыг хөрвүүлэх ерөнхий схемийг Зураг 2-т жишээгээр үзүүлжээ. Энэ жишээнд програм нь харгалзан test.cpp ба aux.cpp үндсэн файлуудыг агуулсан хоёр модулиас тогтоно. test.cpp файлаас дуудагдаж буй aux.cpp файл дахь бүх функцүүдийг aux.h толгой файлд, aux.cpp файлаас дуудагдаж буй test.cpp файл дахь бүх функцүүдийг test.h толгой файлд зарласан байх ёстой. Тэгэхээр жишээ нь, aux.h файл test.cpp файлд залгагдаж хамт хөрвүүлэгдэх тул энэ модулийг хөрвүүлэх агшинд сүүлд холбогдох (aux.obj объект файлд агуулагдах) функцүүдийг яаж зөв дуудахыг хөрвүүлэгч мэдэж байна гэсэн үг. Үүнтэй төстэйгөөр стандарт болон бусад сангуудын функцүүдийг ашиглахын тулд харгалзах (энэ жишээнд iostream) толгой файлуудыг үндсэн файлд залгаж хөрвүүлэх хэрэгтэй. Эцэст нь test.obj ба aux.obj объект файлуудыг сангийн объект модулиуд болон эхлүүлэх модультай холбож test.exe биелэх файлыг гаргаж авна.

    Тэмдэглэл. Холбогч стандарт болон бусад сангуудаас өмнө объект файлуудаас эхэлж функцийг эрэх ажиллагаа явуулдаг. Иймд ямар нэг сангийн функцтэй адил нэр (прото-төрөл) бүхий “шинэ” функцийг модуль экспортлож буй нөхцөлд уг сангийн функц “дарагдаж” оронд нь “шинэ” функц үргэлж дуудагдах болно. Энэ нь зарим тохиолдолд олоход хэцүү алдаанд хүргэж мэдэх бөгөөд Си++ хэлний нэрийн огторгуйг ашигласнаар энэ хүндрэлээс гарч болно. Нэрийн огторгуй нь функцийн нэрийг объект файлд бичихдээ автоматаар өөрчилдөг Си++ хэлний нэр чимэх (name decoration, mangling) хэмээх механизмын нэг илрэл юм.

    Tuesday, March 6, 2007

    С хэлний хичээл No 01

    Cи++ хичээл 0. Удиртгал

    Cи++ хичээл 0.0. Програмчлалын хэл гэж юу вэ

    Орчин үеийн зарим автомат төхөөрөмж урьдчилан бэлдэж өгсөн зааврын дагуу уг төхөөрөмж дээр биелэгдэх боломжтой олон тооны эгэл үйлдлүүдийг дараалан биелүүлэх замаар илүү нарийн төвөгтэй үйлдлийг гүйцэлдүүлдэг. Ерөнхийд нь, ийм заавар бэлдэж өгөх үйл ажиллагааг програмчлал, уг төхөөрөмжид “ойлгогдохоор” заавар бэлдэх аргыг програмчлалын хэл гэнэ. Жишээлбэл, зарим тооны машин дээр дараах мөрийг шууд бичиж өгч бодуулж болно: “5*(2+3)”. Энд бид тооны машинд “2 дээр 3-ыг нэмээд үр дүнг нь 5-аар үржүүл” гэсэн заавар өгсөн хэрэг. Энэ жишээнд програмчлалын хэл маань тоонууд, арифметикийн үйлдлүүд ба хаалтуудыг ашиглаж зөв илэрхийлэл бичих дүрмүүдээс тогтоно гэсэн үг. Бидний бичсэн дээрх “програмыг” ажиллуулахын тулд “=” товчийг дарах шаардлагатай боловч үүнийг манай “програмын” хэсэг биш гэж үзэж болно.

    Хамгийн анхны програмчлалын хэл Чарльз Баббажийн аналитик машинтай хамт үүссэн гэж үзэж болно. Аналитик машины үндэс нь механикийн араанууд байсан ба араануудыг том эсвэл жижиг араануудаар солих замаар програмчлах зарчимтай байжээ. 1942 онд бүтээгдсэн анхны электрон компьютер ENIAC үндсэндээ аналитик машины цахилгаан хувилбар нь байсан бөгөөд түүнийг програмчлах арга нь (програмчлалын хэл нь) одоогийн гэр ахуйн цахилгаан халаагуурын тохируулгыг санагдуулам олон тооны утаснуудын холболтыг өөрчлөх явдал байсан байна.

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


    Фон Нейман ба түүний хамтрагчдын дэвшүүлсэн компьютерийн архитектурын бүдүүвч бүтцийг авч үзье (Зураг 1). Уг бүдүүвч ёсоор компьютер нь төв процессор, шуурхай санах ой ба оролт гаралтын төхөөрөмжүүд гэсэн үндсэн хэсгүүдтэй. Шуурхай санах ойг дараалсан олон нүднүүдээс тогтох маш урт туузаар төсөөлж болно. Ихэнх компьютерийн хувьд санах ойн эдгээр нүд болгон 0-ээс 255-ын хооронд орших ямар ч бүхэл тоог хадгалах чадвартай бөгөөд нүд болгон өөрийн гэсэн дугаартай байдаг. Нэг ийм нүдийг нэг байт мэдээлэл хадгалах чадвартай гэж ярьна. Мэдээллийг хадгалах бусад байгууламжууд, жишээлбэл хатуу диск, оптик диск ба флаш-санах ой бүгд ийм байтуудын дарааллыг хадгалах зориулалттай, ер нь компьютер нь ийм байтуудын дарааллыг боловсруулах зориулалттай гэж үзэж болно. Ийм олон тоог хадгалах, боловсруулах ямар шаардлага байна, үүнээс гадна бид нар компьютерийн дэлгэц дээр дан тоо хардаггүй, гараас зөвхөн тоо оруулдаггүй шүү дээ гэж та эргэлзэж байж болох юм. Тэгэхээр санах ойд хадгалагдаж, компьютерээр боловсруулагдаж буй тоонууд ямар нэг мэдээллийг төлөөлж буйг үргэлж санах хэрэгтэй. Өөрөөр хэлбэл эдгээр тоонуудыг яаж тайлбарлах вэ гэдгийг компьютер ямар нэг хэлбэрээр “мэддэг” байх ёстой. Тухайлбал, текстийг компьютерээр боловсруулахын тулд үсэг, цэг, таслал гэх мэт тэмдэгт болгонд тоо харгалзуулсан дүрэм боловсруулж ашигладаг. Үүнд гараас текст оруулах, текстийг дэлгэц эсвэл цаасан дээр хэвлэх болгонд энэ дүрмээ ашиглан дотоод тоон дүрслэл ба хүний ойлгох дүрслэл хоёрын хооронд хөрвүүлэх ажиллагаа явагдана. Латин ба кирилл үсгүүд, бусад олон туслах тэмдэгтүүдтэйгээ нийлээд 200 орчим тэмдэгт болох учир нэг тэмдэгтийг нэг байтаар дүрслэхэд хангалттай. Ингэж кодлох олон янзын стандарт байдгийн хамгийн өргөн тархсан нь ASCII кодчилол юм. Энд жишээ нь латин А үсгийн код 65, B үсгийн код 66 байдаг. Харин олон янзын бичгийг зэрэг хэрэглэх, ялангуяа ханз үсэг хэрэглэх тохиолдолд дор хаяж хоёр байтын комбинацаар нэг тэмдэгтийг кодлох шаардлага гарна. Ийм кодчиллын тоонд Unicode стандарт багтана.

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

    3 195

    хэмээх хоёр байтаас тогтоно.

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

    Програм бичих ажиллагааг ассемблер хэл ихээр хөнгөвчилдөг. Ассемблер хэл дээр бичигдсэн програм нь жирийн текст бөгөөд ассемблер програмын мөр болгон машины нэг коммандад харгалзана. Жишээ нь, дээрх машины коммандыг ассемблер хэл дээр бичвэл

    add eax, ebx

    болно (add – англиар “нэм” гэсэн үг). Бэлэн болсон ассемблер програмыг машины хэл рүү хөрвүүлэхийн тулд ассемблерын хөрвүүлэгч хэмээх тусгай програмыг ашигладаг. Ассемблерын хөрвүүлэгчийг өөрийг нь бол шууд машины хэл дээр бичиж болно. Машины коммандуудын цогц тухайн процессорын төрлөөс хамааран янз бүр байдаг тул машины коммандуудын тоон кодчиллыг процессорын төрөл болгонд адилхан байхаар стандартчилах боломжгүй. Тэгэхээр ассемблер хэл мөн процессорын төрлөөс хамаарч өөр өөр байна гэсэн үг. Үүнтэй холбогдуулан машины хэл ба ассемблер хэлийг доод түвшний програмчлалын хэл гэх нь бий.

    Тэмдэглэл. Зарчмын хувьд санах ойд тоог дүрслэх маш олон арга байж болох боловч одоо үеийн бараг бүх тоон төхөөрөмжид хоёртын системийг ашигладаг. Бидний сайн мэдэх аравтын системд дүрслэгдсэн тооны орон бүр 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) програмыг Макинтош төрлийн компьютер дээр суулгаж ажиллуулах гэж оролдвол цагийн гарз болох вий. Цаашилбал, ямар ч програм зөвхөн тодорхой орчинд (эсвэл платформд) ажиллахаар зориулагдсан байдаг. Програмын ажиллах орчин гэдэгт компьютерийн төрөл, үйлдлийн систем, түүнчлэн уг програмын ажиллагаанд зайлшгүй шаардлагатай төхөөрөмжүүд ба програмуудын цогцыг ойлгоно. Ажиллах орчны гол үзүүлэлт бол үйлдлийн систем мөн. Үйлдлийн систем нь програмд хатуу диск, дэлгэц, гар, хэвлэгч гэх мэт системийн төхөөрөмжүүдийг ашиглах, бусад програмуудтай харилцан үйлчлэх, хэрэглэгчтэй стандарт маягаар харьцах зэрэг боломжийг олгож, тусгай дэд програмуудын санг гаргаж өгдөг. Эдгээр дэд програмуудын сан үйлдлийн системээс хамааран өөрчлөгдөх тул програм нь зөвхөн нэг л үйлдлийн систем дээр ажиллаж чадна. Жишээлбэл, Виндоус системд зориулагдсан програмыг Линукс (Linux) систем дээр (шууд) ажиллуулж болохгүй. Линукс системд Виндоус орчинг зохиомлоор бүрдүүлж дотроо Windows програм ажиллуулдаг тийм програмууд байдаг. Энэ тохиолдолд манай програмын ажиллах орчин бүрэлдчихсэн байгаа нь илт бөгөөд түүнийг Линукс дээр ажиллаж байна гэж үзэх хэрэггүй юм.

    Ассемблер нь машины хэлний “махчилсан” орчуулга учраас түүн дээр, ялангуяа том програм бичих нь маш төвөгтэй. Програмын текстэнд алдаа байвал түүнийг олоход үлэмж хэцүү болохоос гадна платформ болгонд тохируулж програмаа дахин дахин бичих шаардлагатай. Ассемблерын энэ дутагдлыг арилгахын тулд зохиогдсон илүү дээд түвшний програмчлалын хэлнүүд уншиж ойлгоход хялбар, баргийн санамсаргүй алдааг хэл нь өөрөө зааж өгөх механизмтай, платформоос хамааралгүй програм бичих боломжтой болсноороо компьютерийн програм хангамжийг шинэ шатанд гаргасан юм. Дээд түвшний хэл дээр бичигдсэн програм нь жирийн текст файл бөгөөд дээд түвшний хэлний нэг коммандад машины хэдэн арван комманд харгалзаж болно. Бэлэн болсон програмын текст файлыг хөрвүүлэгч буюу компилятор хэмээх тусгай програмыг ашиглан машины хэлэнд хөрвүүлж бие даан ажиллах чадвартай програмын ажиллах файл (буюу биелэх файл) болгодог. Хөрвүүлэгдээгүй байгаа програмын текстийг мөн програмын эх код гэж нэрлэдэг. Програмын эх кодыг хэд хэдэн платформ дээр хөрвүүлж болдог байхаар бичиж болно. Ингэснээр бид зөвхөн нэг эх кодноос нэг програмын өөр өөр платформ дээр ажиллах чадвартай хувилбаруудыг гарган авна гэсэн үг.

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

    Машины хэл болон ассемблер дээрх дээрх бидний жишээ програмчлалын Си хэл дээр яаж бичигдэж болохыг сонирхъё. Жирийн үед Си хэл процессорын регистрүүд болон санах ойтой шууд ажиладаггүй бөгөөд програмын өгөгдлүүдийг хувьсагчаар төлөөлүүлдэг. Хувьсагч гэдгийг санах ойн (дараалсан хэдэн байтаас тогтох) нэг хайрцагт өгсөн нэр гэж үзэж болно. Жишээ нь, a нэртэй хайрцагт буй тоон дээр b нэртэй хайрцагт буй тоог нэмээд гарсан үр дүнг нь a нэртэй хайрцагт хадгал гэхийг

    a = a + b;

    гэж бичнэ. Энэ бичлэг дунд сургуулийн алгебрын томъёотой төстэй боловч зарчмын хувьд ялгаатай гэдгийг анхаараарай. Хэрэв дээрх бичлэг ийм томъёо байсан бол b=0 гэж гаргах байсан. Гэвч энд “=” тэмдэгтийн баруун тал дахь (a+b) утгыг зүүн талд буй (a) хайрцагт хадгалах ажиллагаа явагдах ба a хайрцагт өмнө нь байсан утга арчигдаж хэрэгцээгүй болж байна. Үүнд a ба b нь санах ойн яг хаана байгаа хайрцгууд болох нь хөрвүүлэгч ба үйлдлийн системээс хамаарах бөгөөд энэ мэдээллийг Си хэл биднээс “нууж” компьютерийн физик бүтцээс илүү дээгүүр түвшний нэгэн хийсвэр давхарга оруулж ирж буй хэрэг.

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

    Cи++ хичээл 0.1.

    Cи++ хэлний товч түүх

    Програмчлалын хэлнүүд бие биетэйгээ маш нягт уялдаатай хөгжиж ирсэн учир нэг хэлний хөгжлийг бусдаас нь салангид авч үзэх боломжгүй юм. Хамгийн анхны дээд түвшний хэл болох Фортран нь бусад бүх дээд түвшний хэлнүүдийн хөгжилд их бага ямар нэг хэмжээгээр нөлөөлсөн байдаг. Фортран (FORTRAN – FORmula TRANslating system – томъёог орчуулагч систем) нь 1957 онд IBM компани дээр шинжлэх ухааны тооцоо хийхэд зориулан зохиогдсон. Санах ойн хэдэн байтыг хамтад нь хувьсагчийн нэрээр төлөөлүүлэн харьцдаг ба програмын бүх хувьсагчид юу хадгалж байгаагаа илтгэх төрөлд хуваагддаг. Тухайлбал, програмд INTEGER K REAL P гэж “зарлагдсан” бол K нь бүхэл, P нь бутархай утга авах хувьсагчид болох ба K+1 ба P+1 гэсэн үйлдлүүд хоорондоо үндсээрээ ялгаатай машины коммандуудад хөрвүүлэгдэнэ. Фон Нейманы компьютер ямар ч өгөгдлийг ямар нэг бүхэл тоогоор (ө.х. битүүдын дарааллаар) дүрслэхийг шаардах ба бүхэл болон бутархай тоог санах ойд хадгалах дүрслэлүүд нь хоорондоо ялгаатай учраас тэр. Хэрэв Фортранд төрөл байхгүй байсан бол програм зохиогч маань хувьсагчид дээр үйлдэл хийх агшинд уг хувьсагчид хадгалагдаж буй “бүхэл тоог” бүхэл гэж үзэх үү эсвэл бутархай гэж үзэх үү гэдгийг шийдэж зохих коммандыг бичих хэрэгтэй болно. Мөн жишээ нь, санах ойд бүхэл тоо 4 байт, бутархай тоо 8 байт зай эзэлдэг байж болно. Энэ үед хэрэв програм зохиогч хайхрамжгүйгээр “бүхэл байх ёстой” хувьсагч дээр бутархай тооны үйлдэл гүйцэтгэсэн бол уг бүхэл тоогоор зогсохгүй түүний дараачийн 4 байт мөн хайхрамжгүй үйлдлийн золиос болно. Гэвч аз болоход Фортран төрөлтэй учраас ийм буруу үйлдэл хийх болгонд компилятор алдааг олж илтгэдэг. Хувьсагчийн төрөл хэмээх ойлголтыг оруулж ирснээр програм зохиогчийн эрх чөлөөг хязгаарлаж байгаа биш, харин түүнийг алдаагүй програм бичих, алдаагаа хялбар олох боломжийг олгож байгаа хэрэг юм.

    Фортран нь хэдийгээр тоонуудтай ажиллахдаа маш сайн байсан боловч оролт гаралттай ажиллахдаа тийм ч сайн биш, том програмыг уншиж ойлгоход хүндрэлтэй, програмын текстийг бичих хэт явцуу дүрэмтэй зэрэг дутагдлуудтай байсан. Ерөнхийдөө Фортран хэл нь зүгээр л ассемблер дээрх програмуудад маш олон тохиолддог нь ажиглагдсан хэсэг бүлэг коммандуудыг бүлэглэн авч шинэ нэрнүүд өгөх замаар програмыг товчилж бичсэнтэй ялгаагүй зүйл байсан юм. Түүнд өөрийн гэсэн маяг найруулга, дэгжин чамин шинж байхгүй гэж хэлж болно. Фортраны дараахан 1958 онд зохиогдсон Алгол хэл (ALGOL – ALGOrithmic Language – алгоритмчлалын хэл) нь энэ дутагдлуудыг арилгасан бөгөөд өөрийгөө дууддаг дэд програм гэх мэт хэд хэдэн шинэ боломжийг бүрдүүлж өгсөн. Алгол нь алгоритмуудыг маш ойлгомжтойгоор илэрхийлж чаддаг, математикийн үүднээс бол их “дэгжин чамин” хэл юм. Гэвч Алгол-68 хэмээх дараачийн хувилбар нь хэт нүсэр болсон тул Паскаль гэх мэт жижиг хэлнүүдэд зайгаа тавж өгөх хэрэгтэй болсон аж. 1968 онд Никлаус Вирт анх оюутнуудад програмчлал заахад зориулан Паскаль хэлийг зохиосон нь сүүлдээ хамгийн өргөн тархсан хэлнүүдийн нэг болсон юм. Паскаль хэл нь тухайн үед өргөн хэрэглэгддэг байсан Фортран, Алгол болон Кобол хэлнүүдийн сайн чанаруудыг шүүн авч, муу чанаруудыг цэвэрлэсэн нь олонд түгэхэд нөлөөлсөн хэрэг. Паскаль хэл нь “заагч” гэгдэх төрлийг анх түрүүнд хэрэгжүүлсэн нь бөгөөд Си хэлний бүтцэд маш ихээр нөлөөлсөн хэл юм.

    Си хэлний өвөг эцэг гэж болохоор хэл бол БСиПЛ (BCPL – Basic Combined Programming Language – програмчлалын нэгтгэсэн хэл) мөн. 1960-аад оны дундуур Массачуссетийн Технологийн Институтэд (МТИ) Кэмбрижээс айлчилж байсан Мартин Ричардс БСиПЛ хэлийг зохиожээ. БСиПЛ хэлний хөрвүүлэгчийн жижиг цөм ассемблер дээр бичигдсэн ба энэ цөмийг л шинэ машинд тохируулан өөрчилчихвөл БСиПЛ хэлний (БСиПЛ хэл дээр бичигдсэн) үлдсэн хэсгийг энэ цөмөө ашиглан шууд хөрвүүлэх боломжтой байсан нь түүнийг олон шинэ машинууд дээр тархахад нөлөөлсөн байна. Энэ хэлийг МТИ, Женерал Электрик, ба Белл лабораторийн (Bell labs, одоогийн AT&T Labs) хамтарсан Мултикс (Multics – олон “икс”) хэмээх үйлдлийн систем зохиох төсөлд хэрэглэж эхэлсэн бөгөөд 1969 он гэхэд уг төсөл нь хэрэгжүүлэхэд хэцүү хэтэрхий их зүйл амласан, зөвхөн хугацаа ихээр оройтож өндөр үнээр дуусах төсөл болох нь тодорхой болсон. Ингээд Белл лабораторийн Кен Томпсоноор удирдуулсан бүлэг судлаачид Мултиксаас хялбар бөгөөд хямд хувилбар хайж эхэлжээ. Энэ оролдлого эцэстээ Юникс (Unix – нэг “икс”) үйлдлийн системийг бий болгосон ба уг үйлдлийн системд зориулж БСиПЛ хэлийг Томпсон өөрчилж түүнийгээ Би (B – BCPL нэрний товч хэлбэр, эсвэл Томпсоны зохиосон өөр нэг хэл болох Bon гэдгийн товчлол) хэл хэмээн нэрийдэв. Би хэл нь төрөлгүй хэл, өөрөөр хэлбэл бүх өгөгдлийг бүхэл тоо гэж үздэг хэл байсан бөгөөд бутархай тоотой ажилладаг шинэ ПДП-11 компьютер Белл лабораторид ирнэ гэсэн сургаар Деннис Риччи 1971 оноос Би хэлийг сайжруулж эхэлжээ. Үүний үр дүнд бүхэл ба тэмдэгт, тэдгээрийн “цуврал” ба “заагч” төрөл бүхий ЭнБи (NB – New B – Шинэ Би) хэл бий болсон аж. Үүнээс илүү олон төрөл хэрэгжүүлэх шаардлага Риччийг Си (C – цагаан толгойн, эсвэл BCPL нэрэн дэх дарааллаар B-ийн дараачийн үсэг) хэлийг боловсруулахад хүргэсэн. 1973 он гэхэд Си хэлний үндсэн бүтэц тодорхой болсон ба 1973 оны зун Белл лабораторийн хэсэг судлаачид Юникс системийн цөмийг бүхэлд нь Си хэл дээр бичиж дуусгасан байна. Ингэснээр Си хэлний компилятор бүхий компьютерүүдэд Юникс системийг ашиглах боломжтой болсон бөгөөд энэ нь өөрийн ээлжинд Си хэлийг тархахад ихээхэн нөлөөлсөн байна. Энэ хэл нь системийн програм бичихэд зориулан зохиогдсон тул компьютерийн техник хангамжтай “шууд тулж ажилладаг”, Алголын бүлийн бусад хэлнүүдийг бодвол маш энгийн бүтэцтэй, баргийн алдааг хөрвүүлэгч “тоодоггүй”, өөрөөр хэлбэл “програм бичигчийн үргэлж зөв” хэмээх зарчмаар ямар ч байсан хөрвүүлэлтийг дуусгах гэж оролддог зэрэг онцлогуудтай. Эдгээр онцлогууд нь програм зохиогчид өргөн боломж, өндөр хариуцлагыг зэрэг олгодог юм. 1978 онд Риччи, Брайн Кернигантай хамтаар “Програмчлалын Си хэл” номыг бичсэн нь Си хэл гэж юу юм бэ гэдэгт хариулсан анхны баримт бичиг байжээ. Си хэлний асар хурдан тархалт ба хөгжилтийн улмаас 1982 он гэхэд уг хэлийг стандартчилах хэрэгтэй нь тодорхой болсон ба 1983 оноос Америкийн Үндэсний Стандартын Хорооноос (ANSI) X3J11 нэртэй хэсэг байгуулагдан ажиллаж 1989 онд Си хэлний Америкийн стандартыг баталсан. Дараахан нь энэ стандартыг Олон Улсын Стандартын Байгууллага ISO/IEC 9899-1990 нэрийн дор хүлээн зөвшөөрсөн байна.

    Алгол хэлийг Америкт гарч ирсний дараахан 1967 онд Норвегийн зэвсэгт хүчний компьютерийн төвийн ажилтан Кристен Нигаард ба Оле-Иоган Даал нар Симула хэлний Симула-67 (Simula67) хувилбарыг зохиов. Симула нь Алгол дээр үндэслэгдсэн, системийн симуляци, загварчлал хийхэд зориулагдсан хэл юм. Системийн загварчлал гэдэгт, жишээлбэл, онгоцны буудлын талбай дээрх нисэх онгоцнуудын хөдөлгөөнийг загварчлах байж болно. Симула хэлэнд ямар ч системийг хоорондоо харилцан үйлчлэгч тусгаар хэсгүүдийн цогц хэмээн үзнэ. Эдгээр тусгаар хэсэг бүр нь програмын “объект” болох бөгөөд програм зохиогчийн үндсэн үүрэг нь системд ямар ямар объектууд байх ёстойг шийдэж тэдгээрийн бусадтайгаа харилцан үйлчлэлцэх шинж чанаруудыг тодорхойлж өгөх явдал юм. Нэгэнт объектууд тодорхойлогдсон бол Симулагийн “хугацаа урсаж” эхлэх ба системийн объектууд яаж хоорондоо харилцан үйлчлэлцэж, яаж өөрчлөгдөж байгааг “гаднаас нь” ажиглах боломжтой. Дээрх онгоцны буудлын жишээнд системийн объектууд нь талбай дахь нисэх онгоцнууд, удирдлагын цамхаг, нар, салхи зэрэг байж болно. Тэгвэл програм зохиогч жишээ нь, удирдлагын цамхагийн “4-р зам дээр оч” гэсэн коммандад нисэх онгоц ямар хариу үйлдэл үзүүлэх, салхины чиглэл ба хурд удирдлагын цамхгийн шийдвэрт яаж нөлөөлөх вэ гэдгийг тодорхойлох хэрэгтэй гэсэн үг.

    1978 онд Кембриж дэх компьютерийн лабораторид Бьярн Страуструп компьютерийн сүлжээг загварчлах судалгааны ажлыг эхлэв. Страуструпын хэлснээр “хамгийн анхны жинхэнэ объект хандалтат хэл” болох Симула нь түүний зорилгод яг нийцэхээр байсан боловч ганц дутагдал нь хэтэрхий удаан байсан тул тэрбээр шинэ объект хандалтат хэл зохиохоор шийджээ. Си хэл нь түүний хэлснээр “олон чадвартай, товч тодорхой, харьцангуй доод түвшний”, “системийн програмчлалд маш тохиромжтой”, “хаана ч юун дээр ч ажилладаг”, бөгөөд “Юникс програмчлалын орчинд зохицсон” тул Страуструп шинэ хэлнийхээ суурь болгож Си хэлийг сонгосон гэдэг. Ингээд Си ба Симула хэлнүүдийн нэгдэл болох “Ангит Си” нэртэй Си хэлний нэгэн хувилбарыг 1980 онд Страуструп Белл лабораторид ажиллаж байх үедээ гаргажээ. “Ангит Си” явсаар 1983 онд (Рик Масситтийн бодож олсон нэр) Си++ нэртэй болсон ба энэ нэр Си ба Си++ хэлнүүдэд хоёуланд нь “Си-гийн дараачийн” гэсэн утга илэрхийлдэг ажээ. Си++ хэлийг үндсэн гурван зорилгыг хэрэгжүүлдэг гэж үзэж болно. Үүнд, сайжруулсан Си, өгөгдлийн хийсвэр төрөл, ба объект хандалтат програмчлал юм. Си хэл дээр бичигдсэн програмыг Си++ хэлний хөрвүүлэгчээр хөрвүүлж болно. Гэвч Си++ хэл нь Си-г бодвол илүү “хатуу” хэлзүйн дүрмүүдтэй учир Си хөрвүүлэгчээр ямар ч асуудалгүй хөрвөж байсан програм Си++ хөрвүүлэгчээр хөрвөхдөө олон анхааруулга, зарим тохиолдолд алдаа гаргаж болзошгүй. Ингэснээр програм ажиллах үед гарч болзошгүй олон алдаанаас сэргийлэх боломжтой. Өгөгдлийн хийсвэр төрлийг хэрэгжүүлснээр програмд хэрэглэгдэж буй нарийн нийлмэл өгөгдлүүдтэй харьцах нь Си хэлний үндсэн төрлийн өгөгдлүүдтэй харьцахтай өнгөн дээрээ яг адил байхаар програмчлах боломжийг олгодог. Энэ нь анги хэмээх хэрэглэгч шинээр өөрийн төрлийг тодорхойлох, үүнчлэн “+”, “-“, “*”, “/” гэх мэт үйлдлүүдийг энэ шинэ төрөлдөө тохируулан өргөтгөн тодорхойлох механизмуудын тусламжтай хэрэгждэг. Хоорондоо төстэй олон төрлүүдийн гадаад байдал адил тул эдгээр төрлүүд дээр ажиллах боломжтой кодуудыг ганц ерөнхий эх загварыг үндэслэн хөрвүүлэгч нь өөрөө автоматаар генерацлаж (гаргаж авч) болдог. Си++ хэлэнд ийм үйл ажиллагааг хэвүүд (templates) буюу параметрчлэгдсэн төрлүүдийг ашиглан биелүүлнэ. Ингэснээр өргөтгөсөн програмчлал (generic programming) хэмээгдэх объект хандалтат програмчлалын дараагийн шатыг хэрэгжүүлэх боломжтой болсон. Объект хандалтат програмчлалыг Си++ хэлэнд үндсэндээ өгөгдлийн хийсвэр төрлүүд ба тэдгээрийн хоорондох удамшлын харьцааг хэрэглэн гүйцэтгэдэг. Үүнд найзын харьцаа, ангиудын удамшил, виртуаль функцүүд, нэрийн огторгуй, онцгой тохиолдол, хувьсагчийн төрлийг динамикаар тодорхойлох зэрэг олон ойлголтууд хамрагдана.

    Женерал Электрик компанийн Нью Йорк дахь судалгааны төвд ажиллаж байсан Александр Степанов ихэнх алгоритмууд өгөгдлийн бүтцийн дотоод зохион байгуулалтаас хамаардаггүй, зөвхөн түүний гадаад орчинтой харьцаж буй гадаргуугийн цөөн хэдэн шинж чанаруудаас хамаардаг болохыг 70-аад оны сүүлчээр ажигласан байна. Тэгэхээр програмд хэрэглэгдэж буй өгөгдлийн бүтцийг өөрчлөх болгонд уг өгөгдөлтэй ажиллах алгоритмуудыг дахин дахин бичих шаардлагагүй. Маш олон туршилт хийсний үр дүнд Степанов ажиллах хурданд нь муугаар нөлөөлөхгүйгээр алгоритмуудыг ингэж хийсвэрлэх боломжтой болохыг олж тогтоов. Ийм алгоритмуудыг өргөтгөсөн алгоритмууд (generic algorithms), эдгээрийг ашиглан програм бичих арга зүйг өргөтгөсөн програмчлал гэх болсон. 1987 он гэхэд Степанов бээр Тектон, Лисп, Ада, болон Си++ хэл дээр өргөтгөсөн алгоритмуудын санг бичиж дуусгасан боловч төдийлэн амжилт олсонгүй. Тухайлбал Си++ хэлний ангиудын удамшил өргөтгөсөн алгоритмуудыг хэрэгжүүлэхэд хэтэрхий явцуу болох нь мэдэгдсэн. Энэ байдал Страуструпыг ангийн болон функцийн хэвүүдийг Си++ хэлэнд оруулахад нөлөөлсөн бөгөөд 1992 оноос Степанов найман хүнтэй бүлгийг толгойлон Хьюлетт Паккард (Hewlett Packard) компанийн лабораторид Си++ хэлний хэвүүдийг ашиглан өргөтгөсөн алгоритмуудын сан бичих төслийг эхэлжээ. Төслийн орон тоо цөөрсөөр сүүлдээ Степанов ба Менг Ли хоёул үлдэж цөхрөлтгүй ажилласаар 1995 он гэхэд Стандарт Хэвүүдийн Санг (СХС, STL – Standard Template Library эсвэл STepanov and Lee) бичиж дуусгасан нь (үл ялиг өөрчлөлттэйгөөр) Си++ хэлний Стандарт Сангийн бүрэлдэхүүнд орсон юм. Си++ хэлний Стандарт Санд энэхүү сангаас гадна Си хэлний стандарт сан болон оролт гаралтын стандарт сан багтдаг.

    1989 онд Америкийн Үндэсний Стандартын Хороо NCITS/X3J16 нэртэй хэсгийг Си++ хэлний Америкийн стандартыг гаргах зорилгоор байгуулав. Хоёр жилийн дараа 1991 онд Олон Улсын Стандартын Байгууллагаас JTC1/SC22/WG14 нэртэй хэсэг Си++ хэлний олон улсын стандартыг үүсгэх зорилгоор томилогдсон. Үүнээс хойш хоёр хэсэг нэгдэн ажиллаж, 1998 онд Си++ хэлний олон улсын стандартыг ISO/IEC 14882-1998 нэрийн дор эцэслэн баталжээ. Энэ стандартыг АНУ, Их Британи, Герман болон бусад олон улс гүрнүүд өөрсдийн үндэсний стандарт мэтээр өвлөн авч баталсан байна.

    Хөрвүүлэгч

    Нагоя хотын Технологийн Их Сургуулийг иргэний барилгын инженер мэргэжлээр суралцаж төгсөөд одоо тус хотод нэгэн IT-гийн компанид программистаар ажиллаж бгаа Болд хэмээх залуу латин-крилл, крилл-латин гайхалтай хөрвүүлэгч бүтээжээ. Дархан хүн бурхан ухаантай гэж, блоггерүүдэд яг ийм хөрвүүлэгч хэрэгтэй дээ. Латин гарны байрлалаар шивэхэд шууд крилл үсэг рүү хувирна. Түүний блог өөр ямар ч бичлэг байхгүй, зөвхөн танд зориулж бүтээсэн хөрвүүлэгч байдаг.
    энд дарна уу!
    Нийтлэлийг http://khishgee.blogspot.com блогоос иш татав.

    C болон C++ хэлний онлайн тэстлэгч програм хангамж

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

    Thursday, March 1, 2007

    Алгоритмын хичээл No 01

    Enehvv hicheeliin aguulgiig tobchhon baidlaar oruulya. Tailbariig hicheeliin tanhimd delgervvlen orno.
    Ashiglah nom End darna uu!
    Алгоритм нь мөр мөрөөр дарааллан биелэх коммандуудын дараалал юм. Өөрөөр хэлбэл тооцоололтийг илуу хурдан болгохын тулд бид тооцоолон бодох машинд ойлгомжтой байхаар компьюмтерийн хэл дээр бичих явдал юм.

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

    ******************** Sonirholtoi bulan*******************
    1954-2003 onii Programming language-iin hogjiliin ve shatuudiig vzeh bol end darna uu!
    2006 on hvrtelhiig vzeh bol end darna uu
    2007 on hvrtelhiig vzeh bol
    end darna uu!

    Програм бичиж сурах эхний алхам

    Ta bvhen program bichij surahiin tuld yunaas ehleh talaar zoblogoo ogii. Er ni program bichij surahaar shuluudsan hvmvvs ymar chigleleer tsaashdaa hogjvvlelt hiihee sain bodoj tolovloorei. Chiglelee songoson bhad hurdan suraltsah bolomjtoi bdag.
    Program hogjvvleh chiglel hargalzahgvigeer anhan shatnii medleg hangalttai bish hvmvvs doorh chigleleer sudalbal ih zvgeer baidag. Ymar ch programming helend vndes suuri ni Algoritm , C -iin medleg (esvel Pascal ch umuu ) vrgelj shaarddag.
    1. Algoritmiin vndes buyu medeellel zvin hicheeliin suuri medlegtei baih heregtei.
    2. Sudlah hel C bolon Pascal , Java-iin Basic tvbshind , C++ geh helvvdiin vndsen zarchmiig suraltssan baih shaardlagatai.
    Deerhiig sudlasan baihad tanii program bichih suuri medlegiin ehnii alham bolno. Daraagiin alham ni Programchlaliin chiglelee songoson baival zvgeer. Suraltsah hugatsaa , hvnd hongonoor ni enehvv helvvdiig erembeleh bolomjgvi uchiraas erembegvigeer daraalluulan bichiheer bolloo.

    -Web programming
    • Html
    • Javascript
    • CSS
    • Php
    • Perl
    • Asp.net
    -Application programming
    • C++
    • Java
    • Dot.net (VB.NET, C#)
    -Network programming
    • Network -iin tuhai vndsen medlegtei baih.
    • ....
    -Entertainment programming
    • Game Programming tuhai sudlah heregtei
    • Programchlah orchingiin huvid bvh hel tohirnoo.
    Programmchlaliig hamgiin orgon heregledeg shinjeer ni dotor ni doorh 2 ynzaar angildag.
    • Functional Programming (Ene torliin programchlaliin helvvd ni ihebchlen belen interface zargbar koduudtai baidag bogood ashiglahad hylbarhan , OO-iin talaar medleg shaardahgvi. Dutagdal ni programchlaliin garalt uyan bus program vvsne.)
    • Object Oriented Programming (Functianal programming -iig bodvol arai hvnd gej bolno. Uchir ni ene torliin programchlal hiih hvn zaabal Object Oreinted -iin tuhai oilgolttoi baih shaardlagatai baidag. Hamgiin gol ni programchlaltiin ur chadbar shaardana.)
    -Functional programming languages
    • Logo programming language
    • C programming language
    • Php
    • VB.NET
    • Delphi
    • Asp.net
    -OOP (Object oreinted programming) ni 1990 on hvrtel todiilon orgon ashiglagdahgvi baisan bogood odoogoor hamgiin ih ashiglagddag ni Object oreinted programming languages
    • C programming language
    • C++ programming language
    • Java
    • JavaScript
    • C#
    • Visual Fox Pro
    • VB.NET
    • C++
    • Python
    • Perl
    • Php
    • Ruby
    • Objective C

    ************************** Sonirholtoi bulan ********************
    Progammiin hel Diin rating osch "A" tolovt hvrlee

    TIOBE programchlaliin negdsen holboonoos sar bvr delhiin olon chadbarlag engiineer , surgalt bolon guravdagch ashiglagchdaas tedend tvgeemel hereglegddeg programchlaliin helvvdiig sudlan tedgeert vnelgee ogdog baina. Hamgiin aldartai hailtiin system Google,MSN,Yahoo-g ashiglan tednii rating-iig tootsoolson bolno. TIOBE index ni hamgiin sain programchlaliin hel , hamgiin ih mor code bichigddeg helnii tuhai sudalgaa bish umaa.

    Index ni tanii programchlaliin chadvar deeshilseer (onoo veteigee hol zeregstej) bain uu , shine system hiihed ymar programming language orgon ashiglagdaj baina be gedeg talaar sudalgaa hiideg um baina.

    2007-02
    sariin
    bair
    2006-02
    sariin
    bair
    Bairiin
    zorvv
    Program
    -chlaliin
    hel
    2007-02
    sariin
    rating osolt
    2006-02
    sariin
    rating zorvv
    Tolov
    1 1 Java 18.978% -3.45% A
    2 2 C 16.104% -2.23% A
    3 3 C++ 10.768% -0.53% A
    4 5 PHP 8.847% -0.07% A
    5 4 (Visual) Basic 8.369% -1.03% A
    6 6 Perl 6.073% -0.63% A
    7 8 Python 3.566% +0.90% A
    8 7 C# 3.189% -0.78% A
    9 10 JavaScript 2.982% +1.47% A
    10 20 10 * Ruby 2.528% +2.12% A
    11 11 SAS 2.326% +1.13% A
    12 9 Delphi 2.077% +0.10% A
    13 12 PL/SQL 1.628% +0.66% A
    14 21 7 * ABAP 1.205% +0.83% A
    15 22 7 * D 1.205% +0.84% A
    16 14 Lisp/Scheme 0.722% +0.10% A--
    17 17 Ada 0.661% +0.15% B
    18 13 COBOL 0.656% -0.08% B
    19 15 Pascal 0.596% +0.05% B
    20 36 16 * Transact-SQL 0.543% +0.38% B

    Top 10 programchlaliin helnii rating-iig graphicaar

    Jagsaaltiin 21-50 dahi helvvd

    Top 50 programming helnii vrgeljleliig door jagsaan bichlee. Ene jagsaaltand zarim hel orhigdson baij bolzoshgvi uchir herev orhigdson bol tpci@tiobe.com haygruu mail bichin medegdehiig hvsii .

    Bair ezlelt
    Programmiin hel
    Vnelgee
    21 Fortran 0.518%
    22 FoxPro/xBase 0.517%
    23 Awk 0.406%
    24 Prolog 0.393%
    25 IDL 0.368%
    26 MATLAB 0.362%
    27 Logo 0.326%
    28 ActionScript 0.314%
    29 Bash 0.299%
    30 ColdFusion 0.286%
    31 RPG 0.266%
    32 LabView 0.234%
    33 CL 0.172%
    34 Smalltalk 0.166%
    35 Forth 0.158%
    36 REXX 0.158%
    37 Maple 0.156%
    38 Tcl/Tk 0.156%
    39 S-lang 0.140%
    40 Icon 0.130%
    41 Haskell 0.129%
    42 Natural 0.127%
    43 VBScript 0.120%
    44 Lua 0.114%
    45 Q 0.113%
    46 OCaml 0.110%
    47 Objective-C 0.108%
    48 APL 0.105%
    49 Lingo 0.105%
    50 ML 0.096%

    Jagsaaltiin daraagiin 51-100 dahi programchlaliin heliig ratingeer jagsaalaa
    (rating bichih bolomjgvi nariibchlal ondortei.)

    ABC, Algol, Alpha, Applescript, AspectJ, Avenue, Beta, Boo, cg, Ch, Clarion, Clean, Csh, cT, DC, Dylan, EGL, Eiffel, Erlang, Euphoria, F#, Felix, Focus, Groovy, Inform, Io, Limbo, LotusScript, MAD, Magic, Mathematica, Modula-2, MOO, MUMPS, Occam, Oz, PILOT, PL/I, Postscript, Powerbuilder, Progress, Rebol, Scala, Seed7, SIGNAL, SPSS, Verilog, VHDL, XSLT, Yorick

    Object handlagat programchlal hvchee absaar baina.

    Angilal
    2007 - 2 sariin
    vnelgee
    2006 - 2 sariin zoruu
    vnelgee
    Object-Oriented Languages 51.8% +0.5%
    Procedural Languages 45.7% -1.4%
    Logical Languages 1.7% +0.8%
    Functional Languages 0.8% +0.2%


    Angilal
    2007 - 2 sariin
    vnelgee
    2006 - 2 sariin zoruu
    vnelgee
    Statically Typed Languages 57.6% -3.7%
    Dynamically Typed Languages 42.4% +3.7%

    Niitleliig : The coding standard company