Tematică științifică · 2.1
Sintaxa și mediile de programare
Sintaxa, semantica și vocabularul unui limbaj, drumul de la programul sursă la programul executabil, categoriile de erori și operațiile mediului de programare, cu exemplele date în C++ și în Python.
Un limbaj de programare este un mijloc de comunicare între programator și calculator. Programul scris în el nu se execută ca atare: procesorul execută numai instrucțiuni în limbajul mașinii, iar între textul scris de programator și execuție se interpune o traducere.
Exemplele de mai jos sunt date în C++, limbaj care se poate folosi la proba scrisă, și în Python, cel studiat la clasa a IX-a din 2025. Comutatorul din capul lecției schimbă limbajul: se schimbă și explicația, nu doar codul, fiindcă drumul de la textul sursă la execuție nu este același în cele două limbaje.
Sintaxa, semantica și vocabularul
Un limbaj de programare este caracterizat prin sintaxa, semantica și vocabularul lui:
- sintaxa — totalitatea regulilor după care se scriu corect construcțiile limbajului;
- semantica — semnificația construcțiilor corecte din punct de vedere sintactic;
- vocabularul — totalitatea cuvintelor care pot fi folosite într-un program.
Definirea riguroasă a unui limbaj cuprinde și pragmatica, care arată modul de folosire a elementelor limbajului.
Sintaxa, semantica și vocabularul se studiază și la limbile naturale. Deosebirea este că un limbaj de programare nu îngăduie abateri: într-o limbă naturală, o greșeală de gramatică nu împiedică de obicei înțelegerea, fiindcă interlocutorul completează din context, pe când calculatorul nu completează nimic. O construcție care nu respectă sintaxa nu este tradusă, iar în locul rezultatului se obține un mesaj de eroare.
Unitățile lexicale
Sintaxa nu lucrează cu litere, ci cu unități lexicale. O unitate lexicală este un șir de caractere care are o semnificație în limbaj. Traducerea programului începe prin despărțirea textului sursă în unități lexicale, iar abia după aceea se verifică dacă succesiunea lor formează construcții admise.
Unitățile lexicale sunt identificatorii, cuvintele cheie, constantele, operatorii și separatorii. Ele se construiesc din setul de caractere al codului ASCII: literele mari și mici ale alfabetului latin, cifrele sistemului zecimal și caracterele speciale.
Corectitudinea sintactică și corectitudinea rezultatului
Traducerea verifică sintaxa, nu intenția. O instrucțiune scrisă după toate regulile limbajului poate calcula altceva decât s-a cerut, fără ca traducerea să semnaleze ceva.
În C++
int a = 7, b = 2;
cout << a + b / 2; // se afișează 8, nu 4.5
Instrucțiunea este corectă sintactic și se traduce fără nicio observație. Împărțirea are însă
prioritate mai mare decât adunarea, deci se calculează b / 2 și abia apoi se adună a.
În Python
a, b = 7, 2
print(a + b / 2) # se afișează 8.0, nu 4.5
Instrucțiunea este corectă sintactic și se execută fără nicio observație. Împărțirea are însă
prioritate mai mare decât adunarea, deci se calculează b / 2 și abia apoi se adună a.
Media celor două numere se obține scriind (a + b) / 2. Deosebirea dintre cele două scrieri este
de semantică, nu de sintaxă, iar programul o dovedește numai la execuție.
Descrierea sintaxei
Regulile de sintaxă ale unui limbaj se scriu de obicei în notația BNF (Backus-Naur Form). Fiecare
regulă definește o construcție prin construcțiile din care este alcătuită: semnul ::= desparte
numele construcției de definiția ei, iar bara verticală | desparte alternativele.
antet-funcție ::= tip identificator ( parametri )
parametri ::= void | listă-parametri
listă-parametri ::= tip identificator | tip identificator , listă-parametri
Ultima regulă se folosește pe ea însăși, deci descrie o listă de orice lungime, fără să spună dinainte câte elemente are.
Primul limbaj definit riguros, cu sintaxa complet formalizată, a fost ALGOL. Conceptele introduse atunci de colectivul coordonat de Peter Naur se folosesc și astăzi la proiectarea limbajelor de programare.
De la programul sursă la programul executabil
Programul scris de programator se numește program sursă. Transcrierea algoritmului într-un limbaj de programare se face cu un editor de texte, iar rezultatul se salvează într-un fișier pe disc.
De aici încolo, cele două limbaje se deosebesc: C++ folosește un compilator, iar Python un interpretor.
În C++
Fișierul cu programul sursă are extensia .cpp pentru C++ și .c pentru C. Până la execuție se
parcurg trei operații:
- compilarea — compilatorul analizează textul sursă din punct de vedere sintactic și, dacă nu
găsește erori, îl traduce în limbajul mașinii; rezultatul este un program obiect, salvat
într-un fișier cu extensia
.objsub Windows sau.osub Linux; - editarea legăturilor — editorul de legături, numit și link-editor, asamblează modulele obiect
ale aplicației împreună cu funcțiile din bibliotecile standard apelate în program și obține
programul executabil, un fișier cu extensia
.exesub Windows; - lansarea în execuție — programul executabil este încărcat în memoria internă și executat de procesor.
Programul obiect nu se poate executa: el conține numai instrucțiunile traduse din textul sursă, nu și pe cele ale funcțiilor din biblioteci. O bibliotecă este o colecție de funcții deja compilate, scrise fie de producătorul mediului de programare, fie de alți programatori; funcțiile de citire și de scriere și cele matematice se iau de acolo. De aceea editarea legăturilor este obligatorie, chiar dacă mediul de programare o face fără să fie cerută separat.
#include <iostream>
using namespace std;
int main() {
cout << "Salutare" << endl;
return 0;
}
Din salut.cpp se obține salut.obj, iar din acesta salut.exe. Compilarea și editarea
legăturilor se fac o singură dată: programul executabil se poate lansa apoi de oricâte ori, pe un
calculator pe care nu există nici compilatorul, nici textul sursă.
În Python
Fișierul cu programul sursă are extensia .py. Nu se obține niciun program executabil: fișierul
sursă este citit și executat de un program numit interpretor.
print('Salutare')
Fișierul se salvează ca salut.py și se execută cu comanda python salut.py. Textul sursă este
considerat codificat în UTF-8, deci diacriticele se pot folosi în constantele de tip șir de
caractere, în identificatori și în comentarii.
Interpretorul nu execută textul rând cu rând. El îl traduce întâi într-o formă intermediară, numită
bytecode, și abia aceasta se execută. Pentru modulele importate de program, forma intermediară
se păstrează pe disc, în directorul __pycache__, în fișiere cu extensia .pyc al căror nume
cuprinde și versiunea interpretorului. La o execuție următoare, interpretorul compară data
modificării fișierului sursă cu cea a fișierului compilat și traduce din nou numai dacă sursa s-a
schimbat. Fișierul dat direct în linia de comandă se traduce de fiecare dată, iar rezultatul
traducerii nu se păstrează.
Forma intermediară nu depinde de echipamentul pe care a fost obținută, dar nu se poate executa fără interpretor.
Modul interactiv. Interpretorul se poate porni și fără fișier sursă, cu comanda python.
Atunci el citește câte o comandă de la tastatură, o execută și afișează rezultatul. Promptul
principal este >>>, iar promptul secundar, care apare la liniile de continuare ale unei comenzi
scrise pe mai multe rânduri, este .... O linie goală încheie comanda.
>>> 17 // 3
5
>>> n = 12
>>> if n % 2 == 0:
... print('numar par')
...
numar par
Deosebirile dintre cele două feluri de traducere:
| Criteriul | Compilator | Interpretor |
|---|---|---|
| Rezultatul traducerii | program executabil, păstrat pe disc | formă intermediară, executată imediat |
| Momentul traducerii | înainte de execuție, o singură dată | la fiecare execuție |
| Ce este nevoie la execuție | numai programul executabil | interpretorul și programul sursă |
| Legătura cu echipamentul | executabilul se obține pentru un anumit sistem de calcul | același text sursă se execută pe orice sistem care are interpretor |
Erorile și momentul în care se văd
După momentul în care se manifestă, erorile dintr-un program se împart în erori de sintaxă, erori de execuție și erori logice.
| Categoria | Când apare | Ce o produce |
|---|---|---|
| erori de sintaxă | la traducerea programului | construcții care încalcă regulile limbajului: un cuvânt scris greșit, un separator care lipsește, o paranteză neînchisă |
| erori de execuție | în timpul executării programului | operații care nu se pot efectua: împărțirea la zero, deschiderea unui fișier care nu există, depășirea limitelor unui tablou |
| erori logice | la testare | programul se execută până la capăt, dar rezultatul nu este cel cerut |
Erorile de execuție se mai numesc erori semantice, iar cele logice se mai numesc erori de concepție. Erorile logice sunt cele mai greu de găsit, fiindcă nu le semnalează nimeni: ele se descoperă executând programul cu un set complet de date de intrare și comparând rezultatele obținute cu cele așteptate.
În C++
Compilatorul afișează erorile de sintaxă într-o fereastră de mesaje, fiecare cu numele fișierului și numărul liniei în care a fost detectată. Textul se corectează în editor, iar programul se compilează din nou; operațiile se repetă până când compilatorul nu mai găsește erori.
Pe lângă erori, compilatorul afișează mesaje de avertizare. Ele arată construcții corecte sintactic, dar care în contextul programului sunt probabil greșite:
- o variabilă declarată și nefolosită;
- o variabilă folosită fără să i se fi atribuit o valoare;
- operatorul de atribuire
=scris în locul operatorului relațional==într-o condiție.
Avertizările nu opresc compilarea și nu împiedică obținerea programului executabil. Ele se citesc totuși, fiindcă arată încă din faza de compilare erori de execuție sau erori logice.
În Python
Erorile de sintaxă sunt găsite de analizorul sintactic, o parte a interpretorului, înainte ca vreo
instrucțiune să fie executată; de aceea se mai numesc erori de parsare. Mesajul cuprinde numele
fișierului, numărul liniei, linia însăși și, sub ea, semnele ^ care arată porțiunea în care s-a
oprit analiza:
File "<stdin>", line 1
while True print('gata')
^^^^^
SyntaxError: invalid syntax
Erorile care apar în timpul executării unui program corect sintactic se numesc excepții. Ele
opresc execuția și afișează numele excepției, care arată felul erorii: ZeroDivisionError la
împărțirea la zero, NameError la folosirea unei variabile care nu există, TypeError la o
operație între date de tipuri nepotrivite.
Mediul de programare
Obținerea unui program executabil cere mai multe programe: un editor de texte, un compilator, un editor de legături și un program depanator. Ele pot fi folosite separat, dar de obicei sunt încorporate într-un singur produs, care le pune la dispoziție prin aceeași interfață. Produsul acesta se numește mediu de programare sau mediu integrat de dezvoltare.
Un mediu de programare asigură:
- editarea programului sursă;
- administrarea fișierelor sursă: creare, deschidere, salvare, închidere, tipărire;
- compilarea programului sursă;
- editarea legăturilor și obținerea programului executabil;
- lansarea în execuție a programului;
- depanarea și corectarea erorilor;
- configurarea mediului însuși;
- documentarea prin sistemul de asistență (Help).
Interfața cuprinde bara cu titlurile meniurilor, spațiul de lucru în care se deschid ferestrele de editare și bara de informare din partea de jos a ecranului. Meniurile sunt grupate după operații: administrarea fișierelor, editarea textului, căutarea, compilarea, execuția, depanarea, configurarea mediului.
Editorul de texte folosește marcaje cu culoare pentru a deosebi elementele programului: cuvinte cheie, identificatori, constante, comentarii. Culorile nu fac parte din program și nu ajung în fișierul sursă; ele se văd numai în editor și arată o greșeală de scriere înainte de compilare, fiindcă un cuvânt cheie scris greșit rămâne necolorat.
Fișierele mediului
În C++
| Extensia | Fișierul |
|---|---|
.cpp, .c | program sursă |
.h | fișier antet |
.obj, .o | program obiect |
.lib | bibliotecă |
.exe | program executabil |
Când rezolvarea unei probleme cere mai multe fișiere sursă, ele se strâng într-un proiect. Fișierul proiectului ține evidența fișierelor sursă din care se obține aplicația, iar compilarea și editarea legăturilor se cer o singură dată, pentru tot proiectul.
În Python
| Extensia | Fișierul |
|---|---|
.py | program sursă |
.pyc | forma intermediară a unui modul, în directorul __pycache__ |
Fișierele .pyc sunt făcute și șterse de interpretor, nu de programator. Ele nu se editează și nu
se copiază de la o versiune de Python la alta: numele fiecăruia cuprinde versiunea pentru care a
fost obținut, tocmai ca formele intermediare produse de versiuni diferite să poată sta în același
director.
Medii de programare folosite în școală
Programa școlară de informatică pentru liceu recomandă, pentru exersarea și implementarea algoritmilor:
- pentru C++ — Code::Blocks;
- pentru Python — PyCharm, IDLE Python, Spyder, Wing și Komodo;
- pentru amândouă limbajele — Visual Studio Code.
Toate sunt multiplatformă, adică au variante pentru Windows, Linux și macOS. IDLE se instalează odată cu interpretorul, de pe www.python.org, iar celelalte se instalează separat.
Programa recomandă și instrumente online, care se folosesc în browser și nu cer nicio instalare pe calculatoarele din laborator: Online GDB, Programiz, w3schools, Repl.it și Jupyter Notebooks. Interpretoarele de Python trecute în programă sunt CPython, distribuția de pe www.python.org, și PyPy.
Depanarea programului
Corectarea erorilor dintr-un program se numește depanare. Ea se desfășoară sub controlul unui program specializat, numit depanator de programe (debugger), inclus în mediul de programare.
Depanatorul asigură:
- executarea pas cu pas — instrucțiunile se execută una câte una, la cerere, astfel încât se vede ordinea în care se execută;
- urmărirea variabilelor și a expresiilor — valorile lor se afișează într-o fereastră aparte și se reevaluează după fiecare instrucțiune executată;
- punctele de întrerupere (breakpoints) — marcaje puse în dreptul unor instrucțiuni, la care execuția se oprește, pentru ca starea programului și conținutul variabilelor să poată fi examinate.
Punctele de întrerupere se pun înaintea executării pas cu pas: programul se execută normal până la instrucțiunea bănuită și abia de acolo se merge instrucțiune cu instrucțiune. Altfel s-ar parcurge pas cu pas și partea de program care lucrează corect.
Testarea și depanarea sunt operații deosebite. Testarea se face executând programul cu un set complet de date de intrare și arată că programul greșește; depanarea arată unde greșește.
În C++
Corectarea unei erori cere reluarea întregului ciclu: se modifică textul sursă în editor, se compilează din nou, se editează legăturile și se execută programul. Ciclul se repetă până când rezultatele sunt cele așteptate pentru toate seturile de date de intrare.
În Python
Modul interactiv este el însuși un instrument de depanare. O expresie, un apel de subprogram sau o
prelucrare de șir se pot încerca la promptul >>>, cu valori alese de programator, fără a executa
programul întreg și fără a-l modifica.
Apariții la examen
Subcapitolul este însemnat cu (*) în programa de Titularizare, deci intră și la proba practică, alături de celelalte subcapitole ale capitolului 2 și de capitolele 6, 8, 9 și 10.
La proba scrisă, ca subiect de teorie de sine stătător, nu apare în variantele din arhivă: Definitivat 2018–2026 și Titularizare 2018–2026. Sintaxa se punctează însă la fiecare program cerut, printr-un rând separat din barem:
| Examenul | Ce punctează rândul din barem | Punctajul |
|---|---|---|
| Definitivat | declarările variabilelor, citirea sau afișarea datelor și corectitudinea globală a programului | 1 p, o dată în lucrare |
| Titularizare | declarările variabilelor, afișarea datelor și corectitudinea globală a programului | 1 p, de două ori în lucrare |
Formularea s-a schimbat la 2026, la amândouă examenele: în locul sintagmei „corectitudine globală” baremele scriu „corectitudine sintactică”.
Punctul acesta nu ține de algoritm: se acordă pentru declararea tuturor variabilelor folosite, pentru citirea și afișarea datelor conform cerinței și pentru corectitudinea programului ca întreg. La proba scrisă nu există compilator care să semnaleze un punct și virgulă lipsă.
Mediul de programare mai apare o dată în programă, la tematica de metodică, în capitolul despre strategii didactice: printre produsele software pe care profesorul le alege pentru integrarea mijloacelor de învățământ în procesul de predare-învățare-evaluare sunt trecute sistemul de operare, aplicațiile de birotică, mediul specializat pentru reprezentarea algoritmilor prin blocuri grafice și mediul de programare.
Materialul acesta se citește pe educamp.ro și nu se tipărește.
Surse
- Cerchez, E., Șerban, M., „Programarea în limbajul C/C++ pentru liceu”, Editura Polirom, Iași, 2005
- „Metode și tehnici clasice de programare”, suport de curs
- Miloșescu, M. L., „Informatică: pentru profilul real, intensiv. Manual pentru clasa a IX-a”, Editura Didactică și Pedagogică, București, 2005
- Ministerul Educației și Cercetării, „Programa școlară pentru disciplina Informatică, clasa a X-a, curriculum de specialitate”, aprobată prin Ordinul nr. 4.370/2026, Monitorul Oficial nr. 591 bis din 20 iulie 2026
- „Tutorialul de Python”, documentația oficială a limbajului Python, https://docs.python.org/ro/3/tutorial/index.html