Friday, May 11, 2007

English hel suraltsagchdad : American idioms

1. IDIOM - Smell a Rat

How come the front door is open? Didn't you close it before we went shopping?
I'm sure I did. I can't understand it. Frankly, I smell a rat.
Me, too. I'm convinced that something is definitely wrong here. We'd better call the police.

2.IDIOM - Go to the Dogs

Have you seen their house lately? It's really gone to the dogs.
It's true that it has become run-down and in serious need of repair, but I'm sure that it can be fixed up to look like new.
I guess with a little carpentry work and some paint it could look pretty decent.

3.IDIOM - Fishy

When the security guard saw a light in the store after closing hours, it seemed to him that there was something fishy going on. He called the central office and explained to his superior that he thought something strange and suspicious was occurring.

4. IDIOM- Take the Bull by the Horns

Julie had always felt that she was missing out on a lot of fun because of her clumsiness on the dance floor. She had been putting off taking lessons, but she finally took the bull by the horns and went to a professional dance studio for help. She was tired of feeling left out and acted decisively to correct the situation.

5. IDIOM- Let the cat out of the Bag

Bob was going to retire from teaching in June, and the foreign language department was planning on presenting him with some luggage at his retirement dinner. He wasn't supposed to know about it, but someone let the cat out of the bag. At the dinner Bob acted surprised, even though someone had told him what he was getting before the official presentation.

6. IDIOM - For the Birds

They went to a poetry reading, but they got bored and restless. As far as they were concerned, it was for the birds! They left during an intermission because they found the reading totally uninteresting and meaningless

7. IDIOM - Straight From the Horse's Mouth

How did you find out that Jill was engaged?
I got the information from a very reliable source.
You mean Jill told you so herself?
That's right. I got it straight from the horse's mouth!

8. IDIOM- Horse Around

Did you hear about Dave's back injury?
No. How did he get hurt?
Well, after the coach left the gym he decided to stay and horse around on the parallel bars. He somehow lost his grip and fell on his back.
That's too bad, but he shouldn't have been aimlessly playing around on the equipment without proper supervision.

9. IDIOM - Cat Got Your Tongue?

Come on, Connie! Tell us what you think about our little ride down the rapids yesterday.
Well, uh...
Wasn't it exciting?
I, uh...
What's the matter? Cat got your tongue?
If you must know, I'm keeping quiet because I was scared out of my wits!

10. IDIOM - Get in Someone's hair

Children! Would you please stop making so much noise!
And for heaven's sake, pick up your clothes and toys!
It's hard enough trying to keep this house clean without your throwing your things all over the place!
Clara, I know that the children get in your hair, but you should try not to let it upset you so much.
Listen, Jim. I can't help it . The children bother me and make me very angry when they're so noisy and messy.

11.IDIOM - Shoot Off One's Mouth

Jim doesn't play tennis very much, but he's always shooting off his mouth about how good he is. Yet he's fooling nobody. Jim is somewhat of a braggart and everyone knows that he gives opinions without knowing all the facts and talks as if he knew everything about the game.

12. IDIOM - Jump Down Someone's Throat

That's it, Greg! You'd better not come in after midnight again tonight!
I know, dad. You don't have to jump down my throat! I told you that I'd make it home around 11:30. I don't intend to be late!
Well, you've said that before and in you come at 2: 30 in the morning. You can't blame me for getting angry and scolding you. I've got good reason.

13. IDIOM - Pay Through the Nose

At last Mr. Smith came upon the rare stamp he had been seeking at an auction. Since many other stamp collectors would also be bidding for it, he realized that he would have to pay through the nose in order to have it.
After considering the increasing value of the stamp, he decided that he would not mind paying such a high price for something so rare.

14. IDIOM - Tongue-in-Cheek

Why were you teasing Sonia about her new hairdo? She really took offense at what you said.
I didn't mean to offend her. I was simply making a tongue-in-cheek remark when i said that it was too elaborate for a girl of her young, tender age.
Well, she thought you were serious. She had no idea that you were just saying that as a joke.
I'm really sorry. I suppose I owe her an apology.

15. IDIOM - Pull Someone's Leg

Hey, Al. I was invited to be a judge for the Miss America Beauty Pageant!
Oh, really? Come on, you're pulling my leg!
No, honestly. Do you really think that I'm trying to fool you with a ridiculous story?
Well, you've told me foolish stories before.
I can assure you that this one is for real.

16. IDIOM - Play It by Ear

Let's go to the movies, agreed?
Sure. And what'll we do after that ?
Oh, I don't know. Let's play it by ear.
Well, I would like to have a more definite plan of action.
Don't be like that. It's always more fun not knowing what to expect and deciding what to do as we go along.

17. IDIOM - Stick Out One's Neck

How come they're asking me to act as their guide through the jungle?
Evidently they think you're the only one who can lead them to the lost temple.
That jungle has danger lurking around every corner.
Why should I stick my neck out for them? They didn't pay me for my services.
They know that you would be taking a great risk and could possibly get hurt, but you're the only one with enough knowledge to take them to their destination. I'm sure you'll be amply rewarded.

18. IDIOM - All Thumbs

Hey Bea. Can you help me out ? I don't seem to be able to button up the back of my dress.
Sure. Let's see if I can do it for you.
I guess I'm all thumbs because I'm so nervous. I'm already late for my date.
Well, I suppose that being so nervous would make you clumsy and awkward. But don't worry. I'm sure your date will wait.

19. IDIOM - Not Have a Leg to Stand On

Tom maintains that the firm owes him some back wages for having worked overtime. However, he won't have a leg to stand on unless he can prove that he put in all those extra hours. He doesn't stand a chance of getting his money without a strong foundation of facts to support his position.

20. IDIOM - Get Off Someone's Back

Hey, John. I'm bored. Come on, let's go out and do something.
Sorry, I'm right in the middle of studying for a physics exam. I won't be able to make it tonight.
You've been studying for a long time. Why don't you take a break ? Come on! Let's go ! Forget studying for a while !
Look! Get off my back! I can't go anywhere!
OK. I'll stop bothering you only if you promise to let me know the minute you're finished.

21. IDIOM - Drive Someone Up a Wall

Wow ! What a great set of drums!
Yeah, they're great, but I can't play on them when my folks are at home. They say I drive them up a wall with all the loud banging.
I get the same thing at home. My folks tell me that I annoy them and get them really angry whenever I turn up the volume on my stereo.

22. IDIOM - String Someone Along

Liz had high hopes of marrying Dean. When he ran off with another woman, she realized that he was just stringing her along. She had felt very strongly about him and was really hurt to see that he was deceiving her and had no intentions of ever marrying her.

23. IDIOM- Leave Someone High and Dry

Say, Jill. I thought that John was going to help you do the dishes tonight.
So did I. But he left me high and dry.
Where did he go ?
Well, he got a call from some of his pals at work to go bowling, and he left me alone to do all this work without any help at all!

24. IDIOM - Spill the Beans

Did you know that Harry was going to take Kathy on a Caribbean cruise ?
Yes, I did. He was planning on surprising her with the tickets fro their anniversary, but someone spilled the beans.
What a shame ! That was supposed to have been a surprise.
Yes, it's too bad that someone told her about the trip beforehand and ruined Harry's surprise.
That's OK. Her enthusiasm was not dampened in the least!

25. IDIOM - Bite the Dust

Andy did exceptionally well in all of the track events, but he bit the dust in the high jump competition. Much to the disappointment of his fans, he went down in defeat, losing to a competitor from the visiting team.

26. IDIOM - Bend Over Backwards

When Joan first started teaching she was afraid that she would have a lot of trouble getting used to the kids and to the faculty. Her fears turned out to be unfounded, since everybody bent over backwards to help her. Everyone tried very hard to help her feel comfortable and adjust to the school.

27. IDIOM - Cough Up

Say, Greg. Did you finally get that computer that you wanted so much ?
Not yet. I needed to raise a couple of hundred dollars more.
Is it going to take you a while to raise the money?
It would have taken me forever, but dad said he'd cough up the money I need since I'm going to be using the computer for my school work.
Maybe it was difficult for your dad to give you the money but then, he knows that it's for a good cause.

28. IDIOM - Jump the Gun

Denise was planning on telling her grandparents that the doctor said she was going to have twins, but when her dad found out he jumped the gun and told them before Denise could say a word. He was so excited that he became hasty and revealed the news before Denise had a chance to tell them.

29. IDIOM - Scratch Someone's Back

Hey, Bea. I need some help stacking these boxes. Would you please give me a hand?
OK. And I need some help tidying up the house. How about your helping me out after that ?
OK. If you scratch my back, I'll scratch yours.
I know you don't like doing housework, but I'll help you with the boxes if you promise to return the favor.
No problem. I'll even do the windows.

30. IDIOM - Turn Someone Off

How was your date with Marty last night ?
Well, it started of OK, but he really turned me off when we went for a snack after the movies.
Did he say or do something to annoy you?
Frankly, he disgusted me when he tried to talk with his mouth full.
I don't blame you . That would have really bothered me too.

31. IDIOM - Kick the Bucket

It's been said that the old man knew of a buried treasure, but he kicked the bucket before telling anyone where it was. If the treasure exists, the old man unfortunately took the secret of its location with him when he died.

32. IDIOM - Wet Blanket

James was not invited to go on the outing with the rest of the group because he's such a wet blanket. On many previous occasions he has kept others from enjoying themselves by his pessimism and lack of enthusiasm. It's understandable that no one wants him around.

33. IDIOM - Up One's Sleeve

All right, Sara. We know that you're planning something big for Jean's birthday. Mind telling us just what you have up your sleeve ?
I wanted to make his birthday a very special event.
Jean has a sister living in France, and I sent her an airplane ticket so that she could be here for his birthday.
Boy! That is something special. We kind of guessed that you had some concealed plan and were waiting for the right time to reveal it.
Well, I didn't want to say anything until I was sure she could come.

34. IDIOM - Knock Someone's Socks Off

Hi, John. What's new ?
Oh, nothing too much with me, but you ought to see Fredo's new car. It'll knock your socks off!
So, he finally got that Italian sports car he's been dreaming about.
He sure did. When you see all the custom features that it has, you'll get so enthused and excited you won't know what to do.
Boy, I can hardly wait to go for a ride in it.

35. IDIOM - Lose One's Shirt

I happened to bump into Dole at lunch yesterday afternoon.
What's new with Dole these days ?
He wasn't doing so well. For one thing, he told me he lost his shirt at the races.
Dole has always liked to bet on the horses. I'm not surprised that he lost a great deal of money.
Yeah. At this rate he'll never have a penny to his name.

36. IDIOM - Lemon

Have you seen Joe's new car yet ?
Yeah. It looks good, but she's had nothing but problems with it.
That's too bad. It sounds like she got a real lemon.
She sure did. No sooner did she drive it home from the dealer's than it proved defective and started breaking down.

37. IDIOM - Out of the Woods

Although Eric was well on his way to recovering from his bout with pneumonia, he was still not out of the woods. The doctors told him that he would have to take it easy and avoid exposure to cold, since he was not out of danger and difficulty yet.

38. IDIOM - Eating Someone

Hey, Alice. What's been eating you lately ? Don't you realize how rude and irritable you've become?
I know. I'm really sorry for the way I've been acting.
Well, why don't you tell me what has been bothering and upsetting you and maybe we can work your problem out together.
I'll admit that it would help to talk to someone about it.

39. IDIOM - On the Line

Lately Tom's been more conscientious about the accuracy and quality of his work with the company. He was warned that his job was on the line because of his lack of concern for his duties. When Tom was alerted that he was in danger of losing his job, he began to take his obligations with the company more seriously.

40. Feel Like a Million Dollars

I bumped into Nick at the salon yesterday. He looked great, but I noticed that he had a slight limp when he walked.
I guess you didn't know that he had an operation on his knee.
No, I didn't. How's he feeling ?
He says he's feeling like a million dollars now. Apparently the pain in his knee is all gone.
It's good that he's feeling so wonderful. It must be a refreshing change not having to put up with all that discomfort.

41. IDIOM - Hang On

During the depression years the Smiths had a great deal of trouble with their business, but somehow or other they were able to hang on. Although they almost lost their store, they managed to persevere until things got better.

42. IDIOM - Make Ends Meet

It's almost impossible trying to keep up with the high cost of living.
It's true. Things are so expensive nowadays that it's very difficult to make ends meet.
You know, even with Lucie's salary, our combined income is hardly enough to pay all the bills.

43. IDIOM - Money talks

We've been waiting for three months to get delivery on our car, and people who put in their order after us have already gotten theirs.
Well, money talks. Why don't you try giving the dealer a little something extra to move things along ?
I know full well that money has the power to influence people, but I refuse to pay extra for a service that is owed to me as a client.
If you want to have your car maybe you'd better reconsider.

44. IDIOM - The Early Bird Catches the Worm

Marc, the lines for the rock festival are going to be miles long! If you expect to get tickets for you and Mary, remember that old saying. " The early bird catches the worm "
I guess you're right. Mary is looking forward to the concert, and I'd hate to disappoint her. I'll get up real early to get a place at the head of the line.
That way I'll get the tickets I want, for sure !

Monday, April 2, 2007

Source code-iig site deeree herhen haruulah be?

Herev ta ymar negen source codiig web deer bolon hen negnii site-d comment baidlaar ni haruulah gej baigaa bol XML hel buyu text-iin oor negen helbert horbvvlj haruulaarai. Compiler buyu alibaa computer tootsoolon bodoh mashin alivaa code-uudiig mor moroor ni unshdag uchir herev tanii texten dotor ymar negen code-iin bichilt orson l bol compiler tvvniig ajiluulah ni oilgomjtoi. Tiimees ihenh developeruud hereglegchtei hariltsah orolt bvrt filter buyu ymar negen code-iin syntax ( "<>","exec ","connect" ...geh met ) haij olood usatgah function oruulsan baidag. Bi ch gesen ooriin hiisen web site bolon program-d iimerhvv zviliig ch oruulsan. Herev ymar neg shvvltiin function ashiglahgvi bol HAKER-uudad tun olzuurhuushtai zvil bolno. Gehdee Haker-uudiig hubid ene bol tuhain web site bolon programiig ebdeh engiin neg arga umaa. End darj Text File-iig XML file-ruu horbvvlegch soft tataj abch bolno.

XML

Extensible Markup Language ni text file-iin orgotgoson , ashiglah bolomj ni uyan hatan , text-iin negen helber um. XML-iig ashiglan medeelliin baaziig damjuulahad mon ashiglaj bolno. XML deer bichihed ooriin gesen syntax-tai bh bogood gehdee vvniig compiler ajluuldaggvi idebhgvi text gej oilgodogooroo dabuu taltai. Herev ta ilvv delgerengvi medeelel avahiig hvsbel XML key-aar hailt hiij vzeerei. :)

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 нэрийн дор эцэслэн баталжээ. Энэ стандартыг АНУ, Их Британи, Герман болон бусад олон улс гүрнүүд өөрсдийн үндэсний стандарт мэтээр өвлөн авч баталсан байна.