Kompilyator nədir?

Orijinal mənbə: https://guides.hexlet.io/ru/compiler/

Tərcüməçi: Emil Hüseynov

Bu məqalədə kompilyator nədir və o, necə işləyir sualına cavab tapacaqsınız.

Kompilyator nə üçün lazımdır?

Kompüterin "ürəyi" hesab edilən prosessor informasiyanı emal edir, istifadəçi əmrlərini icra edir və kompüterə qoşulmuş bütün qurğuların işinə nəzarət edir. Ancaq prosessor yalnız 0 və 1 maşın kodunu "başa düşür".

Nə üçün məhz 0 və 1? Prosessora elektrik siqnalları daxil olur. Güclü siqnal 1, 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.

Əvvəllər ilk kompüterlərdə proqram kodu yazmaq üçün perfokartlardan istifadə edirdilər. Perfokartdakı rəqəmlər növbə ilə bir neçə sətirdə yazılırdı. Proqramçı 1 maşın kodunu ona yazmaq üçün kartda dəlik açırdı. Dəliksiz yerlər isə 0-ı ifadə edirdi.

perfokart

Kompüter xüsusi qurğunun köməyi ilə perfokartı oxuyur və onda yazılmış əmri icra edirdi. Bir proqram üçün yüzlərlə perfokartdan istifadə edilirdi.

Onlarla işləmək çə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. Əmrlərin prosessor tərəfindən oxunması üçün proqram kodunu maşın koduna çevirən kompilyator hazırlandı.

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ılır və təhlil edilir, sonra prosessor tərəfindən "başa düşülən" kod generasiya edilir.

Aşağıda düzbucaqlının perimetrinin hesablanması nümunəsində kompilyasiya prosesinin mərhələlərinə nəzər salaq:

#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 icrasından sonra kompilyator onda hansı əmrlərin 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.

# include <iostream> int main ( ) { double a = 2.5 , b = 5 , P ;  P = 2 * ( a + b ) ; printf ( " Width of the rectangle - % 4.1 f " , a ) ; printf ( " \ n Length of the rectangle - % 4.1 f " , b ) ; printf ( " \ n Perimeter of the rectangle is % 4.1 f " ,   P ) ; return 0 ; }

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 bağlı 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ı kimi məntiqi ağaca çevriləcək:

məntiqi ağac

Bundan sonra hər bir ağacı əmrlərə ayırmaq və hər bir əmri maşın koduna çevirmək lazımdır. Kompilyator məntiqi ağacı aşağıdan yuxarı 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.

Sonralar yeni proqramlaşdırma dilləri üçün kompilyatorların yazılmasında "Fortran" dili və onun kompilyatorundan istifadə edilmişdir.

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 hazırlanmış ilk yüksək səviyyəli "Fortran" proqramlaşdırma dili insan üçün anlaşılan dildə proqram yazmağa imkan verdi. 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 yeni proqramlaşdırma dilləri üçün kompilyatorların yazılmasında "Fortran" dili və onun kompilyatorundan istifadə edilmişdir.

Hansı kompilyatorlar mövcuddur?

Bəzi kompilyatorlar bir neçə proqramlaşdırma dilini dəstəkləyir. Lakin proqramçı, həmçinin proqramın icra olunacağı kompüterin parametrlərini də nəzərə almalıdır.

Belə ki müasir prosessorlar bir-birindən fərqlənir, ona görə maşın kodu bir prosessor üçün "başa düşüləndir", digəri üçün isə yox. Bu, əməliyyat sistemlərinə də aiddir: "Windows" əməliyyat sisteminin idarəetməsi altında işləyən proqram "Linux" və ya "MacOS"da işləməyəcək. Buna görə lazımi prosessor və əməliyyat sistemi ilə işləyən kompilyatordan istifadə etmək lazımdır.

Əgər proqram bir neçə əməliyyat sistemində işləyəcəksə, onda universal maşın kodunu çevirən - kross-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 kompüterdə kompilyatorun olması barədə məlumatsızdırlar. Onlar proqram kodunu bir, bəzən də bir neçə kompilyatoru dəstəkləyən inteqrasiya olunmuş inkişaf mühitində (IDE) yazırlar. Bu zaman proqramçı deyil, mühit özü kompilyator seçimini edir. Məsələn, "MS Visual Studio" proqramı "Windows", "Linux" və "Android" əməliyyat sistemləri üçün kompilyatorları dəstəkləyir. "Visual Studio" proqramı layihənin tipinə uyğun olaraq kompüterin prosessor və əməliyyat sistemini müəyyənləşdirir və bundan sonra uyğun gələn 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 olunduqda istifadəçiyə səhv barədə məlumat verilir. Proqram tam 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. Səhvlər olduğu təqdirdə kompilyator prosessor üçün maşın kodunun yaradılması mərhələsinə 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 başlanğıc qiymətin 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 icra etmədən maşın koduna çevirən proqramdır. Bundan sonra proqram icra oluna bilər. İnterpretator isə proqram kodunu dərhal işə salır və oxuma prosesində onu icra edir.

Şərh yazmaq üçün hesabınıza daxil olun.

0
0