logo

Timp de compilare vs Timp de execuție

Compile-time și Runtime sunt cei doi termeni de programare utilizați în dezvoltarea software-ului. Timpul de compilare este momentul la care codul sursă este convertit într-un cod executabil, în timp ce timpul de execuție este momentul la care codul executabil începe să ruleze. Atât timpul de compilare, cât și cel de rulare se referă la diferite tipuri de erori.

Erori la compilare

Erorile de compilare sunt erorile care au apărut atunci când scriem o sintaxă greșită. Dacă scriem sintaxa sau semantica greșită a oricărui limbaj de programare, atunci erorile de compilare vor fi aruncate de compilator. Compilatorul nu va permite rularea programului până când toate erorile nu sunt eliminate din program. Când toate erorile sunt eliminate din program, compilatorul va genera fișierul executabil.

cifre romane 1100

Erorile de compilare pot fi:

  • Erori de sintaxă
  • Erori semantice

Erori de sintaxă

Când programatorul nu respectă sintaxa niciunui limbaj de programare, atunci compilatorul va arunca eroarea de sintaxă.

De exemplu,

int a, b:

Declarația de mai sus generează eroarea de compilare ca în C, fiecare instrucțiune se termină cu punct și virgulă, dar punem două puncte (:) la sfârșitul instrucțiunii.

Erori semantice

Erorile semantice există atunci când instrucțiunile nu au sens pentru compilator.

De exemplu,

a+b=c;

Declarația de mai sus aruncă erori de compilare. În declarația de mai sus, atribuim valoarea lui „c” însumării lui „a” și „b”, ceea ce nu este posibil în limbajul de programare C, deoarece poate conține o singură variabilă în stânga operatorului de atribuire în timp ce dreapta operatorul de atribuire poate conţine mai multe variabile.

Declarația de mai sus poate fi rescrisă astfel:

c=a+b;

Erori de rulare

Erorile de rulare sunt erorile care apar în timpul execuției și după compilare. Exemplele de erori de rulare sunt împărțirea cu zero, etc. Aceste erori nu sunt ușor de detectat, deoarece compilatorul nu indică aceste erori.

Să explorăm câteva C tipice tipuri de erori de rulare, cazuri , și posibilele lor efecte.

Impartirea cu zero:

Deoarece împărțirea la zero este nedefinibil din punct de vedere matematic , încercând să împartă un întreg cu zero duce la a eroare de rulare . Această greșeală face ca programul să se blocheze sau să producă o excepție. Iată un exemplu:

 #include int main() { int a = 10; int b = 0; int result = a / b; // Division by zero printf('Result: %d
', result); return 0; } 

Ieșire:

cum se convertesc șirul în int java
 Floating point exception (core dumped) 

Explicaţie:

A „Excepție în virgulă mobilă” mesajul de eroare este produs atunci când programul întâmpină o problemă de rulare din cauza împărțirii la zero.

Accesarea matricei în afara limitelor:

A eroare de rulare apare atunci când un element de matrice este accesat în afara anumitor limite. O eroare apare atunci când un index este mai mare decât dimensiunea matricei și legile de acces la memorie sunt încălcate. Iată un exemplu:

 #include int main() { int arr[5] = {1, 2, 3, 4, 5}; int index = 10; int value = arr[index]; // Accessing array out of bounds printf('Value: %d
', value); return 0; } 

Ieșire:

 Segmentation fault (core dumped) 

Explicaţie:

Elementul la indicele 10 este dincolo de limitele matricei atunci când programul încearcă să-l acceseze. Ca urmare, a apare o eroare de segmentare , iar programul se termină cu o eroare.

Null Pointer Dereference:

A eroare de rulare se întâmplă atunci când încercați să accesați un memoria pointerului nul adresa, care este cunoscută ca dereferentiere un indicator nul. Accesarea indicatoarelor nule are ca rezultat un comportament imprevizibil, deoarece nu indică locații de memorie legitime . Iată un exemplu:

 #include int main() { int* ptr = NULL; // Null pointer int value = *ptr; // Null pointer dereference printf('Value: %d
', value); return 0; } 

Ieșire:

tipuri de arbore binar
 Segmentation fault (core dumped) 

Explicaţie:

Încercarea de a dereferire un pointer nul are ca rezultat a defect de segmentare , ceea ce face ca programul să se blocheze cu un mesaj de eroare.

Depășire stivă:

A preaplin stiva se întâmplă atunci când stiva de apeluri crește mai mult decât s-a dorit, conținând informații despre apelurile de funcții. Un recursivitate infinită rezultă de obicei atunci când funcţiilor recursive le lipsesc criteriile de terminare adecvate. Iată un exemplu:

 #include void recursiveFunction() { recursiveFunction(); // Recursive call without termination condition } int main() { recursiveFunction(); return 0; } 

Ieșire:

 Segmentation fault (core dumped) 

Explicaţie:

Programul începe o recursivitate nesfârșită , care debordează stiva și provoacă o eroare de segmentare.

Variabile neutilizate:

Deoarece variabile neinițializate avea valori nedefinite , utilizarea acestora poate duce la erori de rulare. Programul ar putea oferi rezultate surprinzătoare sau să se blocheze, în funcție de circumstanță. Iată un exemplu:

 #include int main() { int uninitializedVariable; printf('Value: %d
', uninitializedVariable); // Using uninitialized variable return 0; } 

Ieșire:

 Some random value (varies each time) 

Explicaţie:

În acest exemplu, valoarea lui an variabilă neinițializată poate fi orice valoare aleatoare aleasă aleatoriu din regiunea de memorie desemnată acelei variabile.

Să ne uităm la diferențele dintre timpul de compilare și timpul de execuție:

Timp de compilare Timp de rulare
Erorile de compilare sunt erorile care sunt produse la momentul de compilare și sunt detectate de compilator. Erorile de rulare sunt erorile care nu sunt generate de compilator și produc un rezultat imprevizibil la momentul execuției.
În acest caz, compilatorul împiedică executarea codului dacă detectează o eroare în program. În acest caz, compilatorul nu detectează eroarea, deci nu poate împiedica execuția codului.
Conține erorile de sintaxă și semantică, cum ar fi lipsa punctului și virgulă la sfârșitul instrucțiunii. Conține erori precum împărțirea la zero, care determină rădăcina pătrată a unui număr negativ.

Exemplu de eroare în timpul compilării

 #include int main() { int a=20; printf('The value of a is : %d',a): return 0; } 

În codul de mai sus, am încercat să tipărim valoarea lui „a”, dar afișează o eroare. Punem două puncte la sfârșitul instrucțiunii în loc de punct și virgulă, astfel încât acest cod generează o eroare de compilare.

Ieșire

Timp de compilare vs Timp de execuție

Exemplu de eroare de rulare

 #include int main() { int a=20; int b=a/0; // division by zero printf('The value of b is : %d',b): return 0; } 

În codul de mai sus, încercăm să împărțim valoarea lui „b” la zero, iar acest lucru generează o eroare de rulare.

Ieșire

buclă for în java
Timp de compilare vs Timp de execuție

Concluzie:

În concluzie, perioadele de dezvoltare de software cunoscut ca timp de compilare și erori de rulare sunt separate și fiecare are un set unic de defecte care s-ar putea întâmpla. Erori la compilare se întâmplă atunci când codul este convertit în formă executabilă în timpul pasului de compilare. Aceste erori includ erori semantice , care produc ilogic sau cod absurd , și erori de sintaxă , care contravin legilor limbajului de programare. Aceste erori sunt identificate de compilator și raportat, blocarea executiei a codului până când acestea sunt fixate.

Pe de altă parte, erori de rulare apar atunci când un program rulează și nu sunt capturate de compilator. Ele pot rezulta din mai multe afecțiuni, inclusiv împărțire la zero, acces eronat la memorie , sau alte evenimente neprevăzute. Erori de rulare sunt mai dificil de descoperit și de depanat, deoarece duc frecvent la blocări ale programului sau un comportament neașteptat. Pentru a gestiona elegant erorile de rulare și pentru a garanta stabilitatea programului, dezvoltatorii folosesc tehnici de tratare a erorilor ca tratarea excepțiilor .