KULTUROSFERA

C++: de la cod sursă la executabil

Lecția-suport: Program pe sistem real — evaluare

Python are nevoie de Python ca să ruleze: duci agenda.py pe un calculator fără interpretor și nu se întâmplă nimic. Azi produci altceva — un executabil: un fișier care conține direct instrucțiuni de procesor și rulează de unul singur. La finalul laboratorului vei avea două produse: executabilul salut construit din primul tău cod C++ și binar, un program compilat care afișează orice număr în baza 2 — legătura perfectă cu lecția despre biți.

Ce îți trebuie

  • VS Code — îl ai.
  • Compilatorul g++. Verifică întâi dacă există: în terminalul VS Code, g++ --version.
    • Pe macOS: dacă lipsește, terminalul îți propune singur instalarea uneltelor de dezvoltare la prima încercare — acceptă și așteaptă.
    • Pe Windows: cel mai probabil lipsește. Ghidul oficial pas cu pas e pe code.visualstudio.com — navighezi la Docs → C++ → GCC on Windows (instalarea prin MSYS2, cu adăugarea la PATH). E partea cea mai anevoioasă a laboratorului; în sala de informatică o face profesorul o singură dată, pe imaginea comună.
  • Extensia C/C++ în VS Code (de la Microsoft), pentru colorare și subliniat greșeli.
  • Cont: niciunul. Timp: 20 minute verificare unelte + 30 primul program + restul pe convertorul binar.

Primul program: scrie, compilează, rulează

  1. Folder nou cpp-lab, deschis în VS Code. Fișier nou: salut.cpp.
#include <iostream>

int main() {
    std::cout << "Salut! Sunt un program compilat." << std::endl;
    int varsta = 14;
    std::cout << "Peste un an voi avea " << varsta + 1 << " ani." << std::endl;
    return 0;
}
  1. Nu există buton de „play" care să facă magie de data asta — compilarea o comanzi tu, în terminal:
g++ salut.cpp -o salut

Comanda tace câteva clipe și... nu afișează nimic. La compilatoare, tăcerea e de aur: înseamnă zero erori. Uită-te în panoul de fișiere — a apărut salut (pe Windows, salut.exe).

  1. Rulează executabilul:
./salut

(pe Windows: .\salut sau simplu salut).

Ce s-a întâmplat de fapt, în două fraze: interpretorul (Python) citește codul sursă linie cu linie și îl execută pe loc, de fiecare dată. Compilatorul (g++) traduce tot codul, o singură dată, direct în instrucțiuni de procesor — șiruri de biți, exact reprezentarea despre care ai învățat la „Biți, ASCII și numere" — și le împachetează într-un fișier de sine stătător. De-asta executabilul tău rulează și pe un calculator care n-a auzit de C++.

  1. Fă experimentul care fixează ideea: șterge un ; din cod și rulează iar comanda g++. Citește eroarea — compilatorul refuză să producă executabilul și îți arată linia. Apoi observă că ./salut încă merge: executabilul vechi n-a fost atins. Codul sursă și executabilul sunt două obiecte diferite; după orice modificare, recompilezi.

Convertorul în binar: un program compilat care calculează biți

Simetrie frumoasă: scrii un program care e el însuși biți, ca să afișeze biții altor numere. Fișier nou, binar.cpp:

#include <iostream>

int main() {
    int numar;
    std::cout << "Numar natural: ";
    std::cin >> numar;

    int copie = numar;
    std::string rezultat = "";

    while (copie > 0) {
        int rest = copie % 2;
        if (rest == 1) {
            rezultat = "1" + rezultat;
        } else {
            rezultat = "0" + rezultat;
        }
        copie = copie / 2;
    }

    if (numar == 0) {
        rezultat = "0";
    }

    std::cout << numar << " in binar: " << rezultat << std::endl;
    return 0;
}

Compilează (g++ binar.cpp -o binar) și rulează. Algoritmul e cel de la lecția de binar — împărțiri repetate la 2, resturile citite de jos în sus — doar că acum resturile se lipesc în fața șirului ("1" + rezultat), deci ordinea iese corectă de la sine.

Diferențele C++ față de Python, ca să nu te împiedici în ele:

  • fiecare instrucțiune se termină cu ;
  • blocurile stau între acolade, nu se marchează prin indentare (indentarea rămâne, dar pentru oameni);
  • variabilele se declară cu tip: int numar; — spui de la început ce fel de valoare va ține;
  • citirea e std::cin >> numar, scrierea std::cout << ... — săgețile arată sensul în care curg datele.

Verifică cu valorile pe care le știi din lecție: 5 trebuie să dea 101, 8 dă 1000, 255 dă 11111111.

Dacă nu merge

  • g++: command not found după instalare (Windows): PATH-ul nu s-a actualizat în terminalul deja deschis. Închide complet VS Code și redeschide-l; terminalele moștenesc PATH-ul de la pornire.
  • error: expected ';': clasicul punct și virgulă uitat — eroarea arată de multe ori spre linia următoare celei vinovate, pentru că abia acolo s-a lămurit compilatorul că ceva lipsește. Caută cu un rând mai sus.
  • ./salut: No such file or directory: fie compilarea a eșuat (derulează în sus după erori), fie ești în alt folder decât executabilul. ls îți arată ce există unde stai.
  • Modifici codul, dar programul se comportă ca înainte: rulezi executabilul vechi. Recompilează. E greșeala pe care o va face toată clasa cel puțin o dată azi — de aceea profesioniștii au un singur gest pentru „compilează și rulează".
  • Pe Windows, fereastra se închide instant la dublu-click pe exe: normal — programul termină și fereastra moare. Rulează-l din terminal, ca mai sus, acolo rămâne totul pe ecran.

Misiunea ta

Nivel de bază (obligatoriu): ambele programe compilate și funcționale: salut (personalizat cu datele tale) și binar verificat pe 5, 8, 100 și 0.

Extindere: îmbunătățește convertorul să afișeze și numărul de biți folosiți (lungimea șirului: rezultat.size()), plus un mesaj de tip „incape pe un octet" dacă rezultatul are cel mult 8 biți.

Provocare: programul invers — citește un șir de 0 și 1 (std::string) și afișează valoarea în baza 10. Indiciu: parcurgi șirul de la stânga la dreapta cu for și menții valoare = valoare * 2 + cifra. Testul suprem: trece un număr prin ambele programe și verifică dacă se întoarce neschimbat.

Ai terminat când:

  • poți explica, cu executabilul pe ecran, diferența interpretat/compilat în maximum 3 fraze;
  • convertorul dă rezultate identice cu metoda pe hârtie din lecția de binar, pe 4 numere alese de colegul de bancă;
  • ai provocat, văzut și reparat cel puțin o eroare de compilare;
  • folderul conține sursele .cpp și executabilele, și știi care e care.