Cum funcționează

Compilatorul: cum devine codul scris de oameni un program

Cum ajunge codul scris de un programator să ruleze pe procesor: compilator, interpretor, cod mașină, bytecode și de ce unele programe sunt mai rapide.

De Publicația LumeaTehnologiei5 min de citit
Cod sursă colorat afișat pe un monitor de calculator, în prim-plan, într-un editor de programare
Cuprins 6 secțiuni

Compilatorul este programul care traduce codul scris de un om, într-un limbaj de programare, în instrucțiunile binare pe care le înțelege procesorul. Un programator scrie text ușor de citit, de exemplu suma = a + b, dar procesorul nu poate rula direct așa ceva: el înțelege doar șiruri de 0 și 1 care codifică operații foarte simple.

Traducerea aceasta este unul dintre pașii care transformă ideile în aplicații. Mai jos vezi ce înseamnă cod sursă și cod mașină, cum diferă un compilator de un interpretor, ce este bytecode-ul și de ce unele programe se instalează ca fișiere gata de rulat, iar altele cer un program ajutător.

De ce are nevoie procesorul de o traducere?

Procesorul execută numai instrucțiunile din setul lui propriu, scrise în cod binar, numit cod mașină. Fiecare instrucțiune este foarte mică: mută un număr, adună două valori, compară, sare la altă instrucțiune. Cum funcționează aceste operații la nivelul componentei fizice e explicat în articolul despre procesor.

Scrisul direct în cod mașină ar fi epuizant și plin de greșeli. De aceea oamenii folosesc limbaje de nivel înalt, cu cuvinte și reguli apropiate de gândirea umană, iar traducerea o fac programe specializate. Acest strat de traducere permite ca același cod să poată rula pe procesoare diferite, dacă există un traducător potrivit pentru fiecare.

Cum lucrează un compilator?

Un compilator citește tot codul sursă și îl transformă într-un fișier executabil, înainte ca programul să ruleze. Rezultatul este cod mașină gata de folosit, pe care utilizatorul îl pornește fără să mai aibă nevoie de codul original sau de compilator.

Munca lui trece prin câteva etape:

  1. Analiza lexicală: textul este împărțit în unități, de pildă cuvinte-cheie, nume și numere.
  2. Analiza sintactică: se verifică dacă unitățile respectă regulile limbajului, la fel ca într-o gramatică.
  3. Analiza semantică: se verifică sensul, de exemplu dacă nu aduni un număr cu un text.
  4. Optimizarea: se rescrie codul intern ca să ruleze mai repede sau să ocupe mai puțină memorie.
  5. Generarea codului: se produce cod mașină pentru procesorul țintă.

Dacă o regulă este încălcată, compilatorul oprește procesul și afișează o eroare de compilare, cu locul unde a apărut problema. Aceasta este cauza pentru care un program cu greșeli de scriere nu pornește deloc. Limbaje precum C, C++, Rust și Go sunt de obicei compilate.

Cum lucrează un interpretor?

Un interpretor citește codul și îl execută pe loc, instrucțiune cu instrucțiune, fără să producă în prealabil un fișier executabil. Programul nu există ca cod mașină separat; interpretorul îl traduce și îl rulează în același timp, de fiecare dată când este pornit.

Avantajul este flexibilitatea: poți modifica codul și îl rulezi imediat, fără pasul de compilare, ceea ce face dezvoltarea rapidă. Dezavantajul este viteza, pentru că traducerea se repetă în timpul rulării. Python și JavaScript sunt exemple clasice de limbaje interpretate, deși implementările moderne folosesc și tehnici de accelerare.

Tastatură de calculator și caiet deschis așezate pe un birou, loc de lucru al unui programator

Ce este bytecode-ul și compilarea la momentul rulării?

Multe limbaje combină cele două metode: codul este tradus într-o formă intermediară, numită bytecode, apoi executat de o mașină virtuală. Bytecode-ul nu este specific unui procesor anume, deci același program poate rula oriunde există o mașină virtuală potrivită.

Java funcționează așa: codul devine bytecode, iar mașina virtuală Java îl rulează pe orice sistem. Pentru a recupera viteza, multe astfel de sisteme folosesc compilarea la momentul rulării (Just-In-Time, JIT): părțile executate des sunt traduse în cod mașină pe loc și păstrate pentru următoarele utilizări.

MetodăCând se face traducereaViteză la rulareFlexibilitate
Compilare completăînainte de rularefoarte maremai mică, trebuie recompilat
Interpretareîn timpul rulăriimai micămare
Bytecode + JITparțial înainte, parțial în timpul rulăriimare, după încălzirebună

Ce vezi în viața de zi cu zi din toate acestea?

Programele care folosesc criptarea sau funcțiile hash sunt tot cod compilat sau interpretat, doar că operațiile lor se bazează pe matematică. Fișierele cu extensia .exe din Windows sau aplicațiile instalate pe telefon sunt, în general, rezultate ale compilării, deci conțin instrucțiuni gata de rulat. De aceea o aplicație compilată pentru un telefon cu un anumit tip de procesor nu pornește direct pe altul, dacă nu există o versiune adaptată sau un strat de emulare.

Paginile web sunt un caz diferit: codul JavaScript este livrat ca text și interpretat sau compilat de browserul tău, la fiecare vizită. Din acest motiv, un site încarcă mai greu când trebuie să descarce și să proceseze mult cod. Aplicațiile care vorbesc între ele prin interfețe precise, descrise în articolul despre API-uri, se bazează tot pe cod compilat sau interpretat undeva, pe un server.

Sfat: dacă începi să înveți programare, nu te teme de mesajele de eroare. Ele sunt felul în care compilatorul sau interpretorul îți spune exact unde nu a înțeles ce ai scris.

Imaginea de ansamblu, de la un bit la o aplicație întreagă, o găsești în ghidul despre tehnologia digitală. Iar atunci când aplicațiile ajung să fie recompilate și trimise pe sute de milioane de dispozitive, actualizările de software sunt mecanismul prin care corecțiile ajung la utilizatori.

Întrebări frecvente

Care este diferența dintre compilator și interpretor?

Compilatorul traduce tot programul înainte de rulare și produce un executabil. Interpretorul traduce și execută codul pe parcurs, de fiecare dată când este pornit.

Este un limbaj compilat mereu mai rapid?

De obicei da, pentru că traducerea se face o singură dată. Totuși, tehnicile moderne de compilare la rulare reduc mult diferența pentru multe limbaje interpretate.

Ce este codul sursă?

Este textul scris de programator într-un limbaj de programare. Poate fi citit și modificat de oameni, spre deosebire de codul mașină, care este destinat procesorului.

De ce un program pentru Windows nu merge pe telefon?

Pentru că a fost compilat pentru alt procesor și alt sistem de operare. Instrucțiunile și funcțiile sistemului nu coincid, deci e nevoie de o versiune adaptată.

Poate un om să citească codul mașină?

Tehnic da, folosind un dezasamblor care îl arată ca instrucțiuni simple, dar este foarte greu de urmărit la programe mari. Codul sursă original este mult mai ușor de înțeles.

↑