logo

Vrijeme kompajliranja u odnosu na vrijeme izvođenja

Vrijeme prevođenja i vrijeme izvođenja dva su programska pojma koja se koriste u razvoju softvera. Vrijeme kompajliranja je vrijeme u kojem se izvorni kod pretvara u izvršni kod, dok je vrijeme izvođenja vrijeme u kojem se izvršni kod pokreće. I vrijeme prevođenja i vrijeme izvođenja odnose se na različite vrste pogrešaka.

Pogreške tijekom kompilacije

Pogreške tijekom kompajliranja su pogreške koje su se pojavile kada napišemo pogrešnu sintaksu. Ako napišemo pogrešnu sintaksu ili semantiku bilo kojeg programskog jezika, kompilator će izbaciti pogreške tijekom prevođenja. Prevodilac neće dopustiti pokretanje programa dok se sve greške ne uklone iz programa. Kada se sve pogreške uklone iz programa, kompajler će generirati izvršnu datoteku.

Pogreške tijekom kompajliranja mogu biti:

  • Sintaktičke pogreške
  • Semantičke pogreške

Sintaktičke pogreške

Kada programer ne slijedi sintaksu bilo kojeg programskog jezika, tada će prevodilac izbaciti sintaktičku pogrešku.

Na primjer,

int a, b:

Gornja deklaracija generira pogrešku tijekom kompajliranja kao u C-u, svaka izjava završava točkom i zarezom, ali stavljamo dvotočku (:) na kraj izjave.

Semantičke pogreške

Semantičke pogreške postoje kada iskazi nemaju smisla prevoditelju.

Na primjer,

inorder traversal

a+b=c;

Gornja izjava izbacuje pogreške tijekom kompilacije. U gornjoj izjavi, dodjeljujemo vrijednost 'c' zbroju 'a' i 'b' što nije moguće u programskom jeziku C jer može sadržavati samo jednu varijablu s lijeve strane operatora dodjele dok desno od operator dodjele može sadržavati više od jedne varijable.

Gornja izjava može se prepisati kao:

c=a+b;

Pogreške u izvođenju

Pogreške u vremenu izvođenja su pogreške koje se javljaju tijekom izvođenja i nakon kompilacije. Primjeri pogrešaka u vremenu izvođenja su dijeljenje s nulom, itd. Ove pogreške nije lako otkriti jer kompajler ne ukazuje na te pogreške.

Istražimo neke tipične C tipovi pogrešaka prilikom izvođenja, slučajevi , i njihove moguće učinke.

Dijeljenje s nulom:

Budući da je dijeljenje s nulom matematički neodrediv , pokušavajući podijeliti cijeli broj sa nula vodi do a pogreška prilikom izvođenja . Ova pogreška uzrokuje rušenje programa ili stvaranje iznimke. Evo primjera:

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

Izlaz:

 Floating point exception (core dumped) 

Obrazloženje:

A 'Iznimka s pomičnim zarezom' poruka o pogrešci pojavljuje se kada program naiđe na problem s vremenom izvođenja zbog dijeljenja s nulom.

Pristup nizu izvan granica:

A pogreška prilikom izvođenja događa se kada se pristupi elementu niza izvan određenih ograničenja. Pogreška se događa kada je indeks veći od veličine niza i zakoni o pristupu memoriji su prekršeni. Evo primjera:

 #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; } 

Izlaz:

 Segmentation fault (core dumped) 

Obrazloženje:

Element at indeks 10 nalazi se izvan granica polja kada mu program pokuša pristupiti. Kao rezultat toga, a dolazi do greške segmentacije , a program završava s greškom.

Dereferencija nultog pokazivača:

A pogreška prilikom izvođenja događa se kada pokušate pristupiti a memorija nultog pokazivača adresa, koja je poznata kao dereferenciranje nulti pokazivač. Pristup nultim pokazivačima rezultira nepredvidivim ponašanjem jer ne pokazuju na legitimne memorijske lokacije . Evo primjera:

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

Izlaz:

mysql prikaži sve korisnike
 Segmentation fault (core dumped) 

Obrazloženje:

Pokušaj da se dereferencija nulti pokazivač rezultira a Greška segmentacije , što uzrokuje pad programa uz poruku o pogrešci.

Stack Overflow:

A stack overflow događa se kada stog poziva postane veći od predviđenog, a sadrži informacije o pozivima funkcija. An beskonačna rekurzija obično rezultira kada rekurzivnim funkcijama nedostaju odgovarajući kriteriji završetka. Evo primjera:

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

Izlaz:

 Segmentation fault (core dumped) 

Obrazloženje:

Program se pokreće beskrajna rekurzija , koji prelijeva stog i uzrokuje pogrešku segmentacije.

Neiskorištene varijable:

Jer neinicijalizirane varijable imati nedefinirane vrijednosti , njihova upotreba može rezultirati pogreškama tijekom izvođenja. Program bi mogao dati iznenađujuće rezultate ili se srušiti, ovisno o okolnostima. Evo primjera:

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

Izlaz:

 Some random value (varies each time) 

Obrazloženje:

U ovom primjeru, vrijednost an neinicijalizirana varijabla može biti bilo koja nasumična vrijednost odabrana nasumično iz memorijske regije dodijeljene toj varijabli.

Pogledajmo razlike između vremena prevođenja i vremena izvođenja:

Vrijeme kompajliranja Runtime
Pogreške u vrijeme prevođenja su pogreške koje se proizvode u vrijeme prevođenja, a detektira ih prevodilac. Pogreške u vremenu izvođenja su pogreške koje ne generira kompajler i proizvode nepredvidiv rezultat u vrijeme izvođenja.
U tom slučaju prevoditelj sprječava izvršenje koda ako otkrije pogrešku u programu. U tom slučaju prevodilac ne otkriva pogrešku, pa ne može spriječiti izvršenje koda.
Sadrži sintaktičke i semantičke pogreške kao što je nedostatak točke i zareza na kraju izjave. Sadrži pogreške kao što su dijeljenje s nulom, određivanje kvadratnog korijena negativnog broja.

Primjer pogreške tijekom kompilacije

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

U gornjem kodu, pokušali smo ispisati vrijednost 'a', ali izbacuje pogrešku. Stavili smo dvotočku na kraj naredbe umjesto točke i zareza, tako da ovaj kod generira pogrešku tijekom kompilacije.

raspršivanje u strukturi podataka

Izlaz

Vrijeme kompajliranja u odnosu na vrijeme izvođenja

Primjer pogreške tijekom izvođenja

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

U gornjem kodu pokušavamo podijeliti vrijednost 'b' s nulom, a to izbacuje pogrešku vremena izvođenja.

Izlaz

Vrijeme kompajliranja u odnosu na vrijeme izvođenja

Zaključak:

Zaključno, razdoblja od razvoj softvera poznat kao vrijeme kompajliranja i runtime pogreške su odvojeni i svaki ima jedinstven skup greške koje bi se mogle dogoditi. Pogreške tijekom kompilacije dogoditi kada se kod pretvori u izvršni oblik tijekom koraka kompilacije. Ove pogreške uključuju semantičke pogreške , koji proizvode nelogičan ili apsurdni kod , i greške u sintaksi , koji su u suprotnosti sa zakonima programskog jezika. Ove pogreške identificiraju se pomoću sastavljač i izvijestio, blokiranje izvršenja koda dok se ne poprave.

S druge strane, runtime pogreške nastaju kada se program izvodi i kompajler ih ne hvata. Mogu proizaći iz nekoliko uvjeta, uključujući dijeljenje s nulom, pogrešan pristup memoriji , ili drugih nepredviđenih događaja. Pogreške u izvođenju teže ih je otkriti i otkloniti pogreške jer često rezultiraju padovima programa ili neočekivanim ponašanjem. Kako bi elegantno upravljali pogreškama tijekom izvođenja i jamčili stabilnost programa, programeri koriste tehnike rukovanja greškama Kao rukovanje iznimkama .