Ce este un compilator?
Sursă imagine: Suzanne D. Williams on Unsplash

Ce este un compilator? Ce anume trebuie să compileze? În lumea calculatoarelor, procesul de compilare (al unui compilator) este extrem de important!

Un compilator transformă codul sursă scris într-un limbaj de programare (high-level programming language) în cod mașină (fișier executabil).

Exemple de limbaje de programare care trebuie compilate: C, C++, Objective-C, Kotlin, Rust, Swift.

Până aici e totul clar? Deci un compilator este un program (sau o tehnologie?!) care transformă codul sursă în cod mașină. Codul sursă este scris de om, iar codul mașină este înțeles (doar) de calculator.

Specificare: compilatorul este doar un program care va analiza, pregăti, rula și transforma codul scris de către programator; în niciun caz nu va repara codul… Oricum, dacă găsește o eroare, programul nu va rula cu succes.

Etapele compilării:

  1. Analiza lexicală;
  2. Analiza sintactică;
  3. Optimizarea codului;
  4. Generarea codului mașină.

Nu vreau să intru în detalii cu etapele compilării, nici măcar să intru în amănunte cu tipurile de compilatoare. Subiectul ăsta este unul destul de complex, iar momentan sunt bune informațiile care să întărească răspunsul la întrebarea titlului, să fie mai mult de bază și foarte ușor de înțeles.

Iau doar primele 2 etape ale compilării.

Analiza lexicală

Ce se întâmplă la analiza lexicală? Se analizează caracterele introduse de către programator sau cuvintele folosite.

Hai să analizăm un pic linia următoare de cod: suma = unu  + 2;

Ce avem aici? O variabilă cu numele suma, căreia i se atribuie valoarea variabilei unu la care se adaugă cifra 2.

Compilatorul citește fluxul de caractere și generează jetoane lexicale. Pentru linia de cod „suma = unu + 2;” avem următoarea analiză:

  • variabila suma
  • semnul egal
  • variabila unu
  • simbolul +
  • literalul 2 (număr întreg)
  • finalul liniei de cod prin „punct și virgulă” (vezi articolul „Pune punct și virgulă!”)

Ce zici? Doar analizează fiecare simbol și grup de caractere introdus…

Analiza sintactică

Ce facem la analiza sintactică? Parcă sună un pic a ceva mai complicat… Ți-a plăcut gramatica la Limba și Literatura Română? Nu răspunde…

Acum suntem în faza când totul trebuie să facă sens. Luând din nou acea linie de cod, în analiza sintactică ne vom lovi deja de 2 probleme:

  1. Identificatorul suma nu este declarat (sau poate că a fost, dar noi nu știm și primim eroare la compilare);
  2. Identificatorul unu nu este declarat (din nou scriu că poate a fost declarat, dar la noi în cod nu apare, deci primim o a doua eroare la compilare).
  3. Să nu mai scriu nimic despre faptul că se utilizează variabila unu fără a fi inițializată?

Istoric

Ca și scurt istoric, e bine să știi faptul că primul compilator este atribuit doamnei Grace Hopper (1952). Prima propunere de programare automată a fost a lui Heiz Rutishauer (1951). Programarea automată se referea la transformarea codului sursă a limbajelor de programare de „nivel înalt” în cod mașină. Se spune că Alick Glennie a oferit lumii primul compilator adevărat operabil pe un calculator (1952).

Ce facem cu atâtea neclarități? Păi să știi măcar că pe la începutul anilor ’50 a apărut primul compilator. Dacă se poate, reține și numele Grace Hopper, Heiz Rutishauser și Alick Glennie (care a lucrat cu Alan Turing).

Liviu Negrescu a creat primul compilator românesc pentru calculatorul DACICC-200 de la Cluj (1968). Compilatorul s-a numit DACICC-FORTRAN, a fost scris în limbajul de programare FORTRAN și genera programe obiect în două moduri: în octal sau în binar. N-am scris până acum de fișiere obiect…

De reținut

Ce trebuie să reții din aces articol care deja este unul destul de stufos? Compilatorul transformă codul sursă în cod mașină (sau chiar în bytecode sau alt limbaj de programare… e bine să știi asta).

Bineînțeles că tot ce am scris este important…

Trebuie să ții minte că un compilator transformă codul în timpul de compilare (compile time). Un compilator este diferit de un interpretor. Vezi aici ce înseamnă un interpretor.

Există doi termeni foarte faini în programare pe care trebuie să-i cunoști și să-i înțelegi neapărat: timpul de compilare (compile time) și timpul de rulare (runtime).

  • Timpul de compilare (compile time) este atunci când codul sursă este convertit în cod mașină (fișier executabil).
  • Timpul de rulare (runtime) este atunci când rulează programul și până se termină (runtime apare imediat după compile time).

Chestii mai complicate

Compilatorul generează și fișiere obiect, nu doar fișiere executabile. Aceste fișiere obiect trebuie legate printr-un program numit linker.

Pe lângă compilator, există și alte programe care contribuie la producerea codului mașină sau a fișierului executabil:

  • preprocesor;
  • asamblator;
  • linker;
  • loader.

Dacă tot suntem la chestii complicate, e bine să știi că fișierele executabile au extensia .exe la Windows și .app la macOS.

Unele compilatoarea convertesc codul sursă într-un alt limbaj de programare. Ele se numesc transcompilatoare (fără a face aluzie la comunitatea ciudățeilor din LGBTQIA2S+).

Concluzie

Compilatorul transformă codul sursă în cod mașină (sau chiar în bytecode sau alt limbaj de programare).

Învață să fii profesionist!


Sursă imagine: Suzanne D. Williams on Unsplash

By projava

#JAVA

Abonează-te
Primește notificări pentru
guest
0 Comentarii
Păreri...
Vezi toate comentariile