Час виконання проти часу компіляції


370

Яка різниця між часом виконання та компіляцією?


Я навів дуже маленький, але чіткий приклад .... Це не залякує величезними деталями. Після цього всі відповіді можуть бути використані. Вони приголомшливі ...
sankar banerjee

Відповіді:


479

Різниця між часом компіляції та часом виконання - приклад того, що точкові теоретики називають розрізнення фаз . Це одна з найскладніших концепцій для вивчення, особливо для людей, які не мають досвіду в мовах програмування. Щоб підійти до цієї проблеми, мені здається запитати

  1. Яких інваріантів задовольняє програма?
  2. Що може піти не так на цій фазі?
  3. Якщо фаза проходить успішно, то які умови є (що ми знаємо)?
  4. Які входи та виходи, якщо такі є?

Час компіляції

  1. Програма не повинна задовольняти жодних інваріантів. Насправді це взагалі не повинно бути добре сформованою програмою. Ви можете подати цей HTML у компілятор і переглянути його ...
  2. Що може піти не так під час компіляції:
    • Помилки синтаксису
    • Помилки перевірки типу
    • (Рідко) збій компілятора
  3. Якщо компілятор досягає успіху, що ми знаємо?
    • Програма була добре сформована - змістовна програма будь-якою мовою.
    • Можна розпочати запуск програми. (Програма може негайно вийти з ладу, але принаймні ми можемо спробувати.)
  4. Які входи та виходи?
    • Вхідною програмою була компільована програма, а також будь-які файли заголовків, інтерфейси, бібліотеки чи інші вуду, які потрібно було імпортувати для компіляції.
    • Сподіваємось, виходить код збірки або код об'єкта, що переміщується, або навіть виконувана програма. Або якщо щось піде не так, вихід - це купа повідомлень про помилки.

Час виконання

  1. Про інваріанти програми ми нічого не знаємо --- вони є будь-якими програмістами. Інваріанти під час виконання роботи рідко виконуються компілятором; їй потрібна допомога програміста.
  2. Що може піти не так - це помилки під час виконання :

    • Ділення на нуль
    • Перенаправлення нульового вказівника
    • Вичерпано пам'ять

    Також можуть бути помилки, виявлені самою програмою:

    • Спроба відкрити файл, якого там немає
    • Спробуйте знайти веб-сторінку та виявити, що нібито URL-адреса не сформована
  3. Якщо час запуску вдалося, програма закінчується (або продовжує роботу), без збоїв.
  4. Входи та виходи повністю залежать від програміста. Файли, вікна на екрані, мережеві пакети, завдання, що надсилаються на принтер, ви їх називаєте. Якщо програма запускає ракети, це вихід, і це відбувається лише під час виконання :-)

13
Дуже гарна відповідь на те, що він охоплює (+1), проте ви навіть не торкаєтесь мета-програмування аспектів часу компіляції та часу виконання, і це, IMHO, є найбільш цікавою частиною. Я дозволю, враховуючи цю відповідь, що це може бути поза тим, що шукала ОП.
BCS

4
Приємно, якщо хтось запитає мене про це під час моїх лекцій, я скористаюсь вашим прихильником :-)
e-satis

12
Це дійсно приємна відповідь. Це досить чітко і зрозуміло. В Google не так легко знайти такі чіткі відповіді.
Тарік

7
Навіть якщо ви програмували деякий час, це все одно не легко отримати ... це не просто новачок. Гарне запитання з боку ОП.
PositiveGuy

11
"Програма не повинна задовольняти жодних інваріантів. Насправді вона взагалі не повинна бути добре сформованою програмою. Ви можете подати цей HTML у компілятор і переглянути його Barf ..." Я поняття не маю, що ви говорите тут. Чи можете ви пояснити це простими словами, не перевантаженими всім цим технічним сміттям?
PositiveGuy

175

Я думаю про це з точки зору помилок і коли їх можна спіймати.

Час компіляції:

string my_value = Console.ReadLine();
int i = my_value;

Значення рядка не може бути призначено змінною типу int, тому компілятор напевно знає, що під час компіляції проблема з цим кодом

Час виконання:

string my_value = Console.ReadLine();
int i = int.Parse(my_value);

Тут результат залежить від того, який рядок був повернутий ReadLine (). Деякі значення можна проаналізувати на int, інші - не. Це можна визначити лише під час виконання


59
Тепер це те, що ми всі можемо зрозуміти. Тут немає загальних технічних слів про сміття. Приємно.
PositiveGuy

Для додатка для iPhone: чи вперше компілюється розробником код у .appрозширення? або це відбувається при запуску кожного разу, коли користувач запускає додаток?
Мед

1
@Honey вперше збирається розробником у .app
Maytham-

2
Це чудова нижня відповідь, яка концептуально охоплює різницю між часом компіляції та запуску. Я ціную академічну, професорську відповідь, яку також було обрано, але ця є чіткою та стислою. Прочитавши цю відповідь, я можу повернутися назад і прочитати обрану відповідь, і це має більше сенсу. Дякую
мояве

72

Час компіляції: період часу, протягом якого ви, розробник, збираєте свій код.

Час виконання: період часу, у який користувач працює за вашим програмним забезпеченням.

Чи потрібне вам чіткіше визначення?


12
@BCS: ОП може мати надзвичайно просте введення в програмування з використанням інтерпретованої мови або байта-компіляція-потім-запуску в один крок, так що розрізнення ніколи не було необхідним. Питання наївне, але не німе.
dmckee --- кошеня колишнього модератора

@dmckee: Я думаю, що ця відповідь навіть не буде корисною вашому користувачеві, оскільки він не має більше інформаційного вмісту, ніж оригінальний питання. Кожен, хто би задав питання, на який відповідає ця відповідь, не має ділового програмування (і я не думаю, що ОП це задало).
BCS

У мене швидке запитання. Коли хтось каже, що типова помилка виконання ділиться на нуль, але що робити, якщо у вас є змінна, то скажімо, int x = 3/0але ви нічого не робите з цією змінною. Ми не друкуємо його чи щось. Це все ще вважатиметься помилкою виконання?
Роббен

Для додатка для iPhone: чи вперше компілюється розробником код у розширення .app? або це відбувається при запуску кожного разу, коли користувач запускає додаток? Якщо час його компіляції, для якого збирається код розробника, то чому я б це турбував? Я маю на увазі, що це не вплине на досвід користувачів, чи не так? Як це вбило б розробників лише час!
Мед

1
@ Роббен, я припускаю, що ви отримали свою відповідь після закінчення цього часу, але я відповім на це для інших. Так, це була б помилка виконання, навіть якщо ви не використовуєте її
فربد ضروري

22

( редагувати : наступне стосується 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

Винятки. Хешбел був одним, але я виявив, що найбільшим кроком було. Спроба усунути зламану форму за допомогою хитрої бази даних, яка використовується для мене дуже сумно!
Спенс

19

Переклад вихідного коду в речі, що відбуваються на екрані [екран | диск | мережа] може відбуватися (приблизно) двома способами; називати їх складанням та тлумаченням.

У складеній програмі (приклади c і fortran):

  1. Вихідний код подається в іншу програму (як правило, її називають компілятором - перехідною фігурою), яка виробляє виконується програму (або помилку).
  2. Виконується виконуваний файл (подвійним клацанням по ньому або введенням його імені в командному рядку)

Кажуть, що речі, що відбуваються на першому кроці, трапляються в "час компіляції", а речі, що відбуваються на другому кроці, відбуваються в "час виконання".

У інтерпретованій програмі (приклад MicroSoft basic (на dos) та python (я думаю)):

  1. Вихідний код подається в іншу програму (зазвичай її називають інтерпретатором), яка "запускає" її безпосередньо. Тут інтерпретатор служить проміжним шаром між вашою програмою та операційною системою (або апаратним забезпеченням у дійсно простих комп'ютерах).

У цьому випадку різницю між часом компіляції та часом запуску набагато важче встановити, і набагато менше стосується програміста чи користувача.

Java - це свого роду гібрид, де код збирається в байт-код, який потім працює на віртуальній машині, яка зазвичай є інтерпретатором байт-коду.

Існує також проміжний випадок, коли програма збирається в байт-код і запускається негайно (як у awk або perl).


11

В основному, якщо ваш компілятор може розібратися, що ви маєте на увазі або яке значення "під час компіляції", він може жорстко вписати це в код виконання. Очевидно, якщо ваш код виконання повинен робити обчислення кожного разу, коли він буде працювати повільніше, тому якщо ви можете визначити щось під час компіляції, це набагато краще.

Напр.

Постійне складання:

Якщо я напишу:

int i = 2;
i += MY_CONSTANT;

Компілятор може виконати цю оцінку під час компіляції, оскільки він знає, що таке 2, а що таке MY_CONSTANT. Як такий, він рятує себе від виконання розрахунку кожного виконання.


І легше підтримувати код часу компіляції, ніж прив’язаний до виконання код. Під час компіляції ви можете використовувати компілятор для перевірки деяких речей. Цей самий матеріал під час виконання вимагає більше часу для перевірки, оскільки він включає тестування.
користувач1154664

10

Хм, добре, час виконання використовується для опису того, що відбувається під час роботи програми.

Час компіляції використовується для опису того, що відбувається під час побудови програми (як правило, компілятором).


8

Час компіляції:

Речі, які виконуються за час компіляції, не мають (майже) витрат при запуску отриманої програми, але можуть створювати великі витрати при складанні програми.

Час виконання:

Більш-менш навпаки. Маленька вартість, коли ви будуєте, більша вартість при запуску програми.

З іншого боку; Якщо щось робиться під час компіляції, він працює лише на вашій машині, а якщо щось працює, він працює на вашій машині користувачів.

Актуальність

Прикладом того, де це важливо, може бути тип носіння одиниць. Часова версія компіляції (наприклад, Boost.Units або моя версія в D ) закінчується так само швидко, як і вирішення проблеми з нативним кодом з плаваючою точкою, тоді як версія запущеної версії закінчується необхідністю упакувати інформацію про одиниці, які є значенням і виконувати перевірки в них поряд з кожною операцією. З іншого боку, версії часу компіляції вимагають, щоб одиниці значень були відомі під час компіляції та не могли мати справу з тим випадком, коли вони надходять із введення часу виконання.


8

Виходячи з попередньої аналогічної відповіді на питання У чому різниця між помилкою виконання та помилкою компілятора?

Компіляція / Час компіляції / Синтаксис / Семантичні помилки: Помилки компіляції чи часу компіляції - помилка, яка виникає через помилку введення тексту, якщо ми не дотримуємося належного синтаксису та семантики будь-якої мови програмування, тоді компілятор скидає помилки часу. Вони не дозволять вашій програмі виконати один рядок, поки ви не видалите всі синтаксичні помилки або поки не налагодите помилки часу компіляції.
Приклад: пропущено крапку з комою в C або заглушення intяк Int.

Помилки під час виконання: Помилки виконання - це помилки, які генеруються, коли програма перебуває у запущеному стані. Ці типи помилок можуть призвести до того, що ваша програма поводиться несподівано або навіть може вбити вашу програму. Їх часто називають винятками.
Приклад: Припустимо, що ви читаєте файл, який не існує, це призведе до помилки виконання.

Детальніше про всі помилки програмування читайте тут


7

Ось як доповнення до інших відповідей, ось як я пояснив це непростому:

Ваш вихідний код схожий на план корабля. Він визначає, як слід виготовити судно.

Якщо ви передасте креслення на верфі, і вони виявлять дефект при будівництві корабля, вони припинять будівництво і повідомлять вам про це негайно, перш ніж корабель коли-небудь залишить суху дошку або торкнувся води. Це помилка часу компіляції. Корабель ніколи навіть фактично не плавав чи не використовував свої двигуни. Помилку було знайдено, оскільки вона завадила навіть зробити судно.

Коли ваш код збирається, це як би корабель завершено. Збудований і готовий до роботи. Коли ви виконуєте свій код, це як запуск корабля в плавання. Пасажири сідають на борт, двигуни працюють, а корпус - на воді, тому це час виконання. Якщо ваш корабель має фатальний недолік, який занурює його в дівоче плавання (або, можливо, якесь подорож після додаткових головних болів), він зазнав помилки під час виконання.


5

Наприклад: У сильно набраній мові тип можна перевірити під час компіляції або під час виконання. Під час компіляції це означає, що компілятор скаржиться, якщо типи не сумісні. Під час виконання означає, що ви можете скласти свою програму просто чудово, але під час виконання вона викидає виняток.


4

Просто різницею слів b / w Час компіляції та час виконання.

час компіляції: розробник записує програму у форматі .java та перетворює у байт-код, який є файлом класу, під час цієї компіляції будь-яка помилка може бути визначена як помилка часу компіляції.

Час виконання: Створений .class файл використовується додатком для його додаткової функціональності; логіка виявляється помилковою і видає помилку, яка є помилкою часу виконання.


4

Ось цитата Даніеля Лянга, автора «Введення в програмування JAVA» на тему складання:

"Програма, написана мовою високого рівня, називається вихідною програмою або вихідним кодом. Оскільки комп'ютер не може виконати вихідну програму, вихідну програму необхідно перевести в машинний код для виконання . Переклад можна зробити за допомогою іншого інструмента програмування, який називається перекладач або упорядник ". (Даніель Лян, «Вступ до програмування JAVA» , с. 8).

... Він продовжується ...

"Компілятор переводить весь вихідний код у файл машинного коду , а потім файл машинного коду виконується"

Коли ми забиваємо код високого рівня читання для людини, це спочатку марно! Це потрібно перекласти в послідовність "електронних подій" у вашому маленькому процесорі! Перший крок до цього - компіляція.

Простіше кажучи: помилка під час компіляції трапляється під час цієї фази, тоді як помилка під час виконання відбувається.

Пам'ятайте: Тільки тому, що програма складена без помилок, не означає, що вона запуститься без помилок.

Помилка під час виконання буде виникати в готовій, запущеній або очікуваній частині життєвого циклу програм, тоді як помилка часу компіляції відбуватиметься до "нового" етапу життєвого циклу.

Приклад помилки часу компіляції:

Помилка синтаксису - як ваш код можна скласти в інструкції на машинному рівні, якщо вони неоднозначні ?? Ваш код повинен відповідати на 100% синтаксичним правилам мови, інакше він не може бути скомпільований у робочий машинний код .

Приклад помилки під час виконання:

Вичерпання пам’яті. Виклик на рекурсивну функцію, наприклад, може призвести до переповнення стека, заданого змінною певного ступеня! Як це може передбачити компілятор !? він не може.

І це різниця між помилкою часу компіляції та помилкою виконання


2

Час запуску означає, що щось відбувається під час запуску програми.

Час компіляції означає, що щось відбувається під час складання програми.


2

Час компіляції:

Речі, які виконуються за час компіляції, не мають (майже) витрат при запуску отриманої програми, але можуть створювати великі витрати при складанні програми. Час виконання:

Більш-менш навпаки. Маленька вартість, коли ви будуєте, більша вартість при запуску програми.

З іншого боку; Якщо щось робиться під час компіляції, він працює лише на вашій машині, а якщо щось працює, він працює на вашій машині користувачів.


2

Час компіляції: час, необхідний для перетворення вихідного коду в машинний код, щоб він став виконуваним, називається часом компіляції.

Час виконання: Коли програма працює, вона називається часом виконання.

Помилки часу компіляції - це синтаксичні помилки, відсутні помилки посилань на файли. Помилки під час виконання трапляються після того, як вихідний код був зібраний у виконувану програму і під час роботи програми. Прикладами є збої програми, несподівана поведінка програми чи функції не працюють.


2

Уявіть, що ви начальник, у вас є помічник і служниця, і ви даєте їм список завдань, які потрібно виконати, помічник (час складання) захопить цей список і зробить перевірку, щоб зрозуміти, чи завдання зрозумілі і що ви не писав жодною незграбною мовою чи синтаксисом, тому він розуміє, що ви хочете призначити когось на роботу, щоб він призначив його за вас, і він зрозумів, що ви хочете кави, тому його роль закінчена і служниця (час роботи) починає виконувати ці завдання, тож вона йде приготувати вам каву, але раптом не знаходить кави, щоб зробити так, що вона перестає її робити, або вона діє по-іншому і заварює вам чай (коли програма діє інакше, тому що виявила помилку ).


1

Ось розширення до відповіді на питання "різниця між часом виконання та компіляцією?" - Відмінності накладних витрат пов'язаних з часом виконання та компіляцією?

Продуктивність роботи виробу сприяє його якості, швидше забезпечуючи результати. Продуктивність продукту за час збирання сприяє його своєчасності за рахунок скорочення циклу редагування-збирання-налагодження. Однак і продуктивність, і час виконання, і час компіляції є вторинними факторами досягнення своєчасної якості. Тому слід враховувати поліпшення продуктивності та часу збирання лише тоді, коли це виправдано поліпшенням загальної якості продукції та своєчасності.

Чудове джерело для подальшого читання тут :


1

Я завжди думав про це відносно накладних обробок програм і про те, як це впливає на швидкість виконання, як було сказано раніше. Простим прикладом може бути або визначення абсолютної пам'яті, необхідної для мого об’єкта в коді, або ні.

Визначений булевий формат займає пам'ять x, це потім у складеній програмі і не може бути змінений. Коли програма працює, вона точно знає, скільки пам'яті виділити для x.

З іншого боку, якщо я просто визначу родовий тип об'єкта (тобто вид невизначеного власника місця або, можливо, вказівник на якусь гігантську крапку), фактична пам'ять, необхідна для мого об’єкта, не відома до запуску програми, і я не призначу щось , таким чином, потім необхідно оцінити, а розподіл пам’яті тощо буде потім динамічно оброблятися під час виконання (більше витрат часу).

Яке динамічне поводження буде залежати від мови, компілятора, ОС, вашого коду тощо.

Однак на цій замітці це дійсно залежить від контексту, в якому ви використовуєте час запуску та час компіляції.


1

ми можемо класифікувати їх під різними двома широкими групами статичного зв'язування та динамічного зв'язування. Він заснований на тому, коли зв'язування проводиться з відповідними значеннями. Якщо посилання вирішуються під час компіляції, то воно є статичним зв'язуванням, а якщо посилання вирішуються під час виконання, то це динамічне прив'язування. Статичне зв'язування та динамічне зв'язування також називають ранньою і пізньою зв'язуванням. Іноді їх також називають статичним поліморфізмом і динамічним поліморфізмом.

Йосиф Куландай.


1

Основна різниця між часом виконання та компіляцією:

  1. Якщо у вашому коді є якісь помилки синтаксису та перевірки типу, він видає помилку часу компіляції, де - як час виконання: перевіряє після виконання коду. Наприклад:

int a = 1 int b = a/0;

тут перший рядок не має напівкрапки в кінці ---> помилка часу компіляції після виконання програми під час виконання операції b, результат нескінченний ---> помилка виконання.

  1. Час компіляції не шукає функціональних можливостей, наданих вашим кодом, тоді як час виконання.

1

ось дуже проста відповідь:

Час виконання та час компіляції - це терміни програмування, які стосуються різних етапів розробки програмних програм. Для того, щоб створити програму, розробник спочатку записує вихідний код, який визначає, як програма буде функціонувати. Невеликі програми можуть містити лише кілька сотень рядків вихідного коду, тоді як великі програми можуть містити сотні тисяч рядків вихідного коду. Вихідний код повинен бути складений у машинний код, щоб стати та виконуваною програмою. Цей процес компіляції називається часом компіляції. (Подумайте про компілятора як про перекладача)

Скомпільовану програму може відкрити та запустити користувач. Коли програма працює, вона називається час виконання.

Терміни "час виконання" та "час компіляції" програмісти часто використовують для позначення різних типів помилок. Помилка часу компіляції - така проблема, як синтаксична помилка або відсутня посилання на файл, яка заважає програмі успішно компілювати. Компілятор створює помилки часу компіляції і зазвичай вказує, який рядок вихідного коду викликає проблему.

Якщо вихідний код програми вже був зібраний у виконувану програму, він все ще може мати помилки, які виникають під час роботи програми. Приклади включають функції, які не працюють, несподіване поведінку програми або збої програми. Такі типи проблем називаються помилками виконання, оскільки вони виникають під час виконання.

Довідка


0

ІМХО вам потрібно прочитати багато посилань, ресурсів, щоб скласти уявлення про різницю між часом виконання та компіляції, оскільки це дуже складна тема. У мене є список нижче цих зображень / посилань, які я рекомендую.

Окрім сказаного вище, хочу додати, що іноді малюнок вартує 1000 слів:

  1. порядок цих двох: спочатку - час компіляції, а потім запускається Скомпільована програма може відкриватися та запускатися користувачем. Коли програма запущена, вона називається час виконання: компілювати час, а потім виконувати1 час компіляції, а потім час виконання1;

CLR_diag збирає час, а потім час виконання2  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введіть тут опис зображення введіть тут опис зображення

  • пошук у Google і порівняння помилок виконання та помилок компіляції:

помилки виконання

компілювати помилки ;

  1. На мій погляд, дуже важливо знати: 3.1 різниця між побудовою проти компіляції та життєвим циклом збірки https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

3.2 різниця між цими трьома речами: компілювати проти складання проти часу виконання

https://www.quora.com/What-is-the-difference-bet between-build-run-and-compile Фернандо Падоан, розробник, який просто трохи цікавий для мовного дизайну Відповідь 23 лютого. до інших відповідей:

біг - це отримати якийсь двійковий виконуваний файл (або скрипт для інтерпретованих мов), який добре виконаний ... як новий процес на комп'ютері; компіляція - це процес розбору програми, написаної якоюсь мовою високого рівня (вищою порівняно з машинним кодом), перевірка її синтаксису, семантики, зв'язування бібліотек, можливо, деяка оптимізація, а потім створення бінарної виконуваної програми як виводу. Цей виконуваний файл може бути у вигляді машинного коду або якогось байтового коду - тобто інструкцій, орієнтованих на якусь віртуальну машину; побудова зазвичай включає перевірку та надання залежностей, перевірку коду, компіляцію коду у двійкові, запуск автоматизованих тестів та упаковку отриманих бінарних даних та інших активів (зображення, файли конфігурації, бібліотеки тощо) у певний конкретний формат розгорнутого файлу. Зауважте, що більшість процесів є необов’язковими, а деякі залежать від цільової платформи, для якої ви будуєте. Наприклад, упаковка програми Java для Tomcat виведе файл .war. Побудова виконуваного файлу Win32 з коду C ++ може просто вивести програму .exe або також пакувати її всередині інсталятора .msi.


0

Подивіться на цей приклад:

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)

Як і коли під час компіляції були перевірені певні випадки, після цього час виконання певних випадків перевіряється, як тільки програма задовольняє всі умови, ви отримаєте вихід. В іншому випадку ви отримаєте час компіляції або помилку часу запуску.


0

публічний клас 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{

}


0

Ви можете зрозуміти структуру компіляції коду, прочитавши фактичний код. Структура часу виконання не зрозуміла, якщо ви не розумієте шаблон, який був використаний.


-1

Це не гарне питання для SO (це не конкретне питання програмування), але це не погане питання взагалі.

Якщо ви думаєте, що це тривіально: як щодо часу читання проти компіляції, і коли це корисна відмінність? А що з мовами, де компілятор доступний під час виконання? Гай Стіл (не манекен, він) написав 7 сторінок в CLTL2 про EVAL-WHEN, які програмісти CL можуть використовувати для управління цим. 2 речення ледве вистачає на визначення , яке саме по собі далеко не пояснює .

Взагалі, це складна проблема, якої, схоже, намагаються уникати мовні дизайнери. Вони часто просто кажуть: "Ось компілятор, він робить компіляцію часу; все після цього - час виконання, весело". C розроблений таким чином, щоб бути простим у виконанні, а не найбільш гнучким середовищем для обчислень. Якщо у вас немає компілятора, доступного під час виконання, або можливості легко керувати, коли вираження оцінюється, ви, як правило, стикаєтесь з хаками на мові, щоб підробити звичайні способи використання макросів, або користувачі придумують шаблони дизайну для імітації. маючи більш потужні конструкції. Проста у впровадженні мова, безумовно, може бути гідною ціллю, але це не означає, що це все-таки бути всім дизайном мови програмування. (Я не використовую EVAL-WHEN багато, але не можу уявити життя без цього.)

І проблемний простір навколо часу компіляції та часу виконання є величезним і все ще значною мірою не вивчений. Це не означає, що ТАК - це правильне місце для дискусії, але я закликаю людей вивчати цю територію далі, особливо тих, хто не має попередніх уявлень про те, якою вона має бути. Питання не є ані простим, ані дурним, і ми могли б принаймні вказати інквізитора в правильному напрямку.

На жаль, я не знаю жодних хороших посилань на це. CLTL2 трохи про це говорить, але це не чудово, щоб дізнатися про це.


4
чувак, те, що не добре для тебе питання програмування, все відносно. Я подумав, що це відмінне запитання, і про щось я хотів дізнатися більше. Так, я знаю загальну "концепцію", що таке час компіляції та час виконання, але я хочу знати інтрикти, які трапляються насправді під час виконання та часу компіляції. Це ті інтриги, які важливі, коли ви програмуєте та маєте їх знати. Це не дуже конкретно, тому він запитує. Я ненавиджу, коли люди сидять тут і кажуть загальні питання, подібні цьому, марні, коли вони є одними з найважливіших питань, які можна зрозуміти для будь-якого розробника.
ПозитивнийГой

1
Якщо ви не бачите значення у питанні, це ваша проблема. Якщо це взагалі, то в цьому є причина. Просто те, що вам не подобаються загальні питання, не означає, що світ обертається навколо того, що ви вважаєте корисним. У нього є певний намір задавати це питання, і він хоче отримати ряд відповідей, щоб краще зрозуміти і визначити обидва. Отримаєте?
PositiveGuy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.