logo

Czas kompilacji a czas wykonania

Czas kompilacji i czas wykonania to dwa terminy programistyczne używane przy tworzeniu oprogramowania. Czas kompilacji to czas, w którym kod źródłowy jest konwertowany na kod wykonywalny, natomiast czas wykonania to czas, w którym rozpoczyna się działanie kodu wykonywalnego. Zarówno czas kompilacji, jak i czas wykonania odnoszą się do różnych typów błędów.

Błędy w czasie kompilacji

Błędy czasu kompilacji to błędy, które wystąpiły, gdy napiszemy niewłaściwą składnię. Jeśli napiszemy błędną składnię lub semantykę dowolnego języka programowania, kompilator wyrzuci błędy w czasie kompilacji. Kompilator nie pozwoli na uruchomienie programu, dopóki wszystkie błędy nie zostaną usunięte z programu. Kiedy wszystkie błędy zostaną usunięte z programu, kompilator wygeneruje plik wykonywalny.

macierz w języku c

Błędy w czasie kompilacji mogą być następujące:

  • Błędy składniowe
  • Błędy semantyczne

Błędy składniowe

Jeśli programista nie zastosuje się do składni żadnego języka programowania, kompilator zgłosi błąd składniowy.

Na przykład,

int a, b:

Powyższa deklaracja generuje błąd kompilacji tak jak w C, każda instrukcja kończy się średnikiem, ale na końcu instrukcji stawiamy dwukropek (:).

Błędy semantyczne

Błędy semantyczne występują, gdy instrukcje nie mają znaczenia dla kompilatora.

Na przykład,

a+b=c;

Powyższa instrukcja generuje błędy w czasie kompilacji. W powyższym stwierdzeniu przypisujemy wartość „c” sumie „a” i „b”, co nie jest możliwe w języku programowania C, ponieważ może zawierać tylko jedną zmienną po lewej stronie operatora przypisania, a po prawej stronie operator przypisania może zawierać więcej niż jedną zmienną.

Powyższe stwierdzenie można przepisać jako:

c=a+b;

Błędy czasu wykonania

Błędy wykonawcze to błędy, które pojawiają się podczas wykonywania i po kompilacji. Przykładami błędów wykonawczych jest dzielenie przez zero itp. Błędy te nie są łatwe do wykrycia, ponieważ kompilator nie wskazuje na te błędy.

Przyjrzyjmy się typowym C typy błędów wykonania, przypadki i ich możliwe skutki.

Dzielenie przez zero:

Ponieważ dzielenie przez zero to matematycznie niedefiniowalne , próbując podzielić liczbę całkowitą przez zero prowadzi do błąd wykonania . Ten błąd powoduje awarię programu lub wygenerowanie wyjątku. Oto przykład:

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

Wyjście:

hashset vs hashmap
 Floating point exception (core dumped) 

Wyjaśnienie:

A „Wyjątek zmiennoprzecinkowy” komunikat o błędzie jest generowany, gdy program napotka problem w czasie wykonywania z powodu dzielenia przez zero.

Dostęp do tablicy poza granicami:

A błąd wykonania występuje, gdy dostęp do elementu tablicy wykracza poza określone limity. Błąd występuje, gdy indeks jest większy niż rozmiar tablicy i łamane są prawa dostępu do pamięci. Oto przykład:

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

Wyjście:

 Segmentation fault (core dumped) 

Wyjaśnienie:

Element przy indeks 10 znajduje się poza granicami tablicy, gdy program próbuje uzyskać do niej dostęp. W rezultacie A występuje błąd segmentacji , a program kończy się błędem.

Dereferencja wskaźnika zerowego:

A błąd wykonania dzieje się, gdy próbujesz uzyskać dostęp do a pamięć wskaźnika zerowego adres, tzw dereferencje wskaźnik zerowy. Dostęp do wskaźników zerowych powoduje nieprzewidywalne zachowanie, ponieważ nie wskazują one legalne lokalizacje pamięci . Oto przykład:

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

Wyjście:

psy półkowe
 Segmentation fault (core dumped) 

Wyjaśnienie:

Próba wyłudzanie wskaźnik zerowy powoduje a błąd segmentacji , co powoduje awarię programu i wyświetlenie komunikatu o błędzie.

Przepełnienie stosu:

A przepełnienie stosu dzieje się, gdy stos wywołań staje się większy niż zamierzony i zawiera informacje o wywołaniach funkcji. Jakiś nieskończona rekurencja zwykle pojawia się, gdy funkcjom rekurencyjnym brakuje odpowiednich kryteriów zakończenia. Oto przykład:

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

Wyjście:

 Segmentation fault (core dumped) 

Wyjaśnienie:

Program uruchamia się niekończąca się rekurencja , co powoduje przepełnienie stosu i powoduje błąd segmentacji.

Nieużywane zmienne:

Ponieważ niezainicjowane zmienne Posiadać niezdefiniowane wartości , użycie ich może spowodować błędy w czasie wykonywania. Program może zapewnić zaskakujące wyniki lub zawiesić się, w zależności od okoliczności. Oto przykład:

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

Wyjście:

 Some random value (varies each time) 

Wyjaśnienie:

W tym przykładzie wartość an niezainicjowana zmienna może być dowolną losową wartością wybraną losowo z obszaru pamięci wyznaczonego dla tej zmiennej.

Przyjrzyjmy się różnicom między czasem kompilacji a czasem wykonania:

Czas kompilacji Czas wykonania
Błędy czasu kompilacji to błędy powstające w czasie kompilacji i wykrywane przez kompilator. Błędy wykonania to błędy, które nie są generowane przez kompilator i powodują nieprzewidywalny wynik w czasie wykonywania.
W takim przypadku kompilator uniemożliwia wykonanie kodu, jeśli wykryje błąd w programie. W takim przypadku kompilator nie wykrywa błędu, więc nie może uniemożliwić wykonania kodu.
Zawiera błędy składniowe i semantyczne, takie jak brak średnika na końcu instrukcji. Zawiera błędy takie jak dzielenie przez zero, wyznaczanie pierwiastka kwadratowego z liczby ujemnej.

Przykład błędu czasu kompilacji

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

W powyższym kodzie próbowaliśmy wydrukować wartość „a”, ale zgłasza to błąd. Zamiast średnika umieszczamy dwukropek na końcu instrukcji, więc ten kod generuje błąd w czasie kompilacji.

Wyjście

Czas kompilacji a czas wykonania

Przykład błędu wykonania

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

W powyższym kodzie próbujemy podzielić wartość „b” przez zero, co powoduje błąd wykonania.

Wyjście

Seria Fibonacciego w Javie
Czas kompilacji a czas wykonania

Wniosek:

Podsumowując, okresy rozwój oprogramowania znany jako czas kompilacji I błędy czasu wykonania są oddzielne i każdy ma unikalny zestaw wady to może się zdarzyć. Błędy w czasie kompilacji ma to miejsce, gdy kod jest konwertowany do postaci wykonywalnej na etapie kompilacji. Błędy te obejmują błędy semantyczne , które produkują nielogiczny Lub absurdalny kod , I błędy składniowe , które są sprzeczne z prawami języka programowania. Błędy te są identyfikowane przez kompilator i zgłosił, blokowanie egzekucji kodu, dopóki nie zostaną naprawione.

Z drugiej strony, błędy czasu wykonania występują, gdy program jest uruchomiony i nie są przechwytywane przez kompilator. Mogą wynikać z kilku warunków, m.in dzielenie przez zero, błędny dostęp do pamięci lub inne nieprzewidziane zdarzenia. Błędy czasu wykonania są trudniejsze do wykrycia i debugowania, ponieważ często powodują awarie programów lub nieoczekiwane zachowanie. Aby elegancko zarządzać błędami czasu wykonania i zagwarantować stabilność programu, programiści używają techniki obsługi błędów tak jak Obsługa wyjątków .