Цомпиле-тиме и Рунтиме су два програмска термина која се користе у развоју софтвера. Време компајлирања је време у којем се изворни код претвара у извршни код, док је време извођења време када извршни код почиње да се покреће. И време компајлирања и време извођења односе се на различите врсте грешака.
Грешке у времену превођења
Грешке у времену компајлирања су грешке које су настале када напишемо погрешну синтаксу. Ако напишемо погрешну синтаксу или семантику било ког програмског језика, компајлер ће бацити грешке у време компајлирања. Компајлер неће дозволити покретање програма док се све грешке не уклоне из програма. Када се све грешке уклоне из програма, компајлер ће генерисати извршну датотеку.
Грешке у времену компајлирања могу бити:
- Синтаксне грешке
- Семантичке грешке
Синтаксне грешке
Када програмер не прати синтаксу ниједног програмског језика, онда ће компајлер избацити синтаксичку грешку.
На пример,
инт а, б:
Горња декларација генерише грешку у времену компајлирања као у Ц, свака изјава се завршава тачком и зарезом, али стављамо двотачку (:) на крај изјаве.
Семантичке грешке
Семантичке грешке постоје када искази немају значење за компајлер.
јава за паузу
На пример,
а+б=ц;
Горња изјава изазива грешке у времену компајлирања. У горњој изјави, ми додељујемо вредност 'ц' збиру 'а' и 'б' што није могуће у програмском језику Ц јер може садржати само једну променљиву лево од оператора додељивања док десно од оператор доделе може да садржи више од једне променљиве.
Горња изјава се може поново написати као:
ц=а+б;
Рунтиме еррорс
Грешке током извођења су грешке које се јављају током извршавања и након компилације. Примери грешака током извршавања су дељење са нулом, итд. Ове грешке није лако открити јер компајлер не указује на те грешке.
Хајде да истражимо неке типичне Ц Врсте грешака током извршавања, случајеви , и њихове могуће последице.
Дељење нулом:
Пошто је дељење нулом математички недефинисан , покушавајући да подели цео број са нула доводи до а грешка у раду . Ова грешка узрокује пад програма или стварање изузетка. Ево примера:
#include int main() { int a = 10; int b = 0; int result = a / b; // Division by zero printf('Result: %d ', result); return 0; }
Излаз:
Floating point exception (core dumped)
Објашњење:
А „Изузетак са плутајућим зарезом“ порука о грешци се производи када програм наиђе на проблем током извршавања због дељења са нулом.
Приступ низу ван граница:
А грешка у раду настаје када се елементу низа приступа ван одређених граница. Грешка се дешава када је индекс већи од величине низа и када су закони о приступу меморији прекршени. Ево примера:
#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; }
Излаз:
Segmentation fault (core dumped)
Објашњење:
Елемент ат индекс 10 је изван граница низа када програм покуша да му приступи. Као резултат тога, а долази до грешке сегментације , а програм се завршава са грешком.
Нулл Поинтер Дереференце:
А грешка у раду се дешава када покушате да приступите а нулта меморија показивача адреса, која је позната као дереференцирање нулти показивач. Приступ нултим показивачима резултира непредвидивим понашањем јер не указују на легитимне меморијске локације . Ево примера:
нп.меан
#include int main() { int* ptr = NULL; // Null pointer int value = *ptr; // Null pointer dereference printf('Value: %d ', value); return 0; }
Излаз:
Segmentation fault (core dumped)
Објашњење:
Покушај да се дереференцирање нулти показивач резултира а грешка сегментације , што узрокује пад програма са поруком о грешци.
Стацк Оверфлов:
А стек оверфлов се дешава када стек позива постане већи од предвиђеног, који садржи информације о позивима функција. Ан бесконачна рекурзија обично резултира када рекурзивним функцијама недостају одговарајући критеријуми завршетка. Ево примера:
#include void recursiveFunction() { recursiveFunction(); // Recursive call without termination condition } int main() { recursiveFunction(); return 0; }
Излаз:
Segmentation fault (core dumped)
Објашњење:
Програм почиње а бескрајна рекурзија , који преплављује стек и узрокује грешку сегментације.
Неискоришћене променљиве:
Јер неиницијализоване варијабле имати недефинисане вредности , њихово коришћење може довести до грешака у извршавању. Програм би могао да пружи изненађујуће резултате или пад, у зависности од околности. Ево примера:
#include int main() { int uninitializedVariable; printf('Value: %d ', uninitializedVariable); // Using uninitialized variable return 0; }
Излаз:
Some random value (varies each time)
Објашњење:
У овом примеру, вредност ан неиницијализована променљива може бити било која насумично изабрана вредност из меморијског региона одређеног за ту променљиву.
Хајде да погледамо разлике између времена компајлирања и времена извођења:
Време компајлирања | Рунтиме |
---|---|
Грешке у време компајлирања су грешке које настају у време компајлирања, а детектује их компајлер. | Грешке током извршавања су грешке које не генерише компајлер и дају непредвидив резултат у време извршења. |
У овом случају, компајлер спречава извршавање кода ако открије грешку у програму. | У овом случају, компајлер не детектује грешку, тако да не може да спречи извршење кода. |
Садржи синтаксне и семантичке грешке као што је недостатак тачке и зареза на крају изјаве. | Садржи грешке као што је дељење нулом, одређивање квадратног корена негативног броја. |
Пример грешке у времену компајлирања
стринг у цхар јава
#include int main() { int a=20; printf('The value of a is : %d',a): return 0; }
У горњем коду смо покушали да одштампамо вредност 'а', али је испала грешка. Стављамо двотачку на крај наредбе уместо тачке и зареза, тако да овај код генерише грешку у време компајлирања.
Излаз
Пример грешке у току рада
#include int main() { int a=20; int b=a/0; // division by zero printf('The value of b is : %d',b): return 0; }
У горњем коду покушавамо да поделимо вредност 'б' са нулом, а то доводи до грешке у току извођења.
Излаз
Закључак:
У закључку, периоди од развој софтвера познат као време компајлирања и грешке у току извођења су одвојене и свака има јединствен скуп грешке до тога може доћи. Грешке у времену превођења се дешава када се код конвертује у извршни облик током корака компилације. Ове грешке укључују семантичке грешке , који производе нелогично или апсурдни код , и синтаксне грешке , који су у супротности са законима програмског језика. Ове грешке су идентификоване помоћу компајлер и пријавио, блокирање извршења кода док се не поправе.
С друге стране, грешке у току извођења настају када је програм покренут и компајлер их не ухвати. Они могу бити резултат неколико услова, укључујући дељење са нулом, погрешан приступ меморији , или других непредвиђених догађаја. Рунтиме еррорс теже је открити и отклонити грешке јер често доводе до пада програма или неочекиваног понашања. Програмери користе како би елегантно управљали грешкама током извршавања и гарантовали стабилност програма технике руковања грешкама као Изузетак руковање .