Kompilyator nədir?
- Kompilyator nə üçün lazımdır?
- Kompilyator necə işləyir?
- Kompilyator hansı dildə yazılıb?
- Hansı kompilyatorlar mövcuddur?
- Kompilyator hansı səhvləri aşkar edə bilər?
- Kompilyator interpretatordan nə ilə fərqlənir?
Bu məqalə kompüterdə proqram kodunun necə icra edilməsini daha yaxşı başa düşməyə kömək edəcək.
Kompilyator nə üçün lazımdır?
Kompüterin "ürəyi" hesab edilən prosessor informasiyanı emal edir, istifadəçinin əmrlərini icra edir və bütün qoşulmuş qurğuların işinə nəzarət edir. Lakin prosessor yalnız müəyyən ardıcıllıqla yazılmış maşın kodunu (0 və 1) təhlil edə bilər.
Nə üçün 0 və 1? Prosessora elektrik siqnalları daxil olur. Güclü siqnal 1 rəqəmi, zəif siqnal isə 0 rəqəmi ilə qeydə alınır. Belə rəqəmlər toplusu hansısa bir əmri ifadə edir. Prosessor onu "tanıyır" və icra edir.
Mühəndislər ilk kompüterlərdə proqram yazmaq üçün elastik karton kartlardan - perfokartlardan istifadə edirdilər. Perfokartda rəqəmlər növbə ilə yazılırdı. Proqramçı 1-i yazmaq üçün kartda dəlik açırdı. Dəliksiz yerlər isə 0-ı ifadə edirdi.
Kompüterə quraşdırılmış xüsusi qurğu perfokartı oxuyurdu və yazılmış əmri icra edirdi. Bir proqram üçün yüzlərlə perfokartdan istifadə edilirdi.
Onları yazmaq çox vaxt alırdı və çətin idi, buna görə mühəndislər əmrləri söz və simvollarla ifadə edən proqramlaşdırma dilləri hazırlamağa başlayırlar. Proqramda yazılmış əmrlərin prosessor tərəfindən oxunması üçün isə proqramçılar kompilyator (proqram kodunu maşın koduna çevirən proqram) hazırlayırlar.
Kompilyator necə işləyir?
Proqram kodunun maşın koduna çevrilməsi kompilyasiya adlanır. Kompilyasiya yalnız kodu çevirir, onu icra etmir. Bu, mürəkkəb prosesdir, əvvəlcə proqramın mətni hissələrə ayrılaraq təhlil edilir, sonra prosessor tərəfindən oxunula bilən kod yaradılır.
Düzbucaqlı dördbucağın perimetrinin hesablanması nümunəsində kompilyasiya mərhələlərini təhlil edək:
#include <iostream>
int main()
{
double a=2.5, b=5, P;
P = 2 * (a + b);
printf("Width of the rectangle - %4.1f", a);// => Width of the rectangle - 2.5
printf("\nLength of the rectangle - %4.1f", b);// => Length of the rectangle - 5.0
printf("\nPerimeter of the rectangle is %4.1f", P);// => Perimeter of the rectangle is 15.0
return 0;
}
Proqramın işə salınmasından sonra kompilyator onda hansı təlimatların yazıldığını müəyyənləşdirməlidir. Əvvəlcə kompilyator proqramı söz və simvollara (tokenlərə) ayırır və onları siyahıya yazır. Bu proses leksik təhlil adlanır.
Sonra kompilyator siyahını oxuyur və token-operatorları axtarır. Bu, mənimsətmə operatoru (=
), riyazi operatorlar (+
, -
, *
, /
), çapetmə operatoru (printf()
) və digər operatorlar ola bilər. Belə operatorlar rəqəm, mətn və dəyişənlərlə işləyir.
Kompilyator siyahıda token-operatorla əlaqəli olan tokenləri ayırd etməlidir. Bu məqsədlə hər bir operator üçün xüsusi struktur (məntiqi ağac və ya təhlil ağacı) tərtib edilir.
Məsələn, P = 2*(a + b)
əməliyyatı aşağıdakı məntiqi ağaca çevrilir:
İndi hər bir ağacı əmrlər üzrə təhlil etmək və hər bir əmri maşın koduna çevirmək lazımdır. Kompilyator ağacı aşağıdan yuxarıya doğru oxumağa başlayır və əmrlərin siyahısını tərtib edir:
a
dəyişənini oxudum,b
dəyişənini oxudum, onları cəmini hesabladım- Toplama əməliyyatının nəticəsini oxudum,
2
rəqəmini oxudum və onların hasilini hesabladım - Nəticəni
P
dəyişəninə mənimsətdim.
Kompilyator əmrləri yenidən yoxlayır, səhvləri tapır və kodu təkmilləşdirməyə çalışır. Bu mərhələ uğurla başa çatdıqdan sonra kompilyator hər bir təlimatı 0 və 1 rəqəmlərinə çevirir. 0 və 1 rəqəmlərindən ibarət instruksiyalar fayla yazılır, prosessor isə bu faylı oxuyur və icra edir.
10111011 00010001 00000001 10111001 00001101 00000000 10110100 00001110 10001010 00000111 01000011 11001101 00010000 11100010 11111001 11001101 00100000 01001000 01100101 01101100 01101100 01101111 00101100 00100000 01010111 01101111 01110010 01101100 01100100 00100001
Kompilyator hansı dildə yazılıb?
1950-ci illərdə IBM-də Con Bekusun rəhbərliyi altında çalışan proqramçılar qrupu tərəfindən işlənib hazırlanmış ilk yüksək səviyyəli "Fortran" proqramlaşdırma dili sayəsində proqramların insan üçün anlaşılan dildə yazılması mümkün olur. Mühəndislər, həmçinin kompilyator üzərində də işləyirdilər. Bu, digər Fortran proqramlarını, o cümlədən özünün təkmilləşdirilmiş versiyasını kompilyasiya edə bilən icra olunan əmrlər toplusundan ibarət proqram idi.
Sonralar "Fortran" dili və onun kompilyatoru yeni proqramlaşdırma dilləri üçün kompilyatorların yazılmasında istifadə edilmişdir.
Hansı kompilyatorlar mövcuddur?
Bəzi kompilyatorlar bir çox proqramlaşdırma dillərini dəstəkləyir. Lakin proqramçı, həmçinin proqramın işləyəcəyi kompüterin parametrlərini də nəzərə almalıdır.
Belə ki müasir prosessorlar bir-birindən fərqlənir, buna görə də bir prosessor maşın kodunu oxuya bilir, digəri isə yox. Bu, əməliyyat sistemlərinə də aiddir: "Windows" əməliyyat sisteminin (ƏS) idarəetməsi altında işləyən proqram "Linux" və ya "MacOS"da işləməyəcək. Buna görə də lazımi prosessor və əməliyyat sistemi ilə işləyən kompilyatordan istifadə etmək lazımdır.
Əgər proqramın bir neçə əməliyyat sistemində işləməsi nəzərdə tutulubsa, onda kross-kompilyator (universal maşın kodunu çevirən kompilyator) lazımdır. Məsələn, "GNU Compiler Collection" kompilyatoru "C++", "Objective-C", "Java", "Fortran", "Ada", "Go" proqramlaşdırma dillərini və müxtəlif prosessor arxitekturalarını dəstəkləyir.
Yeni öyrənməyə başlayan proqramçıların əksəriyyəti kompüterdə kompilyatorun olması barədə məlumatsızdırlar. Onlar proqramları bir, bəzən də bir neçə kompilyatora malik inteqrasiya olunmuş işlənmə mühitində yazırlar. Bu zaman kompilyatorun seçiminə proqramçı deyil, mühit qərar verir. Məsələn, "MS Visual Studio" proqramı "Windows", "Linux" və "Android" əməliyyat sistemləri üçün kompilyatorları dəstəkləyir. "Visual Studio" layihənin tipinə uyğun olaraq kompüterin prosessor və əməliyyat sistemini müəyyənləşdirir, bundan sonra isə müvafiq kompilyatoru seçir.
Kompilyator hansı səhvləri aşkar edə bilər?
Kompilyator proqramın mətnini təhlil edərkən operatorun yazılışının dilin standartlarına uyğunluğunu yoxlayır. Uyğunsuzluq aşkar edildikdə, kompilyator istifadəçiyə səhv barədə məlumat verir. Proqram bütünlüklə təhlil edildikdən sonra istifadəçi kodda tapılmış səhvlərin siyahısını görür və onlara düzəliş edə bilər. Proqramçı səhvləri düzəltmədiyi halda kompilyator növbəti mərhələyə (prosessor üçün maşın kodunun hazırlanmasına) keçmir. Çox vaxt kompilyator istifadəçiyə aşağıdakı səhvləri göstərir:
- dəyişənlərin səhv elan edilməsi və ya onların başlanğıc qiymətlərinin olmaması
- tiplərin uyğunsuzluğu səhvləri
- operator və funksiyaların səhv yazılışı
Kompilyator proqramın mətnini təhlil edərkən yalnız səhvləri axtarmır, həm də onun kodunu sadələşdirir. Bu proses optimallaşdırma adlanır. Optimallaşdırma zamanı kompilyator proqram kodunu dəyişir, lakin proqramın yerinə yetirdiyi funksiyalar olduğu kimi qalır.
Kompilyator interpretatordan nə ilə fərqlənir?
Kompilyator proqram mətnini onu işə salmadan, statik olaraq maşın koduna çevirən proqramdır. Bundan sonra proqram icra üçün işə salına bilər. İnterpretator kodu dərhal işə salır və onu oxuma prosesində icra edir.
Şərh yazmaq üçün hesabınıza daxil olun.