Гэр / Хөтөчүүд / Си програмчлалын хэл. CC SIT Compilers-ийн үндсэн үйл ажиллагаа, хөгжүүлэлтийн орчны тойм

Си програмчлалын хэл. CC SIT Compilers-ийн үндсэн үйл ажиллагаа, хөгжүүлэлтийн орчны тойм

практик курс

Энэ юу вэ?

Нэгэн цагт (1991-1992) хэлээ сонгох СиМатематикийн хичээлийн програмчлалын гол хэл болохын хувьд зохиолч сургуулийн сурагчдад санал болгож болох энгийн сурах бичиг дутагдалтай тулгарсан. Энэ нь түүнийг лекцийн тэмдэглэлээ бичихэд хүргэсэн бөгөөд үүнийг дуудаж болно "Практик програмчлалын курс Си» - Энэ нь зохиогчийн практикт үнэхээр хэрэгтэй мэдээллийг багтаасан. Олон жилийн багшийн туршлагаас харахад тэмдэглэл нь үнэхээр эрэлт хэрэгцээтэй бөгөөд сургуулийн сурагчид болон төгсөгчдийн аль алинд нь өргөн хэрэглэгддэг.

Хөгжлийн орчин нь GCC хөрвүүлэгчийг агуулсан үнэгүй, нээлттэй эхийн Dev-C++ бүрхүүл юм.

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

Тусгай зөвшөөрлийн гэрээ

  1. 1) материалыг ямар ч хэлбэрээр нийтлэх, түүний дотор бусад вэб сайтад байрлуулах;
  2. 2) бүрэн бус буюу өөрчилсөн материалыг тараах;
  3. 3) аливаа мэдээллийн хэрэгслийн цуглуулгад материалыг оруулах;
  4. 4) материалыг худалдах эсвэл бусад ашиглалтаас арилжааны ашиг олох.

Материалыг татаж авснаар та энэхүү лицензийн гэрээний нөхцлийг хүлээн зөвшөөрч байна гэсэн үг.

Татаж авах

Хураангуйг форматаар чөлөөтэй тараана PDF. Үзэхийн тулд үнэгүй Acrobat Reader шаардлагатай. Хичээлийн тойм нь 4 хэсэгт хуваагдана:

  1. Си хэлний програмчлалын танилцуулга (860 Kb) 29.03.2014
    Хэлний үндсэн бүтэц, програм бичих арга техникийг судлах.
  2. Мэдээлэл хадгалах, боловсруулах (792 KB) 21.11.2013
    Си хэл: массив, матриц, бүтэц, тэмдэгтийн мөр, бүтэц, рекурс.
  3. Си хэл дээр програм боловсруулах (937 Kb) 01.03.2014
    Программ зохиох арга техник, бүтэцлэгдсэн програмчлал, бүхэл тоон алгоритм, тоон арга, загварчлал.
  4. Си хэл дээрх динамик өгөгдлийн бүтэц (666 KB) 11.06.2009
    Жагсаалт, стек, мод, график.

Илтгэлүүд

Багш, оюутнууд энэ хураангуйд үндэслэсэн илтгэлээс ашиг тустай байж болно. Тэдгээрийг "Танилцуулга" хуудаснаас татаж авах боломжтой.

Арга зүй

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

8-р анги

Хөтөлбөр нь дараах хэсгүүдийг агуулна (хураангуйн хэсгийг хаалтанд оруулсан болно). Массив (II), Файлтай ажиллах (II), Тэмдэгтийн мөр (II), Эргэдэг объект (III), Загварчлал (III). Хайлт, эрэмбэлэх гэх мэт массивуудтай ажиллах алгоритмуудыг судлахад онцгой анхаарал хандуулдаг. Тооцооллын аргын үр ашгийн тухай ойлголтыг өгсөн болно.

9-р анги

Гол анхаарал нь суралцах явдал юм програм хангамж боловсруулах аргуудхэлээр Си. Оюутнууд бие даасан даалгавраа гүйцэтгэж, энэ хугацаанд дэлгэцэн дээр график байгуулж, координатын системийн хувиргалттай танилцаж, тэгшитгэлийг шийдвэрлэх аргуудыг судалж, тоон аргуудтай танилцаж, програмыг зөв зохиож сурдаг (Хэсэг 1-2-р хэсэг). III). Даалгавруудын нэг нь ашиглалтад зориулагдсан Монте Карло арганарийн төвөгтэй дүрсийн талбайг тооцоолох. Шинэ хэсгүүдээс бид бас судалж байна Матриц (II), Тэмдэгт мөрийн массив (II). Үзэл баримтлалыг танилцуулж байна заагчмөн тэдэнтэй хийх хамгийн энгийн үйлдлүүдийг судалдаг.

10-р анги

Хэл сурах Сиилүү ноцтой түвшинд хүрдэг. Үндсэн сэдэв - Санах ойн менежмент (II), Рекурс (II), бүтэц (II). Паскал хэлийг хоёр дахь програмчлалын хэл болгон судлахаар төлөвлөж байна. Энэ мөчөөс эхлэн онолын ангиудад алгоритмуудыг хоёр хэлээр ээлжлэн бичдэг.

11-р анги

Алгоритм гэхээсээ илүү хэлний шинж чанаруудыг судалдаг зүйл биш юм. Үндсэн хэсгүүд - Тоон аргууд (III), Загварчлал (III), Динамик өгөгдлийн бүтэц (IV).

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

  • FOR, WHILE, DO...WHILE гэсэн үндсэн гурван төрлийн гогцоо байдаг.
  • FOR гогцоо ашиглана уу.Энэ бол мөчлөгүүдийн хамгийн алдартай бөгөөд ашигтай нь юм. Энэ нь өгөгдсөн функцийг FOR-д заасан нөхцөл хангагдтал үргэлжлүүлэн гүйцэтгэдэг. FOR гогцоонууд нь эхлүүлэх хувьсагч, хангагдах нөхцөл, хувьсагчийн утгыг хэрхэн шинэчлэх гэсэн гурван нөхцөлийг зааж өгөхийг шаарддаг. Хэрэв танд эдгээр гурван нөхцөл шаардлагагүй бол тэдгээрийн оронд цэг таслал бүхий зай үлдээх хэрэгтэй бөгөөд энэ тохиолдолд гогцоо үүрд үргэлжлэх болно.

    #оруулна int main () ( int y ; for ( y = 0 ; y).< 15 ; y ++ ){ printf ( "%d \n " , y ); } getchar (); }

    • Дээрх программ дээр y хувьсагчийн анхны утга тэг байх ба хувьсагчийн утга 15-аас бага болтол давталт үргэлжилнэ.Ү-ийн шинэ утга гарч ирэх бүрт нэгээр нэмэгдэж, давталт давтагдана. y хувьсагч 15-тай тэнцүү болмогц давталт дуусна.
  • WHILE гогцоо ашиглана уу. WHILE гогцоонууд нь FOR гогцооноос хялбар байдаг. Тэд зөвхөн нэг нөхцөлийг тавьдаг бөгөөд энэ нөхцөл хангагдсан тохиолдолд гогцоо ажиллана. Энд та хувьсагчийг эхлүүлэх эсвэл шинэчлэх шаардлагагүй, гэхдээ үүнийг давталтын кодын үндсэн хэсэгт хийж болно.

    #оруулна int main () ( int y ; while ( y<= 15 ){ printf ( "%d \n " , y ); y ++ ; } getchar (); }

    • y++ команд нь давталт ажиллах бүрт y хувьсагчийн утгад нэгийг нэмнэ. y хувьсагч 16 болмогц (хувьсагч гарах хүртэл давталт ажиллах ёстойг анхаарна уу. -аас бага буюу тэнцүү 15), мөчлөг зогсдог.
  • Гогцоо түрхээрэй Д.О...ХЭТ. Энэ гогцоо нь давталтын үйлдлүүдийг дор хаяж нэг удаа хийх шаардлагатай тохиолдолд маш ашигтай байдаг. FOR болон WHILE гогцоонд нөхцөлийг хамгийн эхэнд нь шалгадаг, өөрөөр хэлбэл, хэрэв худал үр дүн гарвал нөхцлөөр заасан үйлдлийг алгасаж, гүйцэтгэхгүй. DO...WHILE давталт нь хамгийн төгсгөлд байгаа нөхцөлийг шалгадаг бөгөөд энэ нь давталтыг дор хаяж нэг удаа гүйцэтгэх боломжийг олгодог.

    #оруулна int main () ( int y ; y = 5 ; do ( printf ( "Гокд ажиллаж байна! \n " ); ) while ( y != 5 ); getchar ( ; )

    • Нөхцөл байдлын туршилт амжилтгүй болсон ч энэ давталт нь төлөвлөсөн мессежийг харуулах болно. y хувьсагчийг тав болгосон ба хувьсагч тавтай тэнцэхгүй үед давталт давтагдах ёстой тул давталтаас гарна. Нөхцөл байдлыг зөвхөн төгсгөлд нь шалгадаг тул мессежийг дэлгэцэн дээр нэг удаа харуулна.
    • DO...WHILE давталтын WHILE өгүүлбэр цэг таслалаар төгсөх ёстой. Энэ бол төгсгөлд цэг таслал шаарддаг цорын ганц гогцоо юм.
  • Техникийн зохицуулалт, стандартчилал, тохирлын үнэлгээний RSPP хорооны мэдээллийн технологийн стандартчиллын салбар хоорондын зөвлөл.

    TK-MTK-22 хуучин вэбсайт руу нэвтэрнэ үү

    Түр зуурын алдаа гарвал уучлаарай. Портал хөгжиж байгаа тул зарим хэсгийг түр хаасан.

    Мэдээллийн технологийн стандартчиллын салбар дахь чадамжийн төв (CC SIT) нь RSPP-ийн Техникийн зохицуулалт, стандартчилал, тохирлын үнэлгээний хорооны салбар хоорондын зөвлөл (цаашид Зөвлөл гэх) -ийн чадавхийг хөгжүүлэх зорилгоор байгуулагдсан. Зөвлөл нь зөвхөн зөвлөх байгууллагаар ажиллах нь шинэ зорилтуудын өмнө хүссэн үр дүнг авчрахаа больсныг практик харуулж байна.

    Дижитал эдийн засгийн хөтөлбөрийг баталж, хэрэгжүүлж эхэлснээр мэдээллийн технологийн стандартчиллын салбарт шинэ сорилтууд гарч эхэлсэн. Юуны өмнө энэ чиглэлээр мэргэшсэн мэргэжилтнүүдийн мэдээлэл дутмаг, олон шийдвэр шинжлэх ухааны үүднээс хангалттай үндэслэлгүй, хуучирсан, шаардлагатай зохицуулалт, хууль тогтоомжийн актууд дутмаг, мэргэшсэн боловсон хүчин дутагдалтай байгаа нь илэрхий болсон. . Хамгийн гол нь мэдээллийн нэгдсэн орон зайг бий болгох тал дээр салбар хоорондын болон салбар хоорондын шийдэл хэрэгтэй байгаа нь технологийн шинэ бүтцэд шилжих чухал хүчин зүйл болох ёстой.

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

    SIT Төв Хорооны үндсэн үйл ажиллагааны тойм

    Стандартчилал

    Мэдээллийн технологийн стандарт гэж юу вэ - мэдээллийн технологийн стандарт болох ёстой - мэдээллийн технологийн стандарт байх ёсгүй

    Си бол нэлээд "эртний" програмчлалын хэл бөгөөд 70-аад оны эхээр үүссэн. Гэсэн хэдий ч Си хэл нь өнөөдөр идэвхтэй хэрэглэгдэж байгаа утгаараа амьд хэл юм. Үүнийг зохион бүтээсэн, ашигласан бөгөөд Unix-тэй төстэй үйлдлийн системүүдийн програмын кодын чухал хэсгийг бичихэд ашигладаг. Мөн хэрэглүүр, хөрвүүлэгч, бага түгээмэл хэрэглээний программ бичихэд ашигладаг. Тийм ч учраас Си хэлийг системийн програмчлалын хэл гэж нэрлэдэг.

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

    Си нь объект хандалтат програмчлалыг дэмждэггүй. OOP дэмжлэг нь C++ хэл дээр хэрэгждэг. Сүүлийнх нь Си хэлнээс үүссэн хэдий ч түүний "үргэлжлэл" биш, харин С-ийг мэдэхгүй байж сурах тусдаа хэл юм. Гэхдээ С хэл сурах нь "хөгшин ахисан дүүгээ" таньж мэдэхээс өмнө ашигтай байдаг тул Хэлний синтакс нь ижил төстэй бөгөөд C нь шинэхэн програмистын тархийг хэт их хүчээр ачаалдаггүй бөгөөд түүнд болж буй зүйлийн мөн чанарыг ойлгохыг заадаг.

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

    Мэдээж та заагч сурахгүйгээр Си хэлээр програмчлалын үндсийг сурах боломжтой. Гэсэн хэдий ч хүн С-ийн талаар сайн мэдэхгүй байж өөрийгөө мэддэг гэж бодох болно. Си хэлийг техник хангамжийн мэдлэгтэй мэргэжлийн програмистууд UNIX үйлдлийн системийг бичих зорилгоор бүтээжээ. Энэ нь эхлэгчдэд заах хэл биш байсан.

    Си програмчлалын орчин ба хөрвүүлэгч

    Хэрэв та GNU/Linux түгээлтийн аль нэгийг ашиглаж байгаа бол синтакс онцолсон дурын текст засварлагч танд GCC болон терминал хэрэгтэй болно.

    Терминал, лавлахыг үзэх гэх мэт төрөл бүрийн нэмэлтүүдийг агуулсан програмистуудад зориулсан редакторууд байдаг. Жишээлбэл, Geany эсвэл Atom.

    Си бол эмхэтгэсэн програмчлалын хэл юм. GNU/Linux-д гүйцэтгэх боломжтой файлуудыг олж авахын тулд GCC ашигладаг - C-д зориулсан хөрвүүлэгчийг багтаасан хөрвүүлэгчдийн багц. Эх файлаас гүйцэтгэгдэх файлыг авахын тулд (ихэвчлэн ийм файлууд *.c өргөтгөлтэй байдаг) та ажиллуулах хэрэгтэй. Терминал дээрх тушаал нь иймэрхүү харагдах болно:

    gcc -o сайн уу сайн уу.c

    Энд gcc нь эмхэтгэл болон бусад үйлдлийг гүйцэтгэдэг програмыг ажиллуулдаг команд юм; -o – гүйцэтгэх файлын нэрийг гараар зааж өгдөг шилжүүлэгч; Сайн байна уу - үүссэн гүйцэтгэгдэх файлын нэр; hello.c нь эх кодын файлын нэр юм. Гүйцэтгэх файлын нэрийг орхиж болно:

    gcc hello.c

    Энэ тохиолдолд гүйцэтгэх файл нь анхдагч a.out нэртэй байх болно.

    Windows нь MinGW гэсэн өөрийн гэсэн хөрвүүлэгчтэй. Үүнийг дангаар нь ашиглах боломжтой боловч энгийн Dev-C++ хөгжүүлэлтийн орчинд багтсан нь C болон C++ хэл дээр программчлах сурахад тохиромжтой сонголт байж болох юм.

    Хадгалахдаа "C source files (*.c)" файлын төрлийг сонгоно уу. Хөтөлбөрийг эмхэтгэж, F9 товчийг дарж ажиллуулна. Гүйцэтгэлийн дараа програм шууд хаагдах бөгөөд үр дүн нь харагдахгүй. Үүнээс сэргийлэхийн тулд хоёр нэмэлт мөр бичнэ үү: #include болон getch(). (Энэ нь Dev-C++-ийн шинэ хувилбарт хамааралгүй байж магадгүй.)

    GNU/Linux дээрх "Hello World":

    #оруулна \n") ; }

    Windows дээрх "Hello World":

    #оруулна #оруулна int main() (printf("Сайн уу Дэлхий \n"); getch(); )

    Нөгөөтэйгүүр, олон тооны платформ хоорондын хөгжүүлэлтийн орчин байдаг. Жишээлбэл, Eclipse + CDT модуль, KDevelop, CLion. Сүүлийнх нь төлбөртэй, IDE хөгжүүлэлтийн тэргүүлэгч JetBrains үйлдвэрлэсэн боловч 30 хоногийн туршилтын хугацаатай бөгөөд энэ нь сургалтанд хангалттай байж магадгүй юм. CLion нь бусад IDE-ээс илүү тохиромжтой.

    C хэл дээрх "Сайн уу Дэлхий"

    Энгийн програмын жишээг ашиглан бид Си програмчлалын хэлний зарим шинж чанарыг нэн даруй тэмдэглэх болно.

    Си хэлэнд main() функц нь программын үндсэн салбарын үүргийг гүйцэтгэдэг. Энэ функц нь иж бүрэн С програмд ​​үргэлж байх ёстой бөгөөд программын гүйцэтгэл нь үүнээс эхэлдэг. Гэсэн хэдий ч түүний дотор зарласан хувьсагч нь глобал биш бөгөөд тэдгээрийн хамрах хүрээ нь зөвхөн main()-д хамаарна. Гэсэн хэдий ч Си програмчлалын хэлэнд бараг бүх програмын код нь функцэд агуулагддаг бөгөөд main() функц нь үндсэн бөгөөд шаардлагатай функц юм.

    Анхдагчаар main() функц нь int өгөгдлийн төрлийг буцаадаг тул та буцах төрлийг зааж өгөх шаардлагагүй. Гэхдээ энэ тохиолдолд хөрвүүлэгч анхааруулга өгдөг.

    printf() функц нь өгөгдлийг хэвлэх зориулалттай. Үүний зорилго нь Паскал дахь write() процедур болон Python дахь print() функцтэй төстэй. printf() функц хэвлэсний дараа шинэ мөрөнд тасрахгүй. Тиймээс шилжилтийн хувьд тусгай тэмдэгт ашигладаг бөгөөд үүнийг \n хослолоор тэмдэглэдэг. Бүрэн C илэрхийллүүд нь цэг таслалаар тусгаарлагдана.

    Си хэл дээр I/O функцууд нь хэлний нэг хэсэг биш юм. Жишээлбэл, Python дээр бид print() болон input() функцуудыг ашиглахын тулд ямар ч модуль импортлох шаардлагагүй. Си хэл дээр бид зүгээр л printf() функцийг дуудаж болохгүй, учир нь С-д энэ нь ердөө л байхгүй. Энэ функц болон бусад хэд хэдэн функцийг stdio.h толгой файлыг ашиглан идэвхжүүлж болно. Програмын эхэнд мөрийг бичсэн нь ийм учиртай юм #оруулна . Include гэдэг нь англи хэлнээс "асаах" гэж орчуулагддаг бөгөөд stdio нь "стандарт оролт-гаралт" гэсэн үгийн товчлол юм.

    Толгой файлууд (тэдгээр нь *.h-ээр төгсдөг) ихэвчлэн тодорхой функцүүдийн мэдэгдлүүдийг агуулдаг. Тунхаглал гэдэг нь зүгээр л функцийн тодорхойлолт юм: энэ нь ямар параметрүүдийг авдаг, юу буцаадаг. Функцийн код нь өөрөө (тодорхойлолт) толгой файлд байрладаггүй, харин номын санд (бусад файлууд) байрладаг бөгөөд тэдгээрийг аль хэдийн эмхэтгэж, системийн лавлах хэсэгт байрлуулж болно. Программыг эмхэтгэхийн өмнө Си хэлний урьдчилсан процессорыг ажиллуулдаг ба бусад зүйлсээс гадна програмын файлын эхэнд түүнд заасан толгой файлуудын агуулгыг багтаадаг.

    Практик ажил

    HelloWorld кодын эхний мөрөнд тайлбар бичнэ үү. Хөтөлбөрийг эмхэтгэж үзээрэй. Та гүйцэтгэх боломжтой файлыг авч чадсан уу? Хөрвүүлэгч ямар анхааруулга өгсөн бэ?

    1 // - Си хэл дээрх нэг мөртэй тайлбар; /* … */ - Си хэл дээрх олон мөрт тайлбар.

    Онцлог шинж чанарууд

    Шүүмж

    Си програмчлалын хэл нь минимализмаар тодорхойлогддог. Хэлний зохиогчид нэг дамжлагатай хөрвүүлэгч ашиглан програмыг хялбархан хөрвүүлэхийг хүсч байсан бөгөөд эмхэтгэсний дараа програмын үндсэн бүрэлдэхүүн хэсэг бүр нь маш цөөн тооны машины заавартай тохирч, хэлний үндсэн элементүүдийн хэрэглээ тийм ч чухал биш байв. ажиллуулах цагийн номын сан оролцуулна. Нэг удаагийн хөрвүүлэгч нь аль хэдийн хөрвүүлсэн текст рүү буцахгүйгээр програмыг эмхэтгэдэг. Тиймээс функцийг ашиглахын өмнө түүний зарлал байх ёстой. Си кодыг бараг ассемблер хэл шиг хийсвэрлэлийн бага түвшинд амархан бичиж болно. C-г заримдаа "бүх нийтийн ассемблер" эсвэл "өндөр түвшний ассемблер" гэж нэрлэдэг бөгөөд энэ нь өөр өөр платформуудын ассемблер хэлний ялгаа, C стандартын нэгдмэл байдлыг тусгасан бөгөөд кодыг бараг ямар ч компьютер дээр өөрчлөхгүйгээр эмхэтгэх боломжтой. загвар. C хэлийг ихэвчлэн хэл гэж нэрлэдэг дунд түвшинэсвэл бүр доод түвшин, энэ нь бодит төхөөрөмжүүдэд хэр ойрхон ажилладагийг харгалзан үздэг.

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

    Хөтөлбөр "Сайн уу, Дэлхий!"

    Керниган, Ричи нарын The C програмчлалын хэлний анхны хэвлэлд гарсан энэхүү энгийн програм нь ихэнх Си хэлний сурах бичгүүдийн анхны программ юм. Тэр "Сайн уу Дэлхий!" стандарт гаралтын төхөөрөмж дээр (энэ нь ихэвчлэн монитор (дэлгэц) байдаг боловч өгөгдсөн платформ дээр стандарт гаралтын төхөөрөмж хэрхэн тусгагдсанаас хамааран файл, зарим төхөөрөмж эсвэл санах ойн хэсэг байж болно).

    Main() ( printf ("Сайн уу, Дэлхий! \n") ; }

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

    #оруулна int main(void ) ( printf ("Сайн уу, Дэлхий! \n"); буцаах 0 ; )

    Програмын эхний мөрөнд #include препроцессорын зааврыг агуулсан байдаг бөгөөд түүнтэй тулгарах үед хөрвүүлэгч түүнийг холбогдох файлын бүрэн текстээр сольдог. Энэ тохиолдолд энэ мөрийг стандарт толгой файлаар солих болно

    Дараагийн мөр нь main гэж нэрлэгддэг функцийн зарлал юм. Си програмын энэ функц нь програм эхлэхэд хамгийн түрүүнд хийгддэг, өөрөөр хэлбэл энэ нь тусгай функц юм. програмын нэвтрэх цэг.

    Үндсэн функцийн дараах буржгар хаалт нь түүний тодорхойлолтыг заана. int гэдэг үг нь үндсэн функц нь бүхэл тоог буцаадаг (тооцоодог) гэж хэлдэг. Хүчингүй гэсэн үг нь үндсэн функц нь дуудагчаас параметр эсвэл аргумент шаарддаггүйг харуулж байна.

    Дараагийн мөр нь stdio.h функцийг "дуудаж" эсвэл гүйцэтгэх ба функцийг хэрхэн дуудахыг тайлбарласан мэдээллийг агуулна. Энэ жишээнд "Сайн уу, Дэлхий!\n" текстийн мөрийг агуулсан ганц аргументыг энэ функцэд дамжуулсан. \n дараалал нь "шинэ мөр" тэмдэгт рүү хөрвүүлэгдэх бөгөөд энэ тэмдэгт гарч ирэхэд мөр тасрахыг илэрхийлнэ. printf функц нь энэ жишээн дээр бүрэн хасагдсан int утгыг буцаана.

    Буцаах мэдэгдэл нь програмыг өгөгдсөн функцийг гүйцэтгэхээ зогсооход хүргэдэг (энэ тохиолдолд гол), буцах түлхүүр үгийн дараа заасан утгыг дуудах функц руу буцаана (энэ тохиолдолд 0). Одоогийн функц нь main , учир залгагч нь програмыг эхлүүлсэн хүн юм. Сүүлчийн буржгар хаалт нь үндсэн функцийн тодорхойлолтын төгсгөлийг тэмдэглэнэ.

    Сэтгэгдэл

    Энэ дарааллаар /* ба */ тэмдэгтэнд хавсаргасан текстийг хөрвүүлэгч бүрэн үл тоомсорлодог. C99-д нийцсэн хөрвүүлэгчид //-ээр эхэлж, шинэ мөрөөр төгссөн тайлбарыг зөвшөөрдөг.

    Төрөл

    Өгөгдлийн хадгалалт

    Аливаа програмчлалын хэлний хамгийн чухал үүргүүдийн нэг бол санах ой болон түүнд хадгалагдсан объектуудыг удирдах чадварыг хангах явдал юм.

    Си хэл дээрх объектуудад санах ойг хуваарилах гурван өөр арга байдаг:

    • Статик санах ойн хуваарилалт: эмхэтгэх үед програмын кодын өгөгдөл хадгалах хэсэгт объектуудын орон зай үүсдэг; Ийм объектын ашиглалтын хугацаа нь энэ кодын ашиглалтын хугацаатай давхцаж байна.
    • Автомат санах ойн хуваарилалт: объектуудыг стек дээр түр хугацаагаар хадгалах боломжтой; Энэ санах ой автоматаар чөлөөлөгдөж, програмыг ашиглан блокоос гарсны дараа дахин ашиглах боломжтой.
    • Динамик санах ойн хуваарилалт: Хөтөлбөрийг гүйцэтгэх явцад malloc, realloc болон овоо гэж нэрлэгддэг санах ойн хэсгээс чөлөөтэй номын сангийн функцуудыг ашиглан хүссэн хэмжээтэй санах ойн блокуудыг хүсэх боломжтой. Эдгээр блокууд суллагдсан бөгөөд тэдгээрт байгаа үнэгүй функцийг дуудсаны дараа дахин ашиглах боломжтой.

    Мэдээлэл хадгалах эдгээр гурван арга нь өөр өөр нөхцөл байдалд тохиромжтой бөгөөд өөрийн давуу болон сул талуудтай. Жишээлбэл, статик санах ойн хуваарилалт нь хуваарилалтын нэмэлт зардалгүй, автомат хуваарилалт нь зөвхөн жижиг хуваарилалтын нэмэлт зардалтай байдаг, харин динамик хуваарилалт нь хуваарилалт болон хуваарилалтын аль алинд нь их хэмжээний нэмэлт зардалтай байж болно. Нөгөө талаас стек санах ой нь статик эсвэл овоолгын санах ойноос хамаагүй хязгаарлагдмал байдаг. Зөвхөн динамик санах ойг ашигласан объектын хэмжээ нь урьдчилан мэдэгдээгүй тохиолдолд л ашиглаж болно. Ихэнх Си програмууд эдгээр гурван аргыг бүгдийг нь ашигладаг.

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

    Ашигласан тэмдгийн багц

    Си хэл нь Fortran стандартыг нэвтрүүлсний дараа үүссэн; Lisp болон Cobol нь зөвхөн хаалт (), харин C нь хаалт (), дөрвөлжин, буржгар () байна. Нэмж дурдахад C нь том ба жижиг үсгүүдийг ялгадаг бол хуучин хэлүүд зөвхөн том үсгийг ашигладаг.

    Асуудлууд

    Олон C элементүүд нь аюултай байж болзошгүй бөгөөд эдгээр элементүүдийг буруугаар ашигласны үр дагаврыг урьдчилан таамаглах аргагүй байдаг. Керниган хэлэхдээ: " C бол сахлын хурц хэрэгсэл юм: энэ нь гоёмсог програм болон цуст эмх замбараагүй байдлыг бий болгоход ашиглаж болно." Хэлний түвшин харьцангуй доогуур байгаа тул аюултай элементүүдийн олон буруу хэрэглээг эмхэтгэх эсвэл ажиллуулах явцад илрүүлдэггүй бөгөөд илрүүлдэггүй. Энэ нь ихэвчлэн урьдчилан тааварлах боломжгүй програмын үйл ажиллагаанд хүргэдэг. Заримдаа хэлний элементүүдийг бичиг үсэггүй хэрэглэсний үр дүнд аюулгүй байдлын сул тал гарч ирдэг. Эдгээр олон элементүүдийг ашиглахаас зайлсхийх боломжтой гэдгийг тэмдэглэх нь зүйтэй.

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

    Аюултай нөхцөл байдлын өөр нэг эх сурвалж бол заагч механизм юм. Заагч нь санах ойд байгаа аливаа объект, түүний дотор гүйцэтгэгдэх програмын кодыг зааж өгөх боломжтой бөгөөд заагчийг буруу ашиглах нь урьдчилан таамаглах боломжгүй үр дагаварт хүргэж, гамшигт үр дагаварт хүргэдэг. Жишээлбэл, заагчийг эхлүүлээгүй эсвэл буруу заагчийн арифметик үйлдлийн үр дүнд дурын санах ойн байрлал руу зааж болно; Зарим платформ дээр ийм заагчтай ажиллах нь програмын техник хангамжийг зогсооход хүргэдэг; хамгаалалтгүй платформ дээр энэ нь санах ойд дур мэдэн өгөгдөлд эвдрэлд хүргэж болзошгүй бөгөөд энэ эвдрэл нь хамгийн дур зоргоороо, хамгийн сүүлд гарч ирдэг. авлига. Мөн заагчийг заасан динамик санах ойн хэсгийг чөлөөлж болно (түүний дараа өөр объектод хуваарилж болно) - ийм заагчийг "унжуулсан" гэж нэрлэдэг. Эсвэл эсрэгээр, динамик санах ойн талбарт заагчийг удирдсаны дараа лавлагаа үлдэхгүй байж магадгүй бөгөөд дараа нь "хог" гэж нэрлэгддэг энэ хэсэг хэзээ ч чөлөөлөгдөхгүй бөгөөд энэ нь програмын "санах ой алдагдахад" хүргэж болзошгүй юм. Бусад хэлүүд илүү хязгаарлагдмал лавлагааны төрлүүдийг нэвтрүүлэх замаар ижил төстэй асуудлыг шийдвэрлэхийг хичээдэг.

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

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

    Хувьсах аргумент функцууд нь асуудлын боломжит эх үүсвэр болдог. Прототиптэй энгийн функцүүдээс ялгаатай нь стандарт нь хувьсах тооны аргумент бүхий функцүүдийн туршилтыг зохицуулдаггүй. Хэрэв буруу өгөгдлийн төрлийг дамжуулсан бол урьдчилан таамаглах аргагүй, хэрэв үхэлд хүргэхгүй бол үр дүн гардаг. Жишээлбэл, C стандарт номын сангийн printf гэр бүлийн функцууд нь форматлагдсан текстийг гаралтад гаргахад ашигладаг бөгөөд энэ нь форматын мөрөөр тодорхойлогддог аюултай хувьсагч аргумент интерфэйсээрээ алдартай. Вариадик функцүүдийн төрлийг шалгах нь вариадик функц бүрийн хэрэгжилтийн үүрэг боловч орчин үеийн олон хөрвүүлэгчид printf дуудлага бүрийн төрлүүдийг тусгайлан шалгадаг бөгөөд аргументуудын жагсаалт нь форматын мөртэй таарахгүй үед анхааруулга үүсгэдэг. Програмд ​​форматын мөрийг динамикаар үүсгэж болох тул хэвлэгч нь дүрмээр бол хувьсах дугаар бүхий бусад функцийг шалгахгүй байх тул printf функцийн бүх дуудлагыг статик байдлаар хянах боломжгүй гэдгийг тэмдэглэх нь зүйтэй. аргументуудын.

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

    Өгүүллэг

    Эрт үеийн хөгжил

    Си програмчлалын хэлийг 1973-1973 оны хооронд Bell Labs-д боловсруулсан. Ричигийн хэлснээр, бүтээлч байдлын хамгийн идэвхтэй үе нь 1972 онд тохиосон. Энэ хэлийг "С" (С нь латин цагаан толгойн гурав дахь үсэг) гэж нэрлэдэг байсан, учир нь түүний олон шинж чанар нь хуучин "B" хэлнээс гаралтай (В нь Латин цагаан толгойн хоёр дахь үсэг). Би нэрийн гарал үүслийн талаар хэд хэдэн хувилбар байдаг. Кен Томпсон програмчлалын хэлийг зааж байна

    С-ийн хөгжлийн шалтгаан, үйлдлийн системтэй холбоотой хэд хэдэн домог байдаг, тухайлбал график дэлгэцийн хувьд;

  • зарим хөрвүүлэгчид анхдагч байдлаар ANSI C стандарт эсвэл түүний залгамжлагчийг дагаж мөрддөггүй; эсвэл
  • Эдгээр нь тодорхой төрлийн өгөгдлийн тодорхой хэмжээ эсвэл тухайн платформын санах ойд тухайн өгөгдлийг хадгалах тодорхой арга замыг багтаах зориулалттай.
  • C99

    Үндсэн нийтлэл: 1995 онд С стандартад анхны зохицуулалтын нэмэлт өөрчлөлт оруулсан боловч бараг хэн ч үүнийг хүлээн зөвшөөрөөгүй). Гэсэн хэдий ч 1990-ээд оны сүүлээр уг стандартыг шинэчилж, хэвлэн нийтлэхэд хүргэсэн ISO 9899:1999 1999 онд. Энэ стандартыг ихэвчлэн "C99" гэж нэрлэдэг. 2000 оны 3-р сард үүнийг ANSI баталж, тохируулсан.

    C99-ийн зарим шинэ боломжууд энд байна:

    • inline функцууд (дотор);
    • локал хувьсагчийг зарлахад хязгаарлалт байхгүй (C++ хэл дээрх шиг);
    • long long int (32-аас 64 битийн тоо руу шилжих шилжилтийг хөнгөвчлөх), тодорхой Boolean өгөгдлийн төрөл, нийлмэл тоог илэрхийлэх цогц төрөл зэрэг шинэ өгөгдлийн төрлүүд;
    • хувьсах урттай массив;
    • хязгаарлагдмал заагчийг дэмжих (хязгаарлах);
    • бүтцийн нэрлэсэн эхлүүлэх: struct ( int x, y, z; ) цэг = ( .y=10, .z=20, .x=30 );
    • // -ээр эхэлсэн нэг мөрт тайлбарыг дэмжих, C++-ээс зээлсэн (олон C хөрвүүлэгч үүнийг өмнө нь нэмэлт болгон дэмждэг байсан);
    • snprintf гэх мэт хэд хэдэн шинэ номын сангийн функцууд;
    • stdint.h зэрэг хэд хэдэн шинэ толгой файлууд.

    C99-ийн шинэ функцуудыг дэмжих сонирхол одоогоор холимог байна. GCC, Sun Microsystems-ийн C хөрвүүлэгч болон бусад хэд хэдэн хөрвүүлэгчид одоогоор C99-ийн шинэ функцүүдийн ихэнхийг дэмждэг бол Microsoft-ын хөрвүүлэгчид дэмждэггүй бөгөөд хоёр компани эдгээрийг нэмж оруулахгүй байгаа бололтой.

    C++-ийн холболт

    C дахь үйл ажиллагааны тэргүүлэх чиглэл

    Үйлдлүүдийг тэргүүлэх ач холбогдолын буурах дарааллаар доор жагсаав. Нэг мөрөнд жагсаасан үйлдлүүд нь ижил ач холбогдолтой. R->L гэж тэмдэглэгдсэн үйлдлүүд нь зөв холбоо юм (өөрөөр хэлбэл хаалтгүйгээр ижил ач холбогдолтой үйлдлүүдийг хослуулахдаа баруунаас зүүн тийш үнэлдэг; гэхдээ ихэнх үйлдлүүдийн аргументуудыг үнэлэх дарааллыг тодорхой заагаагүй бөгөөд хэрэгжилтээс хамаарна. ):

    Postfix үйлдлүүд () . -> ++ --
    Нэгдмэл үйлдлүүд (R->L) ++ -- & * + - ~ ! sizeof(төрөл)
    Үржүүлэх * / %
    Нэмэлт + -
    Хяргах << >>
    Үйл ажиллагааны харьцуулалт < > <= >=
    Тэгш байдлыг шалгах үйл ажиллагаа == !=
    Битээр & ^ |
    тархины тоглоом && ||
    Нөхцөлт ажиллагаа (R->L) ?:
    Даалгаврын үйлдлүүд (R->L) = *= /= %= += -= <<= >>= &= ^= |=
    Дараалсан тооцоолол ,

    Алдартай C хөрвүүлэгчид

    • OpenWatcom

    Динамик хэл, платформд зориулсан хөрвүүлэгч

    Заримдаа Си хэл дээр бичигдсэн зарим номын сан, функц, хэрэгслийг өөр орчинд шилжүүлэхийн тулд С кодыг дээд түвшний хэл рүү эсвэл ийм хэлэнд зориулагдсан виртуал машины код руу хөрвүүлэх шаардлагатай болдог.

    Дараахь төслүүд нь эдгээр зорилгоор зориулагдсан болно.

    • Alchemy нь Flash болон Adobe AIR програмуудад зориулсан C/C++ хөрвүүлэгч юм.
    • AMPC - Виртуал машинд зориулсан C хөрвүүлэгч

      Тэмдэглэл

      бас үзнэ үү

      • Циклон (програмчлалын хэл) - Си хэлний найдвартай аялгуу
      • Ангилал:C эмхэтгэгчид

      Холбоосууд

      • ISO/IEC JTC1/SC22/WG14 албан ёсны гэр (Англи) . - Си програмчлалын хэлний стандартчиллын олон улсын ажлын хэсгийн албан ёсны хуудас. 2009 оны 2-р сарын 20-нд авсан.