Alisher navoiy nomidagi samarqand davlat universiteti mexanika-matematika fakulteti
Download 1.68 Mb. Pdf ko'rish
|
c tili kompilyatorlari va ularning xususiyatlari
- Bu sahifa navigatsiya:
- Delete
- System
- Kompilyator
- IDE(integrallashgan ishlovchi muhit)
- Visual C++
- Microsoft Visual C++
- GNU Compiler Collection(GCC)
- C++, Objective-C, Java, Fortran va Ada
- // Ushbu klass bolakni ifodalash uchun public class Token {
Kontekst menyu oynasi.
Komponentalar palitrasini asosiy menyu panelidan olib tashlash mumkin. Buning uchun sichqonchaning o’ng tugmasini bosish va hosil boigan menyu (20.23- rasm)dagi Component Palette so‘zi oldidagi belgini sichqoncha tugmasini ikkita bosib, olib tashlash kifoya qiladi. Komponentalar palitrasining o'rni Borland C + + Builder 6 interfeysida qat’iy tayinlanmagan. Uni o'zimiz xohlagancha joylashtirishimiz mumkin. Buning uchun kursorni palitraning chap chekkasiga olib borib, sichqonchaning chap tugmasini bosib, qo‘yib yubormagan holda, yangi joyga joylashtirish mumkin. Agar palitra asosiy menyudan tashqariga chiqib ketsa, yangi oyna ochiladi. Bunda komponentalar palitrasiga qo‘shimcha buyruqlar kiritish uchun sichqonchaning o‘ng tugmasi bosiladi. Bunda kontekst menyu paydo boladi (20.24-rasm). Bu oynada ixtiyoriy sahifaga Tabs vositasida tez o’tish imkoniyati mavjud (20.25-rasm). ShowHints tushuntish ma'lumotlari beriladi. Hide palitrani bekitish, Help ma’lumotlarni olish, yordamni chaqirish, Properties xususiyatlarni o‘rnatish Bu oynada ixtiyoriy sahifani qaytadan ko'rib chiqish mumkin. Rename buyrugi orqali sahifani qayta nomlash mumkin. Add buyrug’i orqali yangi sahifa qo‘shish mumkin. Delete ixtiyoriy sahifani о chirish mumkin. Bu sahifalarning berilish ketma-ketligini o'zgartirish imkoniga egamiz. Masalan,
aktivlashtiramiz va sichqonchaning chap tugmasini bosamiz. MoveUp buyrug'i orqali Standard dan tepaga joylashtiramiz va OK ni bosamiz. Endi System sahifasi Standard, sahifasidan oldin joylashgan boiadi. Xuddi shuningdek, komponentalarning MoveUp va MoveDown buyruqlari, joylashish ketmaketligini o'zgartirish mumkin. Forma dizavneri Forma dizayneri ilovaning interfeysidagi vizual komponentalarni ifodalash uchun xizmat qiladi (20.26-rasm).
Forma dizayneri. Form dizayner sarlavhasi Formaning chap yuqori qismida (C++Form 1) berilgan. Formaning o’ng yuqori qismida standart oynani berkituvchi va kichiklashtiruvchi buyruqlar piktogrammasi joylashgan.
Dasturlardan foydalanib, biror ish bajarish va shu orqali natija olish, unchalik qiyin jarayon emas. Bir marotaba ko‘rib olgan inson, keyingi safar o‘zi bajara
oladi. Ko‘pchilik adashtiradigan narsa,
bu foydalanuvchi dasturchi deyilmaydi, faqatgina dastur foydalanuvchisi bo‘ladi xolos. Dasturchi, foydalanuvchilar foydalanishi uchun dastur yaratadi va bu jarayon juda murakkab hisoblanadi. Dasturchilik bilan shug‘ullanishni endi boshlagan yoshlar ko‘p qiyinchiliklarga duch kelishadi. Bu qiyinchiliklar asosan terminlarning tushunmasligidan kelib chiqadi. Bu maqolamda dasturlashning eng kerakli termini hisoblangan interpretator vakompilyator haqida yozib o‘taman. Dasturlash jarayonida dasturchi o‘z dasturini yaratish uchun xar hil turdagi kodlar yozadi. Kodlarnining qanday bo‘lishi qaysi dasturlash tilidan foydalanib, dastur tuzishga bog‘liq bo‘ladi. Dasturlash tillaridan C, C++, Java,… .Yozilgan kodlarni kompyuter tushunmaydi, kompyuter tushunishi uchun uchun bu kodlarni kompyuter tushunadigan tilga o‘zgartirish lozim. Mana shu vaziyatda yuqoridagi 2 ta termin kerak bo‘ladi(kompilyator yoki interpretator). Kompyuter faqatgina raqamli kodlarni tushunadi, ya’ni 0 yoki 1. Bu 2 son orqali dastur tuzish juda qiyin hisoblanadi(manimcha bunday sonlar orqali dastur tuzuvchilar sanoqli bo‘lsa kerak). Shuning uchun, insonlar tushunadigan qilib dasturlash tillari yaratilgan. Ketma-ketlikni tushungandursiz, dasturchi dasturlash tillari orqali kodlar yozadi va bu kodlar kompyuter tushunadigan 0 va 1 sonlariga almashtiriladi va dastur kompyuterda ishlaydi, bu jarayonni kompilyator yoki interpretator amalga oshirib beradi.
kodlarni birdanigaob’yektli kodga o‘zgartirib beradi. Ob’yektli kodni yana ikkilik kod yoki mashina kodideb ham atashadi. Keyinchalik bu ob’yektli kod kompyuterda to‘g‘ridan to‘g‘ri ishlatilishi mumkin bo‘ladi. Dasturlash tillarida yozilgan kodlar bu ob’yektli kodga ta’sir qilmaydi. Ob’yektli kodni o‘zgartirish uchun esa, qaytadan kompilyatsiya qilinib ob’yektli kod o‘zgartiriladi. Natija bajariladigan, .exe ko‘rinishidagi fayl bo‘ladi. Bu faylni bloknotda ochib o‘zgartirib bo‘lmaydi, ya’ni bu fayl tayyor dastur hisoblanadi. Kompilyatorning kamchiligi sifatida, dasturlash tilidagi ma’lum bir qatorlani alohida tekshirish imkoniyati yo‘qligidir, uning uchun ob’yektli kod yaratib, uni ishga tushurish lozim bo‘ladi, ortiqcha ish bo‘lib qoladi. Undan tashqari ba’zi kompilyatorlar bir dasturlash tilidan, ikkinchisiga ham o‘zgartirib berishi mumkin. Kompilyator ishlatadigan dasturlash tillariga C, C++, Delphi larni misol qilib keltirish mumkin.
kompyuter tiliga o‘zgartirib berish vazifasini bajaradi, faqatgina ishlash texnologiyasi boshqacharoqdir. Interpretator, dasturlash tilida yozilgan kodlarni ketma — ket o‘qib, mashina tiliga o‘zgartirib boradi. Xatolik paydo bo‘lsa, o‘sha zahoti dasturchiga ma’lum qiladi. Bu ketma — ketlikda o‘zgartirish, kompilyatorga nisbatan sekinroq amalga oshiriladi(ba’zi holllarda kompilyatorga qaraganda 50 barobar sekin). Dastur natijasini ko‘rish uchun, har safar kodlarni interpretatordan o‘tkazish kerak bo‘ladi(kompilyatorga o‘xshab bir marotaba ob’yekt kod yaratib qo‘yib, keyin har doim ishlatishning iloji yo‘q). Bundan ko‘rinib turibdiki, interpretator asosan saytlar, umumiy holda veb dasturlashda ishlatiladi. Biror saytning yuklanishi jarayni uzunligi, interpretatorda o‘zgartirish amalga oshirilishi bilan tushuntirilishi mumkin. Interpretator ishlatadigan dasturlash tillariga PHP, JavaScript, JScript, Basic,… misol bo‘la oladi. Bu ikki termin umumiy holda translyator deyiladi, ya’ni o‘zgartirgichlardir. Biror proyektlar qilganda bu 2 o‘zgartirgichlar birgalikda ham ishlatilishi mumkin. Biror dasturlash tili bilan jiddiy shug‘ullanmoqchi bo‘lsangiz, dastlab siz yozadigan kodlar qay tarzda kompyuter tiliga o‘zgartirilishini o‘rganib oling. Bu dasturlashning asosi hisoblanadi. Dasturlash tillari bilan shug‘ullanadigan dasturchilar ba’zi bir terminlar bilan juda ko‘p to‘qnash kelishadi. C++ dasturlash tili ham bundan mustasno emas. Oldin shu haqida, undan so‘ng esa C++ ni ishlatish uchun nimalar kerakligini ko‘rib chiqamiz. Demak terminlarni ko‘rib chiqamiz: Kompilyator – bu o‘zgartirish degan ma’noni beradi. Ya’ni dasturlash tilida yozilgan dastur(C++ bo‘lsa, *.c, *.cpp)ni kompyuter tushunadigan tilga o‘zgartirib, uni ishlashini ta’minlaydi. Bu degani dastur kompyuterda to‘liq ishlaydi. Bundan ko‘rinib turibdiki, C++ da dastur tuzish uchun kompilyator o‘rnatish zarur. Linux operatsion tizimida kompilyator o‘rnatilgan bo‘ladi(GCC, G++). Kompilyatsiya – o‘zgaruvchi jarayon, ya’ni yuqori pog‘onali dastur kodlari(misol uchun C++ da tuzilgan kod)ni quyi pog‘onali ishlovchi kodga aylantirish jarayoni.
ob’yekt fayllarni to‘plab yagona ishlovchi modulga aytiladi. IDE(integrallashgan ishlovchi muhit) – Har bir dasturlash tilida o‘z ishchi muhiti bo‘ladi. Bu muhitda kompilyator bilan birga kod yozishga mo‘ljallangan joy bo‘ladi. Bu ishchi muhitda bir necha dastur kodlarini ham yozsa bo‘ladi va bu muhit avtomat xatolarni ham ko‘rsatib beradi. Bu ishchi muhitda ma’lum kutubxonalar joylashgan bo‘lib, kod yozishda kodni to‘g‘ri tashkil qilish uchun ma’lum bir yordamlar ekranga chiqadi. Ishchi muhitga oddiy bloknot misol bo‘ladi, lekin bu muhitning kompilyatori yo‘q, shuning uchun alohida kompilyator o‘rnatiladi. Bunda 2 ta dastur o‘rnatib bir biriga moslashtirish kerak bo‘ladi. Bu 2 ishni yengillashtirish uchun, juda ko‘p ishchi muhit dasturlari yaratilgan va ular kompilyatorlar bilan integrallashgan bo‘ladi. C++ dasturlash muhitida eng keng tarqalgan IDE bu – Visual
bo‘lgan .NET klasslari, ishchi muhit va albatta kompilyator integrallashtirilgan bo‘ladi. Quyida hozirgi zamonda eng ommabop bo‘lgan C++ muhitlari va kompilyatorlari ro‘yxatini keltirib o‘taman.
muhiti.
Bu distributivga MinGWnomli kompilyator kiradi.
Bu dastur
o‘zi Delphi dasturlash tilida tuzilgan. GPL litsenziyasi orqali tarqatiladi. Bir paytlar Linux versiyasi ham mavjud edi, hozir faqat Windows. Hozir yangi versiyalari ishlab chiqilmayapti, uning o‘rniga wxDev-C++ nomi bilan ishlab chiqilmoqda. C++ Builder – C++ dasturlash tili uchun mo‘ljallangan integrallashgan dasturlash muhiti hisoblanadi. DastlabBorland Software korxonasi tomonidan ishlab chiqilgan, undan so‘ng uning bir qismi bo‘lgan CodeGeartomonidan. C++ Builder STL, VCL, CLX, MFC ob’yekt kutubxonalarini o‘z ichiga oladi. Delphi dasturlash tili tomonidan ishlab chiqilgan. Bu muhit drag-and-drop harakati bilan vizual shaklni paydo qilishi mumkin, undan tashqari WYSIWYG redaktori ham mavjud.
mo‘ljallangan muhit bo‘lib, Borland firmasi tomonidan ishlab chiqilgan. Muhitning har bir versiyasi ma’lum bir dasturlash tili standarti asosida ishlovchi
kompilyator bilan integrallashgan holda chiqarilgan. Dastlab, DOS operatsion tizimi muhitida ishlovchi dasturlarni yaratish uchun, keyinchalik Windows muhitida ishlovchi dasturlarni yaratish uchun mo‘ljallangan versiyada ishlab chiqildi. Microsoft Visual C++ — Albatta Microsoft firmasi ham bekor turmadi. Mana shu muhitni yaratdi. C++ dasturlash tili uchun mo‘ljallangan va Microsoft Visual Studio ni bir qismi sifatida yoki o‘zi yakka Visual C++ Express Edition shaklida namoyon bo‘ldi. Microsoft QuickC muhitini almashtirish vazifasini bajardi. GNU Compiler Collection(GCC) – GNU proyekti asosida yaratilgan, xar hil turdagi dasturlash tillarining kompilyatorlar yig‘indisi hisoblanadi. Bu dastur ochiq hisoblanadi va dastlab faqat S uchun yaratilgan edi. Keyinchalik kuchayib C++, Objective-C, Java, Fortran va Ada dasturlash tillari uchun ham ishlab chiqildi. Hammamizga ma’lumki kompyuter yoki har qanday dastur bilan ishlovchi qurilmalar uchun dasturlar biror bir dasturlash tillarida yoziladi. Bunday tillar hozirda juda ko’p. C, C , Delphi, Ruby, Perl, Python, Java va shu kabi universal dasturlash tillaridan tashqari maxsus biror yo’nalish yoki platformaga mo’ljallangan tillar, skript tillar ham bir talay. Dastur tuzish uchun dastur tuzilayotgan qurilma ichki tuzilmasini hisobga olib yuqoridagi tillardan birida dastur matni yoziladi. So’ngra bu dastur ishlashi uchun dastur matnini u mo’ljallangan qurilmaning “tiliga”, ya’ni prosessor instruksiyalari (buyruqlari) ketma-ketligiga tarjima qilish kerak bo’ladi. Bu vazifani kompilyator dasturi bajaradi.
qoidalariga muvofiq mashina kodiga yoki oraliq kodga (p-kod, baytkod) tarjima qiluvchi dastur. Ushbu tarjima jarayoni kompilyasiya deyiladi. Agar kompilyasiya jarayonida dastur mashina kodiga tarjima qilingan bo’lsa, hosil bo’lgan kod o’sha qurilma/muhitda bevosita ishlayveradi. Agar dastur
oraliq kodga tarjima qilingan bo’lsa, u holda bu kodni ishlatish uchun Virtual Mashina kerak bo’ladi. Virtual mashina – oraliq kodda ifodalangan dasturni qadamlab mashina
kodiga tarjima
qiladi va
dasturni ishlatadi. Shu joyda “Oraliq kodga o’tkazishni nima keragi bor, dasturni to’g’ridan to’g’ri mashina kodiga o’girish yaxshimasmi?” degan savol tug’ilishi tabiiy. Oraliq kod birinchi navbatda dasturning kross platformaliligini (dastur o’zgarishsiz yoki qisman o’zgartirish orqali boshqa platformalarda ham ishlayverishga yaroqli bo’lsa bunday dastur kross platformali deyiladi) ta’minlaydi. Har bir platforma, OS o’zining ichki arxitekturasi jihatidan bir biridan farq qiladi, shunday ekan bir muhitga moslab yozilgan mashina tilidagi kod ikkinchi boshqa bir muhitda ishlamasligi tabiiy. Oraliq kodlarda yozilgan dasturlar huddi shu muammoni hal qilishda yordam beradi. Bunda oraliq kodni ishlatish uchun kerak bo’ladigan Virtual Mashina turli muhitlar, OS lar uchun mavjud bo’lsa yetarli, ya’ni har bir dasturni boshqa muhitga moslash shart emas, faqatgina Virtual Mashinani kerakli muhitlar uchun moslansa yetarli. Bundan tashqari oraliq kod dasturni tahlil qilish (debug) jarayonini yengillashtiradi ham. Oraliq kod hosil qiluvchi til kompilyatorlariga misol qilib, Java, Python, Ruby kabilarni keltirish mumkin. Xo’sh kompilyator qanday ishlaydi? Har qanday tillar o’zining grammatikasi yoki sintaksisiga ega bo’ladi. Masalan, o’zbek tilida to’g’ri yozilgan gapda kesim egadan keyin kelishi kabi qoida ham til sintaksisining bir bo’lagidir. Dasturlash tillarida ham tabiiy tillar singari o’zining qonun qoidalari bo’lishi tabiiy. Kompilyasiya jarayoni huddi shu qoidalarga asoslangan holda amalga oshiriladi. Erkin kontekstli dasturlash tillari uchun kompilyatorlar odatda asosan 3 bosqichdan iborat bo’ladi:
Sintatktik tahlil
Tarjima qilish Har bir bosqichni batafsil ko’rib chiqamiz. Leksik tahlil dastur matnini tilning alifbosiga mos ravishda bo’laklarga, “so’z”larga ajratish vazifasini bajaradi. Natijada identifikatorlar, literallar, bo’sh joylar, amallar va boshqa bo’laklar hosil bo’ladi. Masalan, deylik, o’zbek tiliga asoslangan qandaydir dasturlash tilida agar (i ko’rinishidagi matn tahminan quyidagicha bo’laklarga ajratiladi. 1
Agar 2
bo’sh joy (probel, tab belgisi yoki boshq.). Til alifbosida bo’sh joyni alohida vazifasi bo’lmasa, barcha bo’sh joylarni tushirib qoldirish mumkin. Va shunday qilamiz. 3 (
4 I Identifikator 5 < Amal
6 J Identifikator 7 ) Amal 8 bo’lsa
Identifikator 9 I Identifikator 10
= Amal
11 1 sonli literal 12 ; Ajratgich 13 dastur oxiri
Bo’laklash bosqichini dasturlash qiyin ish emas. Buning uchun har bir bo’lak qanday belgilar to’plamidan iboratligi, qaysi belgidan keyin qaysi belgi kelishi kabi belgilashlarlarni aniqlab olishimiz kerak. Shu joyda bir narsani aytib o’tish lozimki, hozirda agar biror bir kompilyator yozmoqchi bo’lsangiz uni 0 dan yozish ham shart emas. Bunda Sintaktik analizator (parserlar) va Kompilyatorlar kompilyatori kabi bir qancha tayyor dasturlardan foydalanish ishni ancha yengillashtiradi. Bu dasturlar kirishiga tilning formal yozuvdagi ko’rinishi berilsa, birinchi (leksik tahlil) va ikkinchi (sintaktik tahlil) qadamlarni avtomatik bajarib beradigan, qisman uchinchi bosqich (tarjima) ni ham bajaradigan kod hosil qilib beradi. Tilning formal yozuvi (grammar) deganda tilning alifbosi, qonun qoidalarini ko’rsatuvchi yozuvga aytiladi. Bu yozuv turlaridan biri Bekus-Naur yozuvidan keng foydalaniladi. Bekus-Naur yozuvida (aniqrog’i, uning kengaytirilgan variantlaridan birida) til alifbosi Belgilar to’plami, So’zlar va Qoidalar degan 3 ta element yordamida ifodalanadi. Belgilar to’plami bu biror bir So’z qanday belgilardan tashkil topishini bildiradi. Masalan Identifikator degan So’z A dan Z gacha lotin harflari, 0 dan 9 gacha raqamlar va “_” belgisidan iborat bo’lishi mumkin degan shart aynan Belgilar to’plami yordamida ko’rsatiladi. Belgilar to’plami: {Harflar} = ABCDEFGHIJKLMNOPQRSTUVWXYZ
{Raqamlar} = 0123456789 {Identifikator boshi} = {Harflar} [_] {Identifikator oxiri} = {Raqamlar} [_] Bu yerda {Harflar} nomli belgilar to’plami A dan Z gacha lotin harflaridan biridan iborat bo’lishi mumkinligi, {Raqamlar} esa 0 dan 9 gacha raqamdan biri ekanligi, {Identifikator boshi} esa {Harflar} dan va “_” belgisidan tuzilganligi va {Identifikator oxiri} esa {Raqamlar} va “_” belgisidan iborat ekanligi ko’rsatilyapti. Belgilar to’plamini berishda “ ” belgisi belgilar to’plamiga yangi belgini qo’shish, “-“ belgisi esa keraksiz belgini chiqarib tashlashni bildirishi mumkin. Identifikator boshi va oxiri deb ikkita bo’lakka bo’lishdan maqsad esa, identifikatorlar nomi faqat harf yoki “_” belgisidan boshlanishi mumkinligidan kelib
chiqdi. Belgilar to’plami qay tartibda kelishi So’zlarda ifodalanadi. Yuqoridagi belgilar to’plamidan foydalanib Identifikatorni qanday
berilishini ko’ramiz: Identifikator = {Identifikator boshi} {Identifikator oxiri}* Bu yerda “*” belgisi uning oldida kelgan belgilar to’plami yoki belgining 0 yoki undan ko’p marta, “ ” belgisi esa 1 yoki undan ko’p marta takrorlanishi mumkinligini ko’rsatadi (huddi Regular Ifodalardagi kabi). Yana misol: ButunSon = {Raqamlar} HaqiqiySon = {Raqamlar}* “.” {Raqamlar} MantiqiyQiymat = “rost” | “yolg’on” Qo’shtirnoq ichidagi belgi uni So’zda qanday bo’lsa shunday holicha kelishini, “|” belgisi esa
“yoki” amalini
bildiryapti. Va nihoyat So’zlarning qay tartibda kelishi Qoidalar yordamida beriladi: | “agar” ... | | | | | | ...
E’tibor bering, esa buyruqlarni ichma ich va ko’p marotaba qaytarilishini ifodalash uchun kerak bo’ladi. Ko’rinib turibdiki, bunday yozuvlardan foydalanib har qanday tilning sintaksisini, alifbosini bemalol ko’rsatish mumkin. Bekus-Naur yozuvidan tashqari yana bir nechta shu kabi tilni “qolipini” tushuntirishda qo’llaniladigan yozuvlar mavjud.
Keling, yuqorida berilgan til alifbosi uchun oddiy bo’laklash jarayonini dasturlashni ko’rib chiqamiz. Ya’ni, berilgan matnni Identifikator, ButunSon, HaqiqiySon, MantiqiyQiymat kabi bo’laklarga ajratuvchi dastur tuzamiz. Ushbu bosqich uchun Lexer nomli klassni yozamiz. Bunda bo’laklarni saqlash uchun Token nomli qo’shimcha klass ham kerak bo’ladi: // Ushbu klass bo'lakni ifodalash uchun public class Token { // mumkin bo'lgan bo'laklar turi |
ma'muriyatiga murojaat qiling