logo

Kompiliavimo laikas vs vykdymo laikas

Kompiliavimo laikas ir vykdymo laikas yra du programavimo terminai, naudojami kuriant programinę įrangą. Kompiliavimo laikas yra laikas, kai šaltinio kodas konvertuojamas į vykdomąjį kodą, o vykdymo laikas yra laikas, kai pradedamas vykdyti vykdomasis kodas. Tiek kompiliavimo laikas, tiek vykdymo laikas nurodo skirtingus klaidų tipus.

Kompiliavimo laiko klaidos

Kompiliavimo laiko klaidos yra klaidos, kurios įvyko, kai rašome neteisingą sintaksę. Jei parašome neteisingą bet kurios programavimo kalbos sintaksę ar semantiką, kompiliatorius išmes kompiliavimo laiko klaidas. Kompiliatorius neleis paleisti programos, kol iš programos nebus pašalintos visos klaidos. Kai iš programos pašalinamos visos klaidos, kompiliatorius sugeneruos vykdomąjį failą.

Kompiliavimo laiko klaidos gali būti:

  • Sintaksės klaidos
  • Semantinės klaidos

Sintaksės klaidos

Kai programuotojas nesilaiko jokios programavimo kalbos sintaksės, kompiliatorius išmes sintaksės klaidą.

Pavyzdžiui,

int a, b:

Aukščiau pateikta deklaracija generuoja kompiliavimo laiko klaidą, kaip ir C, kiekvienas sakinys baigiasi kabliataškiu, bet teiginio pabaigoje dedame dvitaškį (:).

Semantinės klaidos

Semantinės klaidos egzistuoja, kai teiginiai nėra prasmingi kompiliatoriui.

Pavyzdžiui,

a+b=c;

Aukščiau pateiktas teiginys išmeta kompiliavimo laiko klaidas. Aukščiau pateiktame teiginyje „c“ reikšmę priskiriame „a“ ir „b“ sumavimui, o tai neįmanoma C programavimo kalba, nes joje gali būti tik vienas kintamasis kairėje priskyrimo operatoriaus pusėje, o dešinėje priskyrimo operatorius gali turėti daugiau nei vieną kintamąjį.

Aukščiau pateiktą teiginį galima perrašyti taip:

c=a+b;

Vykdymo laiko klaidos

Vykdymo laiko klaidos yra klaidos, atsirandančios vykdymo metu ir po kompiliavimo. Vykdymo laiko klaidų pavyzdžiai yra padalijimas iš nulio ir tt Šias klaidas nėra lengva aptikti, nes kompiliatorius nenurodo šių klaidų.

Panagrinėkime kai kuriuos tipiškus C vykdymo klaidų tipai, atvejai ir galimą jų poveikį.

Dalyba iš nulio:

Kadangi dalyba iš nulio yra matematiškai neapibrėžiamas , bandoma padalyti sveikąjį skaičių iš nulis veda į a Klaida . Dėl šios klaidos programa sugenda arba sukuria išimtį. Štai pavyzdys:

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

Išvestis:

 Floating point exception (core dumped) 

Paaiškinimas:

A „Slankiojo kablelio išimtis“ klaidos pranešimas pateikiamas, kai programa susiduria su vykdymo problema dėl padalijimo iš nulio.

Prieiga prie masyvo ribų:

A Klaida įvyksta, kai masyvo elementas pasiekiamas už tam tikrų ribų. Klaida įvyksta, kai indeksas yra didesnis nei masyvo dydis ir pažeidžiami prieigos prie atminties dėsniai. Štai pavyzdys:

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

Išvestis:

 Segmentation fault (core dumped) 

Paaiškinimas:

turi kitą java

Elementas esant indeksas 10 yra už masyvo ribų, kai programa bando jį pasiekti. Dėl to a įvyksta segmentavimo gedimas , ir programa baigiasi su klaida.

Nulinės rodyklės nukrypimas:

A Klaida atsitinka, kai bandote pasiekti a nulinės rodyklės atmintis adresu, kuris žinomas kaip nuorodų panaikinimas nulinis rodyklė. Prieiga prie nulinių rodyklių sukelia nenuspėjamą elgesį, nes jie nenurodo teisėtos atminties vietos . Štai pavyzdys:

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

Išvestis:

 Segmentation fault (core dumped) 

Paaiškinimas:

powershell vs bash

Bandymas neatitikimas nulinė rodyklė lemia a segmentavimo gedimas , dėl ko programa sugenda ir pasirodo klaidos pranešimas.

Krūvos perpildymas:

A kamino perpildymas atsitinka, kai iškvietimų krūva išauga didesnė nei numatyta, joje yra informacijos apie funkcijų iškvietimus. An begalinė rekursija paprastai atsiranda, kai rekursinėms funkcijoms trūksta tinkamų užbaigimo kriterijų. Štai pavyzdys:

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

Išvestis:

 Segmentation fault (core dumped) 

Paaiškinimas:

Programa paleidžiama begalinė rekursija , kuris perpildo krūvą ir sukelia segmentavimo gedimą.

Nenaudojami kintamieji:

Nes neinicijuoti kintamieji turėti neapibrėžtos vertės , naudojant juos gali atsirasti vykdymo klaidų. Priklausomai nuo aplinkybių, programa gali duoti stebinančių rezultatų arba gali sugesti. Štai pavyzdys:

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

Išvestis:

 Some random value (varies each time) 

Paaiškinimas:

Šiame pavyzdyje an reikšmė neinicijuotas kintamasis gali būti bet kokia atsitiktinė reikšmė, atsitiktinai parinkta iš tam kintamajam priskirtos atminties srities.

Pažvelkime į kompiliavimo laiko ir vykdymo laiko skirtumus:

Kompiliavimo laikas Vykdymo laikas
Kompiliavimo laiko klaidos yra klaidos, kurios atsiranda kompiliavimo metu ir kurias aptinka kompiliatorius. Vykdymo laiko klaidos yra klaidos, kurių nesugeneruoja kompiliatorius ir kurios vykdymo metu sukuria nenuspėjamą rezultatą.
Tokiu atveju kompiliatorius užkerta kelią kodui vykdyti, jei aptinka programoje klaidą. Tokiu atveju kompiliatorius neaptinka klaidos, todėl negali užkirsti kelio kodui vykdyti.
Jame yra sintaksės ir semantinės klaidos, pvz., trūksta kabliataškio teiginio pabaigoje. Jame yra klaidų, tokių kaip padalijimas iš nulio, nustatantis neigiamo skaičiaus kvadratinę šaknį.

Kompiliavimo laiko klaidos pavyzdys

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

Aukščiau pateiktame kode bandėme atspausdinti „a“ reikšmę, tačiau pasirodo klaida. Teiginio pabaigoje vietoj kabliataškio dedame dvitaškį, todėl šis kodas generuoja kompiliavimo laiko klaidą.

Išvestis

Kompiliavimo laikas vs vykdymo laikas

Vykdymo laiko klaidos pavyzdys

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

Aukščiau pateiktame kode bandome padalyti „b“ reikšmę iš nulio, ir tai sukelia vykdymo klaidą.

Išvestis

Kompiliavimo laikas vs vykdymo laikas

Išvada:

Apibendrinant, laikotarpiai programinės įrangos kūrimas žinomas kaip kompiliavimo laikas ir vykdymo klaidos yra atskiri ir kiekvienas turi unikalų rinkinį gedimų kad gali atsirasti. Kompiliavimo laiko klaidos įvyksta, kai kodas paverčiamas vykdomąja forma kompiliavimo veiksmo metu. Šios klaidos apima semantines klaidas , kurios gamina nelogiška arba absurdiškas kodas , ir sintaksės klaidos , kurie prieštarauja programavimo kalbos dėsniams. Šias klaidas nustato kompiliatorius ir pranešė, blokuoja vykdymą kodo, kol jie bus pataisyti.

Iš kitos pusės, vykdymo klaidos įvyksta, kai programa veikia ir jų nepagauna kompiliatorius. Jie gali atsirasti dėl kelių sąlygų, įskaitant padalijimas iš nulio, klaidinga prieiga prie atminties , ar kiti nenumatyti įvykiai. Vykdymo laiko klaidos yra sunkiau aptikti ir derinti, nes jie dažnai sukelia programos strigtis arba netikėtą elgesį. Norėdami elegantiškai valdyti vykdymo klaidas ir garantuoti programos stabilumą, kūrėjai naudojasi klaidų valdymo technikos Kaip išimčių tvarkymas .