logo

Време компајлирања у односу на време извођења

Цомпиле-тиме и Рунтиме су два програмска термина која се користе у развоју софтвера. Време компајлирања је време у којем се изворни код претвара у извршни код, док је време извођења време када извршни код почиње да се покреће. И време компајлирања и време извођења односе се на различите врсте грешака.

Грешке у времену превођења

Грешке у времену компајлирања су грешке које су настале када напишемо погрешну синтаксу. Ако напишемо погрешну синтаксу или семантику било ког програмског језика, компајлер ће бацити грешке у време компајлирања. Компајлер неће дозволити покретање програма док се све грешке не уклоне из програма. Када се све грешке уклоне из програма, компајлер ће генерисати извршну датотеку.

Грешке у времену компајлирања могу бити:

  • Синтаксне грешке
  • Семантичке грешке

Синтаксне грешке

Када програмер не прати синтаксу ниједног програмског језика, онда ће компајлер избацити синтаксичку грешку.

На пример,

инт а, б:

Горња декларација генерише грешку у времену компајлирања као у Ц, свака изјава се завршава тачком и зарезом, али стављамо двотачку (:) на крај изјаве.

Семантичке грешке

Семантичке грешке постоје када искази немају значење за компајлер.

јава за паузу

На пример,

а+б=ц;

Горња изјава изазива грешке у времену компајлирања. У горњој изјави, ми додељујемо вредност 'ц' збиру 'а' и 'б' што није могуће у програмском језику Ц јер може садржати само једну променљиву лево од оператора додељивања док десно од оператор доделе може да садржи више од једне променљиве.

Горња изјава се може поново написати као:

ц=а+б;

Рунтиме еррорс

Грешке током извођења су грешке које се јављају током извршавања и након компилације. Примери грешака током извршавања су дељење са нулом, итд. Ове грешке није лако открити јер компајлер не указује на те грешке.

Хајде да истражимо неке типичне Ц Врсте грешака током извршавања, случајеви , и њихове могуће последице.

Дељење нулом:

Пошто је дељење нулом математички недефинисан , покушавајући да подели цео број са нула доводи до а грешка у раду . Ова грешка узрокује пад програма или стварање изузетка. Ево примера:

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

У горњем коду покушавамо да поделимо вредност 'б' са нулом, а то доводи до грешке у току извођења.

Излаз

Време компајлирања у односу на време извођења

Закључак:

У закључку, периоди од развој софтвера познат као време компајлирања и грешке у току извођења су одвојене и свака има јединствен скуп грешке до тога може доћи. Грешке у времену превођења се дешава када се код конвертује у извршни облик током корака компилације. Ове грешке укључују семантичке грешке , који производе нелогично или апсурдни код , и синтаксне грешке , који су у супротности са законима програмског језика. Ове грешке су идентификоване помоћу компајлер и пријавио, блокирање извршења кода док се не поправе.

С друге стране, грешке у току извођења настају када је програм покренут и компајлер их не ухвати. Они могу бити резултат неколико услова, укључујући дељење са нулом, погрешан приступ меморији , или других непредвиђених догађаја. Рунтиме еррорс теже је открити и отклонити грешке јер често доводе до пада програма или неочекиваног понашања. Програмери користе како би елегантно управљали грешкама током извршавања и гарантовали стабилност програма технике руковања грешкама као Изузетак руковање .