Compile-time a Runtime jsou dva programovací termíny používané při vývoji softwaru. Doba kompilace je čas, kdy je zdrojový kód převeden na spustitelný kód, zatímco doba běhu je čas, kdy je spustitelný kód spuštěn. Jak doba kompilace, tak doba běhu odkazují na různé typy chyb.
Chyby v době kompilace
Chyby v době kompilace jsou chyby, ke kterým došlo, když napíšeme špatnou syntaxi. Pokud napíšeme špatnou syntaxi nebo sémantiku jakéhokoli programovacího jazyka, pak kompilátor vyvolá chyby při kompilaci. Kompilátor nedovolí spustit program, dokud nebudou z programu odstraněny všechny chyby. Když jsou z programu odstraněny všechny chyby, kompilátor vygeneruje spustitelný soubor.
Chyby při kompilaci mohou být:
- Syntaktické chyby
- Sémantické chyby
Syntaktické chyby
Když programátor nedodrží syntaxi žádného programovacího jazyka, pak kompilátor vyvolá chybu syntaxe.
Například,
int a, b:
Výše uvedená deklarace generuje chybu při kompilaci jako v C, každý příkaz končí středníkem, ale na konec příkazu vložíme dvojtečku (:).
Sémantické chyby
Sémantické chyby existují, když příkazy nejsou pro kompilátor smysluplné.
Například,
a+b=c;
Výše uvedený příkaz vyvolá chyby při kompilaci. Ve výše uvedeném příkazu přiřazujeme hodnotu 'c' součtu 'a' a 'b', což není možné v programovacím jazyce C, protože může obsahovat pouze jednu proměnnou nalevo od operátoru přiřazení, zatímco vpravo od operátor přiřazení může obsahovat více než jednu proměnnou.
Výše uvedené prohlášení lze přepsat takto:
c=a+b;
Runtime chyby
Runtime chyby jsou chyby, ke kterým dochází během provádění a po kompilaci. Příklady runtime chyb jsou dělení nulou atd. Tyto chyby není snadné odhalit, protože překladač na tyto chyby neukazuje.
Pojďme prozkoumat některé typické C typy runtime chyb, případy a jejich možné dopady.
Dělení nulou:
Protože dělení nulou je matematicky nedefinovatelné , při pokusu o dělení celého čísla nula vede k a runtime chyba . Tato chyba způsobí selhání programu nebo vytvoření výjimky. Zde je příklad:
#include int main() { int a = 10; int b = 0; int result = a / b; // Division by zero printf('Result: %d ', result); return 0; }
Výstup:
Floating point exception (core dumped)
Vysvětlení:
A 'Výjimka s pohyblivou řádovou čárkou' chybová zpráva se zobrazí, když program narazí na problém za běhu kvůli dělení nulou.
Přístup k poli mimo hranice:
A runtime chyba nastane, když je prvek pole zpřístupněn mimo určité limity. K chybě dojde, když je index větší než velikost pole a jsou porušeny zákony o přístupu do paměti. Zde je příklad:
#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; }
Výstup:
průměr vs průměr
Segmentation fault (core dumped)
Vysvětlení:
Element at index 10 je za hranicemi pole, když se k němu program pokouší přistupovat. V důsledku toho a dojde k poruše segmentace a program skončí s chybou.
Dereference nulového ukazatele:
A runtime chyba se stane, když se pokusíte získat přístup a paměť nulového ukazatele adresu, která je známá jako dereferencování nulový ukazatel. Přístup k nulovým ukazatelům má za následek nepředvídatelné chování, protože na ně neukazují legitimní paměťová místa . Zde je příklad:
#include int main() { int* ptr = NULL; // Null pointer int value = *ptr; // Null pointer dereference printf('Value: %d ', value); return 0; }
Výstup:
q1 q2 q3 q4
Segmentation fault (core dumped)
Vysvětlení:
Pokus o to dereference výsledkem nulového ukazatele je a Porucha Segmentace , což způsobí zhroucení programu s chybovou zprávou.
Přetečení zásobníku:
A přetečení zásobníku nastane, když se zásobník volání zvětší, než bylo zamýšleno, a obsahuje informace o volání funkcí. An nekonečná rekurze obvykle dochází, když rekurzivní funkce postrádají vhodná ukončovací kritéria. Zde je příklad:
#include void recursiveFunction() { recursiveFunction(); // Recursive call without termination condition } int main() { recursiveFunction(); return 0; }
Výstup:
Segmentation fault (core dumped)
Vysvětlení:
Program se spustí a nekonečná rekurze , který přeteče zásobník a způsobí chybu segmentace.
Nepoužité proměnné:
Protože neinicializované proměnné mít nedefinované hodnoty , jejich použití může mít za následek běhové chyby. V závislosti na okolnostech by program mohl poskytnout překvapivé výsledky nebo selhat. Zde je příklad:
#include int main() { int uninitializedVariable; printf('Value: %d ', uninitializedVariable); // Using uninitialized variable return 0; }
Výstup:
Some random value (varies each time)
Vysvětlení:
V tomto příkladu je hodnota an neinicializovaná proměnná může být jakákoli náhodná hodnota vybraná náhodně z oblasti paměti určené pro tuto proměnnou.
Podívejme se na rozdíly mezi dobou kompilace a runtime:
Doba kompilace | Doba běhu |
---|---|
Chyby v době kompilace jsou chyby, které vznikají v době kompilace a jsou detekovány kompilátorem. | Runtime chyby jsou chyby, které nejsou generovány kompilátorem a vedou k nepředvídatelným výsledkům v době provádění. |
V tomto případě kompilátor zabrání spuštění kódu, pokud zjistí chybu v programu. | V tomto případě kompilátor nezjistí chybu, takže nemůže zabránit spuštění kódu. |
Obsahuje syntaktické a sémantické chyby, jako je chybějící středník na konci příkazu. | Obsahuje chyby, jako je dělení nulou, určující druhou odmocninu záporného čísla. |
Příklad chyby při kompilaci
#include int main() { int a=20; printf('The value of a is : %d',a): return 0; }
Ve výše uvedeném kódu jsme se pokusili vytisknout hodnotu 'a', ale vyvolá to chybu. Dvojtečku vložíme na konec příkazu místo středníku, takže tento kód generuje chybu při kompilaci.
Výstup
Příklad chyby za běhu
#include int main() { int a=20; int b=a/0; // division by zero printf('The value of b is : %d',b): return 0; }
Ve výše uvedeném kódu se snažíme vydělit hodnotu 'b' nulou a to vyvolá chybu běhu.
Výstup
Závěr:
Na závěr období od vývoj softwaru známý jako kompilace a runtime chyby jsou samostatné a každý má jedinečnou sadu chyby k tomu může dojít. Chyby v době kompilace dojde, když je kód během kompilace převeden do spustitelné podoby. Mezi tyto chyby patří sémantické chyby , které produkují nelogický nebo absurdní kód , a syntaktické chyby , které jsou v rozporu se zákony programovacího jazyka. Tyto chyby jsou identifikovány pomocí kompilátor a hlášeno, blokování exekuce kódu, dokud nebudou opraveny.
Na druhou stranu, runtime chyby vyskytují, když je program spuštěn a nejsou zachyceny kompilátorem. Mohou vyplývat z několika podmínek, včetně dělení nulou, chybný přístup do paměti , nebo jiné nepředvídané události. Runtime chyby jsou obtížnější odhalit a ladit, protože často vedou ke zhroucení programu nebo neočekávanému chování. Vývojáři používají k elegantní správě runtime chyb a zaručení stability programu techniky zpracování chyb jako zpracování výjimek .