Відповіді:
Різниця між часом компіляції та часом виконання - приклад того, що точкові теоретики називають розрізнення фаз . Це одна з найскладніших концепцій для вивчення, особливо для людей, які не мають досвіду в мовах програмування. Щоб підійти до цієї проблеми, мені здається запитати
Що може піти не так - це помилки під час виконання :
Також можуть бути помилки, виявлені самою програмою:
Я думаю про це з точки зору помилок і коли їх можна спіймати.
Час компіляції:
string my_value = Console.ReadLine();
int i = my_value;
Значення рядка не може бути призначено змінною типу int, тому компілятор напевно знає, що під час компіляції проблема з цим кодом
Час виконання:
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
Тут результат залежить від того, який рядок був повернутий ReadLine (). Деякі значення можна проаналізувати на int, інші - не. Це можна визначити лише під час виконання
.app
розширення? або це відбувається при запуску кожного разу, коли користувач запускає додаток?
Час компіляції: період часу, протягом якого ви, розробник, збираєте свій код.
Час виконання: період часу, у який користувач працює за вашим програмним забезпеченням.
Чи потрібне вам чіткіше визначення?
int x = 3/0
але ви нічого не робите з цією змінною. Ми не друкуємо його чи щось. Це все ще вважатиметься помилкою виконання?
( редагувати : наступне стосується C # та подібних, сильно набраних мов програмування. Я не впевнений, чи допоможе це вам).
Наприклад, компілятор (під час компіляції ) виявить наступну помилку перед запуском програми і призведе до помилки компіляції:
int i = "string"; --> error at compile-time
З іншого боку, компілятор не може виявити помилку на зразок наступної. Ви отримаєте помилку / виняток під час виконання програми (коли програма працює).
Hashtable ht = new Hashtable();
ht.Add("key", "string");
// the compiler does not know what is stored in the hashtable
// under the key "key"
int i = (int)ht["key"]; // --> exception at run-time
Переклад вихідного коду в речі, що відбуваються на екрані [екран | диск | мережа] може відбуватися (приблизно) двома способами; називати їх складанням та тлумаченням.
У складеній програмі (приклади c і fortran):
Кажуть, що речі, що відбуваються на першому кроці, трапляються в "час компіляції", а речі, що відбуваються на другому кроці, відбуваються в "час виконання".
У інтерпретованій програмі (приклад MicroSoft basic (на dos) та python (я думаю)):
У цьому випадку різницю між часом компіляції та часом запуску набагато важче встановити, і набагато менше стосується програміста чи користувача.
Java - це свого роду гібрид, де код збирається в байт-код, який потім працює на віртуальній машині, яка зазвичай є інтерпретатором байт-коду.
Існує також проміжний випадок, коли програма збирається в байт-код і запускається негайно (як у awk або perl).
В основному, якщо ваш компілятор може розібратися, що ви маєте на увазі або яке значення "під час компіляції", він може жорстко вписати це в код виконання. Очевидно, якщо ваш код виконання повинен робити обчислення кожного разу, коли він буде працювати повільніше, тому якщо ви можете визначити щось під час компіляції, це набагато краще.
Напр.
Постійне складання:
Якщо я напишу:
int i = 2;
i += MY_CONSTANT;
Компілятор може виконати цю оцінку під час компіляції, оскільки він знає, що таке 2, а що таке MY_CONSTANT. Як такий, він рятує себе від виконання розрахунку кожного виконання.
Речі, які виконуються за час компіляції, не мають (майже) витрат при запуску отриманої програми, але можуть створювати великі витрати при складанні програми.
Більш-менш навпаки. Маленька вартість, коли ви будуєте, більша вартість при запуску програми.
З іншого боку; Якщо щось робиться під час компіляції, він працює лише на вашій машині, а якщо щось працює, він працює на вашій машині користувачів.
Прикладом того, де це важливо, може бути тип носіння одиниць. Часова версія компіляції (наприклад, Boost.Units або моя версія в D ) закінчується так само швидко, як і вирішення проблеми з нативним кодом з плаваючою точкою, тоді як версія запущеної версії закінчується необхідністю упакувати інформацію про одиниці, які є значенням і виконувати перевірки в них поряд з кожною операцією. З іншого боку, версії часу компіляції вимагають, щоб одиниці значень були відомі під час компіляції та не могли мати справу з тим випадком, коли вони надходять із введення часу виконання.
Виходячи з попередньої аналогічної відповіді на питання У чому різниця між помилкою виконання та помилкою компілятора?
Компіляція / Час компіляції / Синтаксис / Семантичні помилки: Помилки компіляції чи часу компіляції - помилка, яка виникає через помилку введення тексту, якщо ми не дотримуємося належного синтаксису та семантики будь-якої мови програмування, тоді компілятор скидає помилки часу. Вони не дозволять вашій програмі виконати один рядок, поки ви не видалите всі синтаксичні помилки або поки не налагодите помилки часу компіляції.
Приклад: пропущено крапку з комою в C або заглушення int
як Int
.
Помилки під час виконання: Помилки виконання - це помилки, які генеруються, коли програма перебуває у запущеному стані. Ці типи помилок можуть призвести до того, що ваша програма поводиться несподівано або навіть може вбити вашу програму. Їх часто називають винятками.
Приклад: Припустимо, що ви читаєте файл, який не існує, це призведе до помилки виконання.
Детальніше про всі помилки програмування читайте тут
Ось як доповнення до інших відповідей, ось як я пояснив це непростому:
Ваш вихідний код схожий на план корабля. Він визначає, як слід виготовити судно.
Якщо ви передасте креслення на верфі, і вони виявлять дефект при будівництві корабля, вони припинять будівництво і повідомлять вам про це негайно, перш ніж корабель коли-небудь залишить суху дошку або торкнувся води. Це помилка часу компіляції. Корабель ніколи навіть фактично не плавав чи не використовував свої двигуни. Помилку було знайдено, оскільки вона завадила навіть зробити судно.
Коли ваш код збирається, це як би корабель завершено. Збудований і готовий до роботи. Коли ви виконуєте свій код, це як запуск корабля в плавання. Пасажири сідають на борт, двигуни працюють, а корпус - на воді, тому це час виконання. Якщо ваш корабель має фатальний недолік, який занурює його в дівоче плавання (або, можливо, якесь подорож після додаткових головних болів), він зазнав помилки під час виконання.
Наприклад: У сильно набраній мові тип можна перевірити під час компіляції або під час виконання. Під час компіляції це означає, що компілятор скаржиться, якщо типи не сумісні. Під час виконання означає, що ви можете скласти свою програму просто чудово, але під час виконання вона викидає виняток.
час компіляції: розробник записує програму у форматі .java та перетворює у байт-код, який є файлом класу, під час цієї компіляції будь-яка помилка може бути визначена як помилка часу компіляції.
Час виконання: Створений .class файл використовується додатком для його додаткової функціональності; логіка виявляється помилковою і видає помилку, яка є помилкою часу виконання.
Ось цитата Даніеля Лянга, автора «Введення в програмування JAVA» на тему складання:
"Програма, написана мовою високого рівня, називається вихідною програмою або вихідним кодом. Оскільки комп'ютер не може виконати вихідну програму, вихідну програму необхідно перевести в машинний код для виконання . Переклад можна зробити за допомогою іншого інструмента програмування, який називається перекладач або упорядник ". (Даніель Лян, «Вступ до програмування JAVA» , с. 8).
... Він продовжується ...
"Компілятор переводить весь вихідний код у файл машинного коду , а потім файл машинного коду виконується"
Коли ми забиваємо код високого рівня читання для людини, це спочатку марно! Це потрібно перекласти в послідовність "електронних подій" у вашому маленькому процесорі! Перший крок до цього - компіляція.
Простіше кажучи: помилка під час компіляції трапляється під час цієї фази, тоді як помилка під час виконання відбувається.
Пам'ятайте: Тільки тому, що програма складена без помилок, не означає, що вона запуститься без помилок.
Помилка під час виконання буде виникати в готовій, запущеній або очікуваній частині життєвого циклу програм, тоді як помилка часу компіляції відбуватиметься до "нового" етапу життєвого циклу.
Приклад помилки часу компіляції:
Помилка синтаксису - як ваш код можна скласти в інструкції на машинному рівні, якщо вони неоднозначні ?? Ваш код повинен відповідати на 100% синтаксичним правилам мови, інакше він не може бути скомпільований у робочий машинний код .
Приклад помилки під час виконання:
Вичерпання пам’яті. Виклик на рекурсивну функцію, наприклад, може призвести до переповнення стека, заданого змінною певного ступеня! Як це може передбачити компілятор !? він не може.
І це різниця між помилкою часу компіляції та помилкою виконання
Час компіляції:
Речі, які виконуються за час компіляції, не мають (майже) витрат при запуску отриманої програми, але можуть створювати великі витрати при складанні програми. Час виконання:
Більш-менш навпаки. Маленька вартість, коли ви будуєте, більша вартість при запуску програми.
З іншого боку; Якщо щось робиться під час компіляції, він працює лише на вашій машині, а якщо щось працює, він працює на вашій машині користувачів.
Час компіляції: час, необхідний для перетворення вихідного коду в машинний код, щоб він став виконуваним, називається часом компіляції.
Час виконання: Коли програма працює, вона називається часом виконання.
Помилки часу компіляції - це синтаксичні помилки, відсутні помилки посилань на файли. Помилки під час виконання трапляються після того, як вихідний код був зібраний у виконувану програму і під час роботи програми. Прикладами є збої програми, несподівана поведінка програми чи функції не працюють.
Уявіть, що ви начальник, у вас є помічник і служниця, і ви даєте їм список завдань, які потрібно виконати, помічник (час складання) захопить цей список і зробить перевірку, щоб зрозуміти, чи завдання зрозумілі і що ви не писав жодною незграбною мовою чи синтаксисом, тому він розуміє, що ви хочете призначити когось на роботу, щоб він призначив його за вас, і він зрозумів, що ви хочете кави, тому його роль закінчена і служниця (час роботи) починає виконувати ці завдання, тож вона йде приготувати вам каву, але раптом не знаходить кави, щоб зробити так, що вона перестає її робити, або вона діє по-іншому і заварює вам чай (коли програма діє інакше, тому що виявила помилку ).
Ось розширення до відповіді на питання "різниця між часом виконання та компіляцією?" - Відмінності накладних витрат пов'язаних з часом виконання та компіляцією?
Продуктивність роботи виробу сприяє його якості, швидше забезпечуючи результати. Продуктивність продукту за час збирання сприяє його своєчасності за рахунок скорочення циклу редагування-збирання-налагодження. Однак і продуктивність, і час виконання, і час компіляції є вторинними факторами досягнення своєчасної якості. Тому слід враховувати поліпшення продуктивності та часу збирання лише тоді, коли це виправдано поліпшенням загальної якості продукції та своєчасності.
Чудове джерело для подальшого читання тут :
Я завжди думав про це відносно накладних обробок програм і про те, як це впливає на швидкість виконання, як було сказано раніше. Простим прикладом може бути або визначення абсолютної пам'яті, необхідної для мого об’єкта в коді, або ні.
Визначений булевий формат займає пам'ять x, це потім у складеній програмі і не може бути змінений. Коли програма працює, вона точно знає, скільки пам'яті виділити для x.
З іншого боку, якщо я просто визначу родовий тип об'єкта (тобто вид невизначеного власника місця або, можливо, вказівник на якусь гігантську крапку), фактична пам'ять, необхідна для мого об’єкта, не відома до запуску програми, і я не призначу щось , таким чином, потім необхідно оцінити, а розподіл пам’яті тощо буде потім динамічно оброблятися під час виконання (більше витрат часу).
Яке динамічне поводження буде залежати від мови, компілятора, ОС, вашого коду тощо.
Однак на цій замітці це дійсно залежить від контексту, в якому ви використовуєте час запуску та час компіляції.
ми можемо класифікувати їх під різними двома широкими групами статичного зв'язування та динамічного зв'язування. Він заснований на тому, коли зв'язування проводиться з відповідними значеннями. Якщо посилання вирішуються під час компіляції, то воно є статичним зв'язуванням, а якщо посилання вирішуються під час виконання, то це динамічне прив'язування. Статичне зв'язування та динамічне зв'язування також називають ранньою і пізньою зв'язуванням. Іноді їх також називають статичним поліморфізмом і динамічним поліморфізмом.
Йосиф Куландай.
Основна різниця між часом виконання та компіляцією:
int a = 1
int b = a/0;
тут перший рядок не має напівкрапки в кінці ---> помилка часу компіляції після виконання програми під час виконання операції b, результат нескінченний ---> помилка виконання.
ось дуже проста відповідь:
Час виконання та час компіляції - це терміни програмування, які стосуються різних етапів розробки програмних програм. Для того, щоб створити програму, розробник спочатку записує вихідний код, який визначає, як програма буде функціонувати. Невеликі програми можуть містити лише кілька сотень рядків вихідного коду, тоді як великі програми можуть містити сотні тисяч рядків вихідного коду. Вихідний код повинен бути складений у машинний код, щоб стати та виконуваною програмою. Цей процес компіляції називається часом компіляції. (Подумайте про компілятора як про перекладача)
Скомпільовану програму може відкрити та запустити користувач. Коли програма працює, вона називається час виконання.
Терміни "час виконання" та "час компіляції" програмісти часто використовують для позначення різних типів помилок. Помилка часу компіляції - така проблема, як синтаксична помилка або відсутня посилання на файл, яка заважає програмі успішно компілювати. Компілятор створює помилки часу компіляції і зазвичай вказує, який рядок вихідного коду викликає проблему.
Якщо вихідний код програми вже був зібраний у виконувану програму, він все ще може мати помилки, які виникають під час роботи програми. Приклади включають функції, які не працюють, несподіване поведінку програми або збої програми. Такі типи проблем називаються помилками виконання, оскільки вони виникають під час виконання.
ІМХО вам потрібно прочитати багато посилань, ресурсів, щоб скласти уявлення про різницю між часом виконання та компіляції, оскільки це дуже складна тема. У мене є список нижче цих зображень / посилань, які я рекомендую.
Окрім сказаного вище, хочу додати, що іноді малюнок вартує 1000 слів:
CLR_diag збирає час, а потім час виконання2
from Wiki
https://en.wikipedia.org/wiki/Run_time https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)
Час виконання, час виконання або час виконання може стосуватися:
Обчислення
Час виконання (фаза життєвого циклу програми) , період, протягом якого виконується комп'ютерна програма
Бібліотека виконання, бібліотека програм, призначена для реалізації функцій, вбудованих у мову програмування
Система виконання , програмне забезпечення, призначене для підтримки виконання комп'ютерних програм
Виконання програмного забезпечення, процес виконання інструкцій по черзі під час фази виконання
Список компіляторів https://en.wikipedia.org/wiki/List_of_compilers
;
3.2 різниця між цими трьома речами: компілювати проти складання проти часу виконання
https://www.quora.com/What-is-the-difference-bet between-build-run-and-compile Фернандо Падоан, розробник, який просто трохи цікавий для мовного дизайну Відповідь 23 лютого. до інших відповідей:
біг - це отримати якийсь двійковий виконуваний файл (або скрипт для інтерпретованих мов), який добре виконаний ... як новий процес на комп'ютері; компіляція - це процес розбору програми, написаної якоюсь мовою високого рівня (вищою порівняно з машинним кодом), перевірка її синтаксису, семантики, зв'язування бібліотек, можливо, деяка оптимізація, а потім створення бінарної виконуваної програми як виводу. Цей виконуваний файл може бути у вигляді машинного коду або якогось байтового коду - тобто інструкцій, орієнтованих на якусь віртуальну машину; побудова зазвичай включає перевірку та надання залежностей, перевірку коду, компіляцію коду у двійкові, запуск автоматизованих тестів та упаковку отриманих бінарних даних та інших активів (зображення, файли конфігурації, бібліотеки тощо) у певний конкретний формат розгорнутого файлу. Зауважте, що більшість процесів є необов’язковими, а деякі залежать від цільової платформи, для якої ви будуєте. Наприклад, упаковка програми Java для Tomcat виведе файл .war. Побудова виконуваного файлу Win32 з коду C ++ може просто вивести програму .exe або також пакувати її всередині інсталятора .msi.
Подивіться на цей приклад:
public class Test {
public static void main(String[] args) {
int[] x=new int[-5];//compile time no error
System.out.println(x.length);
}}
Наведений вище код складено успішно, синтаксичної помилки немає, він цілком дійсний. Але під час запуску це видає наступну помилку.
Exception in thread "main" java.lang.NegativeArraySizeException
at Test.main(Test.java:5)
Як і коли під час компіляції були перевірені певні випадки, після цього час виконання певних випадків перевіряється, як тільки програма задовольняє всі умови, ви отримаєте вихід. В іншому випадку ви отримаєте час компіляції або помилку часу запуску.
публічний клас RuntimeVsCompileTime {
public static void main(String[] args) {
//test(new D()); COMPILETIME ERROR
/**
* Compiler knows that B is not an instance of A
*/
test(new B());
}
/**
* compiler has no hint whether the actual type is A, B or C
* C c = (C)a; will be checked during runtime
* @param a
*/
public static void test(A a) {
C c = (C)a;//RUNTIME ERROR
}
}
class A{
}
class B extends A{
}
class C extends A{
}
class D{
}
Це не гарне питання для SO (це не конкретне питання програмування), але це не погане питання взагалі.
Якщо ви думаєте, що це тривіально: як щодо часу читання проти компіляції, і коли це корисна відмінність? А що з мовами, де компілятор доступний під час виконання? Гай Стіл (не манекен, він) написав 7 сторінок в CLTL2 про EVAL-WHEN, які програмісти CL можуть використовувати для управління цим. 2 речення ледве вистачає на визначення , яке саме по собі далеко не пояснює .
Взагалі, це складна проблема, якої, схоже, намагаються уникати мовні дизайнери. Вони часто просто кажуть: "Ось компілятор, він робить компіляцію часу; все після цього - час виконання, весело". C розроблений таким чином, щоб бути простим у виконанні, а не найбільш гнучким середовищем для обчислень. Якщо у вас немає компілятора, доступного під час виконання, або можливості легко керувати, коли вираження оцінюється, ви, як правило, стикаєтесь з хаками на мові, щоб підробити звичайні способи використання макросів, або користувачі придумують шаблони дизайну для імітації. маючи більш потужні конструкції. Проста у впровадженні мова, безумовно, може бути гідною ціллю, але це не означає, що це все-таки бути всім дизайном мови програмування. (Я не використовую EVAL-WHEN багато, але не можу уявити життя без цього.)
І проблемний простір навколо часу компіляції та часу виконання є величезним і все ще значною мірою не вивчений. Це не означає, що ТАК - це правильне місце для дискусії, але я закликаю людей вивчати цю територію далі, особливо тих, хто не має попередніх уявлень про те, якою вона має бути. Питання не є ані простим, ані дурним, і ми могли б принаймні вказати інквізитора в правильному напрямку.
На жаль, я не знаю жодних хороших посилань на це. CLTL2 трохи про це говорить, але це не чудово, щоб дізнатися про це.