logo

Време за компилиране срещу време за изпълнение

Времето за компилиране и времето за изпълнение са двата програмни термина, използвани в разработката на софтуер. Времето за компилиране е времето, в което изходният код се преобразува в изпълним код, докато времето за изпълнение е времето, в което изпълнимият код започва да се изпълнява. Както времето за компилиране, така и времето за изпълнение се отнасят до различни видове грешки.

Грешки по време на компилиране

Грешките по време на компилиране са грешките, възникнали, когато напишем грешен синтаксис. Ако напишем грешен синтаксис или семантика на който и да е език за програмиране, тогава грешките по време на компилиране ще бъдат хвърлени от компилатора. Компилаторът няма да позволи изпълнението на програмата, докато всички грешки не бъдат отстранени от програмата. Когато всички грешки бъдат премахнати от програмата, компилаторът ще генерира изпълнимия файл.

Грешките по време на компилиране могат да бъдат:

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

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

Когато програмистът не следва синтаксиса на който и да е език за програмиране, тогава компилаторът ще изведе синтаксичната грешка.

Например,

int a, b:

Горната декларация генерира грешка по време на компилиране, както в C, всеки израз завършва с точка и запетая, но поставяме двоеточие (:) в края на израза.

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

Семантичните грешки съществуват, когато изразите нямат смисъл за компилатора.

обработка на низове в c++

Например,

a+b=c;

Горният израз хвърля грешки по време на компилиране. В горния израз ние присвояваме стойността на 'c' на сумата от 'a' и 'b', което не е възможно в езика за програмиране C, тъй като може да съдържа само една променлива отляво на оператора за присвояване, докато отдясно на операторът за присвояване може да съдържа повече от една променлива.

Горното твърдение може да бъде пренаписано като:

ограничения на електронното банкиране

c=a+b;

Грешки по време на изпълнение

Грешките по време на изпълнение са грешките, които възникват по време на изпълнението и след компилирането. Примерите за грешки по време на изпълнение са деление на нула и т.н. Тези грешки не са лесни за откриване, тъй като компилаторът не ги посочва.

Нека разгледаме някои типични C типове грешки по време на изпълнение, случаи и техните възможни ефекти.

Деление на нула:

Тъй като делението на нула е математически неопределим , опитвайки се да раздели цяло число на нула води до а грешка по време на изпълнение . Тази грешка причинява срив на програмата или генерира изключение. Ето един пример:

 #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 е извън границите на масива, когато програмата се опитва да получи достъп до него. В резултат на това а възниква грешка в сегментирането , и програмата завършва с грешка.

"формулата на зидаря"

Дереференция на нулев указател:

А грешка по време на изпълнение се случва, когато се опитате да получите достъп до a паметта на нулевия указател адрес, който е известен като дерефериране нулев указател. Достъпът до нулеви указатели води до непредвидимо поведение, тъй като те не сочат към законни места в паметта . Ето един пример:

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

Изход:

 Segmentation fault (core dumped) 

Обяснение:

Опитът да се дереференция нулев указател води до a грешка в сегментацията , което води до срив на програмата със съобщение за грешка.

Препълване на стека:

А препълване на стека се случва, когато стекът за повиквания стане по-голям от предвиденото, съдържащ информация за извиквания на функции. Ан безкрайна рекурсия обикновено се получава, когато рекурсивните функции нямат подходящи критерии за прекратяване. Ето един пример:

 #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) 

Обяснение:

В този пример стойността на an неинициализирана променлива може да бъде всяка произволна стойност, избрана на случаен принцип от областта на паметта, определена за тази променлива.

Нека да разгледаме разликите между време на компилиране и време на изпълнение:

Време за компилиране Време за изпълнение
Грешките по време на компилиране са грешките, които се генерират по време на компилиране и се откриват от компилатора. Грешките по време на изпълнение са грешки, които не се генерират от компилатора и водят до непредсказуем резултат по време на изпълнение.
В този случай компилаторът предотвратява изпълнението на кода, ако открие грешка в програмата. В този случай компилаторът не открива грешката, така че не може да попречи на кода да се изпълни.
Той съдържа синтактични и семантични грешки, като например липсваща точка и запетая в края на израза. Съдържа грешки като деление на нула, определяне на корен квадратен от отрицателно число.

Пример за грешка по време на компилиране

dhl значение
 #include int main() { int a=20; printf('The value of a is : %d',a): return 0; } 

В горния код се опитахме да отпечатаме стойността на „a“, но тя извежда грешка. Поставяме двоеточието в края на израза вместо точка и запетая, така че този код генерира грешка по време на компилиране.

Изход

Време за компилиране срещу време за изпълнение

Пример за грешка по време на изпълнение

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

В горния код се опитваме да разделим стойността на 'b' на нула и това извежда грешка по време на изпълнение.

Изход

Време за компилиране срещу време за изпълнение

Заключение:

В заключение, периодите на разработване на софтуер познат като време за компилиране и грешки по време на изпълнение са отделни и всеки има уникален набор от грешки това може да се случи. Грешки по време на компилиране се случи, когато кодът се преобразува в изпълнима форма по време на стъпката на компилация. Тези грешки включват семантични грешки , които произвеждат нелогично или абсурден код , и синтактични грешки , които противоречат на законите на езика за програмиране. Тези грешки се идентифицират от компилатор и съобщи, блокиране на изпълнението на кода, докато не бъдат коригирани.

От друга страна, грешки по време на изпълнение възникват, когато програмата работи и не се улавят от компилатора. Те могат да бъдат резултат от няколко условия, включително деление на нула, грешен достъп до паметта , или други непредвидени събития. Грешки по време на изпълнение са по-трудни за откриване и отстраняване на грешки, тъй като често водят до сривове на програмата или неочаквано поведение. За да управляват елегантно грешките по време на изпълнение и да гарантират стабилността на програмата, разработчиците използват техники за справяне с грешки като обработка на изключения .