Время выполнения и время компиляции

Может кто-нибудь, пожалуйста, дать мне хорошее представление о том, какая разница между временем выполнения и временем компиляции?

Ответ 1

Разница между временем компиляции и временем выполнения является примером того, как заостренные теоретики называют различие фаз. Это одна из самых сложных концепций для изучения, особенно для людей, не имеющих большого опыта в языках программирования. Чтобы подойти к этой проблеме, я считаю полезным

  1. Какие инварианты удовлетворяют программе?
  2. Что может пойти не так на этом этапе?
  3. Если фаза будет успешной, каковы постусловия (что мы знаем)?
  4. Каковы входы и выходы, если таковые имеются?

Время компиляции

  1. Программа не должна удовлетворять никаким инвариантам. На самом деле, это вовсе не должна быть хорошо сформированная программа. Вы можете отправить этот HTML-код компилятору и посмотреть его barf...
  2. Что может пойти не так во время компиляции:
    • Синтаксические ошибки
    • Ошибки в типе проверки
    • (Редко) компилятор падает
  3. Если компилятор преуспеет, что мы знаем?
    • Программа была хорошо сформирована --- значимая программа на любом языке.
    • Возможно запустить программу. (Программа может выйти из строя сразу, но, по крайней мере, мы можем попробовать.)
  4. Какие входы и выходы?
    • Ввод был скомпилирован программой, а также любые файлы заголовков, интерфейсы, библиотеки или другие вуду, которые необходимо было импортировать для компиляции.
    • Вывод - это, надеюсь, код сборки или перемещаемый объектный код или даже исполняемая программа. Или, если что-то пойдет не так, вывод - это куча сообщений об ошибках.

Время работы

  1. Мы ничего не знаем о программных инвариантах --- они независимо от того, что вводит программист. Инварианты времени выполнения редко выполняются только компилятором; ему нужна помощь программиста.
  2. Что может пойти не так, это ошибки во время выполнения:

    • Деление на ноль
    • Вызов нулевого указателя
    • Запуск памяти

    Также могут быть ошибки, обнаруженные самой программой:

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

Ответ 2

Я думаю об этом с точки зрения ошибок, и когда их можно поймать.

Время компиляции:

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

Строковое значение не может быть назначено переменной типа int, поэтому компилятор точно знает, что этот код имеет проблему

Время выполнения:

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

Здесь результат зависит от того, какая строка была возвращена ReadLine(). Некоторые значения могут анализироваться на int, другие - нет. Это можно определить только во время выполнения

Ответ 3

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

Время выполнения: период времени, в течение которого пользователь запускает вашу часть программного обеспечения.

Вам нужно более четкое определение?

Ответ 4

(изменить): для С# и аналогичных строго типизированных языков программирования применяется следующее: я не уверен, поможет ли это вам).

Например, перед запуском программы компилятор обнаружит следующую ошибку (в время компиляции) и приведет к ошибке компиляции:

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

Ответ 5

Перевод исходного кода в файл stuff-happening-on-the- [screen | disk | network] может происходить (грубо) двумя способами; назовите их компиляцией и интерпретацией.

В скомпилированной программе (примеры - c и fortran):

  • Исходный код передается в другую программу (обычно называемую компилятором - go figure), которая создает исполняемую программу (или ошибку).
  • Выполняется исполняемый файл (двойным щелчком мыши или вводом его имени в командной строке)

Вещи, которые происходят на первом этапе, как говорят, происходят во время компиляции, вещи, которые происходят на втором этапе, как говорят, происходят в "время выполнения".

В интерпретируемой программе (пример MicroSoft basic (on dos) и python (я думаю)):

  • Исходный код передается в другую программу (обычно называемую интерпретатором), которая "запускает" ее напрямую. Здесь интерпретатор служит промежуточным слоем между вашей программой и операционной системой (или оборудованием на действительно простых компьютерах).

В этом случае разницу между временем компиляции и временем выполнения сложнее фиксировать и гораздо менее релевантно программисту или пользователю.

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

Существует также промежуточный случай, когда программа скомпилирована в байт-код и запускается немедленно (как в awk или perl).

Ответ 6

В принципе, если ваш компилятор может решить, что вы имеете в виду или какое значение является "во время компиляции", он может жестко указать его в код времени выполнения. Очевидно, если ваш код времени выполнения должен выполнять вычисления каждый раз, когда он будет работать медленнее, поэтому, если вы можете что-то определить во время компиляции, это намного лучше.

Eg.

Постоянное складывание:

Если я пишу:

int i = 2;
i += MY_CONSTANT;

Компилятор может выполнить эту калибровку во время компиляции, потому что он знает, что такое 2, и что такое MY_CONSTANT. Таким образом, он спасает себя от выполнения вычисления при каждом выполнении.

Ответ 7

Хмм, хорошо, время исполнения используется для описания того, что происходит при запуске программы.

Время компиляции используется для описания того, что происходит при создании программы (обычно, компилятором).

Ответ 8

Время компиляции:

Вещи, которые выполняются во время компиляции, не вызывают (почти) никаких затрат при запуске результирующей программы, но могут повлечь за собой большие затраты при сборке программы.

Run-Time:

Более или менее полная противоположность. Меньше затрат при сборке, больше затрат при запуске программы.

С другой стороны; Если что-то делается во время компиляции, оно запускается только на вашем компьютере, а если что-то выполняется во время выполнения, оно запускается на вашем компьютере пользователя.

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

Примером того, где это важно, был бы тип, несущий единицу. Версия во время компиляции (например, Boost.Units или моя версия в D) оказывается такой же быстрой, как и решение проблемы с собственным кодом с плавающей запятой, в то время как версия времени выполнения вынуждена собирать информацию о единицах измерения, которые имеют значение. и выполнять проверки в них вдоль каждой операции. С другой стороны, версии времени компиляции требуют, чтобы единицы значений были известны во время компиляции и не могли иметь дело со случаем, когда они поступают из ввода во время выполнения.

Ответ 9

Исходя из предыдущего аналогичного ответа на вопрос В чем разница между ошибкой во время выполнения и ошибкой компилятора?

Ошибки компиляции/времени компиляции/синтаксиса/семантики: ошибки компиляции или времени компиляции - это ошибка, произошедшая из-за ошибки при вводе, если мы не соблюдаем правильный синтаксис и семантику любого языка программирования, то ошибки времени компиляции генерируются компилятором. Они не позволят вашей программе выполнить одну строку, пока вы не удалите все синтаксические ошибки или пока вы не отладите ошибки времени компиляции.
Пример: Отсутствие точки с запятой в C или опечатка int как Int.

Ошибки времени выполнения: ошибки времени выполнения - это ошибки, которые генерируются, когда программа находится в рабочем состоянии. Эти типы ошибок приведут к непредсказуемому поведению вашей программы или даже к ее уничтожению. Их часто называют исключениями.
Пример: Предположим, что вы читаете файл, который не существует, приведет к ошибке во время выполнения.

Узнайте больше обо всех ошибках программирования здесь

Ответ 10

Например: на строго типизированном языке тип может быть проверен во время компиляции или во время выполнения. Во время компиляции это означает, что компилятор жалуется, если типы несовместимы. Во время выполнения вы можете легко компилировать свою программу, но во время выполнения она генерирует исключение.

Ответ 11

Как дополнение к другим ответам, вот как я объясню это непрофессионалу:

Ваш исходный код похож на план корабля. Он определяет, как должно быть сделано судно.

Если вы передадите свой проект на верфь, и они найдут дефект при строительстве корабля, они перестанут строить и сообщают об этом вам немедленно, прежде чем корабль когда-нибудь покинет суппик или коснется воды. Это ошибка времени компиляции. Корабль никогда даже не плавал или не использовал свои двигатели. Ошибка была обнаружена, потому что это предотвратило даже создание корабля.

Когда ваш код компилируется, он, как и корабль, завершается. Построен и готов к работе. Когда вы выполняете свой код, это похоже на запуск корабля в рейс. Пассажиры садятся, двигатели работают, а корпус находится на воде, так что это время работы. Если ваш корабль имеет фатальный недостаток, который поглощает его в своем первом рейсе (или, возможно, некоторое плавание после дополнительных головных болей), он страдает от ошибки во время выполнения.

Ответ 12

Простое различие слов b/w Время компиляции и время выполнения.

время компиляции: разработчик записывает программу в формате .java и преобразует ее в Bytecode, который является файлом класса, во время этой компиляции возникает любая ошибка, которая может быть определена как ошибка времени компиляции.

Время выполнения: созданный .class файл используется приложением для его дополнительных функций, и логика оказывается неправильной и выдает ошибку, которая является ошибкой времени выполнения

Ответ 13

Вот цитата Даниэля Ляна, автора "Введение в программирование на JAVA", на тему компиляции:

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

...Он продолжает...

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

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

Проще говоря: ошибка во время компиляции происходит во время этой фазы, а ошибка во время выполнения возникает позже.

Помните: только то, что программа скомпилирована без ошибок, не означает, что она будет работать без ошибок.

Ошибка времени выполнения будет возникать в части готовности, выполнения или ожидания в жизненном цикле программ, в то время как ошибка времени компиляции будет возникать до "новой" стадии жизненного цикла.

Пример ошибки времени компиляции:

Синтаксическая ошибка - как ваш код может быть скомпилирован в инструкции машинного уровня, если они неоднозначны? Ваш код должен полностью соответствовать синтаксическим правилам языка, иначе он не может быть скомпилирован в работающий машинный код.

Пример ошибки времени выполнения:

Недостаточно памяти - например, вызов рекурсивной функции может привести к переполнению стека при заданной переменной определенной степени! Как это может ожидать компилятор !? это не может.

И это разница между ошибкой во время компиляции и ошибкой во время выполнения

Ответ 14

Время выполнения означает, что что-то происходит при запуске программы.

Время компиляции означает, что что-то происходит при компиляции программы.

Ответ 15

Время компиляции:

Вещи, которые выполняются во время компиляции, несут (почти) без затрат, когда результирующая программа запускается, но при создании программы могут возникнуть большие затраты. Run-Time:

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

С другой стороны; Если во время компиляции что-то выполняется, оно запускается только на вашем компьютере, и если что-то выполняется во время выполнения, оно запускается на вашем компьютере пользователя.

Ответ 16

Время компиляции: время, затраченное на преобразование исходного кода в машинный код, так что он становится исполняемым, называется временем компиляции.

Время выполнения: когда приложение запущено, оно называется временем выполнения.

Ошибки времени компиляции - это синтаксические ошибки, отсутствующие ошибки ссылки на файл. Ошибки выполнения выполняются после того, как исходный код был скомпилирован в исполняемую программу и во время работы программы. Примерами являются сбои в работе программы, неожиданное поведение программы или функции не работают.

Ответ 17

Вот расширение ответа на вопрос "разница между временем выполнения и временем компиляции"? - Различия в накладных расходах, связанных с временем выполнения и временем компиляции?

Производительность продукта во время исполнения способствует его качеству, обеспечивая более быстрые результаты. Производительность продукта во время компиляции способствует его своевременности, сокращая цикл редактирования-компиляции-отладки. Однако производительность и производительность во время выполнения являются второстепенными факторами для достижения своевременного качества. Поэтому следует учитывать улучшения производительности во время выполнения и компиляции, только если это оправдано улучшением общего качества и своевременности продукта.

Отличный источник для дальнейшего чтения здесь:

Ответ 18

Я всегда думал об этом относительно накладных расходов на обработку и о том, как это влияет на предварительную готовность, как было сказано ранее. Простым примером может быть либо определение абсолютной памяти, необходимой для моего объекта в коде, либо нет.

Определенное логическое значение принимает память x, тогда оно находится в скомпилированной программе и не может быть изменено. Когда программа запускается, она точно знает, сколько памяти выделяется для x.

С другой стороны, если я просто определяю общий тип объекта (т.е. вид держателя места undefined или, возможно, указатель на какой-то гигантский blob), фактическая память, необходимая для моего объекта, неизвестна до тех пор, пока программа не будет запущена и Я присваиваю ему что-то, поэтому тогда он должен быть оценен, а распределение памяти и т.д. Будет обрабатываться динамически во время выполнения (больше времени на выполнение).

Как он динамически обрабатывается, тогда будет зависеть язык, компилятор, ОС, ваш код и т.д.

Однако на этой ноте это будет действительно зависеть от контекста, в котором вы используете время выполнения и время компиляции.

Ответ 19

мы можем классифицировать их под разными двумя широкими группами: статической привязкой и динамической привязкой. Он основан на том, когда привязка выполняется с соответствующими значениями. Если ссылки решаются во время компиляции, то это статическая привязка и если ссылки разрешены во время выполнения, то это динамическое связывание. Статическое связывание и динамическое связывание также называют ранним связыванием и поздним связыванием. Иногда их также называют статическим полиморфизмом и динамическим полиморфизмом.

Джозеф Куландай.

Ответ 20

Основное различие между временем выполнения и временем компиляции:

  • Если в вашем коде есть какие-либо синтаксические ошибки и проверки типов, тогда он выдает ошибку времени компиляции, где-как время выполнения: он проверяет после выполнения кода. Например:

int a = 1 int b = a/0;

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

  1. Время компиляции не ищет выход функциональности, предоставляемой вашим кодом, тогда как время выполнения делает.

Ответ 21

здесь очень простой ответ:

Время выполнения и время компиляции - это термины программирования, которые относятся к разным этапам разработки программного обеспечения. Чтобы создать программу, разработчик сначала пишет исходный код, который определяет, как будет работать программа. Небольшие программы могут содержать только несколько сотен строк исходного кода, а большие программы могут содержать сотни тысяч строк исходного кода. Исходный код должен быть скомпилирован в машинный код, чтобы стать и исполняемой программой. Этот процесс компиляции называется временем компиляции (подумайте о компиляторе как переводчике)

Скомпилированную программу можно открыть и запустить пользователем. Когда приложение запущено, оно называется runtime.

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

Если исходный код программы уже скомпилирован в исполняемую программу, у него могут быть ошибки, возникающие во время работы программы. Примеры включают функции, которые не работают, неожиданное поведение программы или сбои программы. Эти типы проблем называются ошибками времени выполнения, поскольку они встречаются во время выполнения.

Ссылка

Ответ 22

Посмотрите на этот пример:

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)

Например, когда во время компиляции проверяются определенные случаи, после этого времени выполнения проверяются определенные случаи, когда программа удовлетворяет всем условиям, которые вы получите на выходе. В противном случае вы получите ошибку времени компиляции или выполнения.

Ответ 23

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

Ответ 24

ИМХО, вам нужно прочитать много ссылок, ресурсов, чтобы составить представление о разнице между временем выполнения и временем компиляции, потому что это очень сложная тема. У меня есть список ниже некоторых из этих фотографий/ссылок, которые я рекомендую.

Помимо сказанного выше, хочу добавить, что иногда картинка стоит 1000 слов:

  1. Порядок этих двух: сначала время компиляции, а затем вы запускаете Скомпилированная программа может быть открыта и запущена пользователем. Когда приложение работает, оно называется временем выполнения: время компиляции, а затем время выполнения1 compile time and then runtime1;

CLR_diag время компиляции и затем runtime2 CLR_diag compile time and then runtime2

 from Wiki  

https://en.wikipedia.org/wiki/Run_time https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)

Время выполнения, время выполнения или время выполнения может относиться к:

вычисления

Время выполнения (фаза жизненного цикла программы), период, в течение которого выполняется компьютерная программа

Runtime library, библиотека программ, предназначенная для реализации функций, встроенных в язык программирования

Система выполнения, программное обеспечение, предназначенное для поддержки выполнения компьютерных программ

Выполнение программного обеспечения, процесс выполнения инструкций одна за другой во время фазы выполнения

enter image description here enter image description here

enter image description here enter image description here enter image description here enter image description here enter image description here Список компиляторов enter image description here enter image description here https://en.wikipedia.org/wiki/List_of_compilers

  • поиск в Google и сравнение ошибок времени выполнения и ошибок компиляции:

runtime errors

compile errors;

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

3.2 разница между этими 3 вещами: компиляция против сборки против времени выполнения

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

Выполнение - это получение некоторого двоичного исполняемого файла (или сценария для интерпретируемых языков), который, хорошо… выполняется как новый процесс на компьютере; Компиляция - это процесс синтаксического анализа программы, написанной на каком-либо языке высокого уровня (более высокого по сравнению с машинным кодом), проверки ее синтаксиса, семантики, связывания библиотек, возможно, выполнения некоторой оптимизации, а затем создания двоичной исполняемой программы в качестве вывода. Этот исполняемый файл может быть в форме машинного кода или какого-то байт-кода, то есть инструкций, ориентированных на какую-то виртуальную машину; Сборка обычно включает в себя проверку и предоставление зависимостей, проверку кода, компиляцию кода в двоичный файл, запуск автоматических тестов и упаковку полученных двоичных файлов и других ресурсов (изображений, файлов конфигурации, библиотек и т.д.) в некоторый определенный формат развертываемого файла. Обратите внимание, что большинство процессов являются необязательными, а некоторые зависят от целевой платформы, для которой вы строите. В качестве примера, упаковка Java-приложения для Tomcat выведет .war файл. Сборка исполняемого файла Win32 из кода C++ может просто вывести программу .exe или также упаковать ее в установщик .msi.

Ответ 25

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

Вы можете найти полное объяснение в этой статье

Ответ 26

открытый класс 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
}

}

класс А {

} класс B расширяет A {

} класс C расширяет A {

} класс D {

}

Ответ 27

Это не очень хороший вопрос для С.О. (это не конкретный вопрос программирования), но это не плохой вопрос в целом.

Если вы считаете это тривиальным: как насчет времени чтения и времени компиляции, и когда это полезное различие? Что относительно языков, где компилятор доступен во время выполнения? Гай Стил (не фиктивный, он) написал 7 страниц в CLTL2 об EVAL-WHEN, которые программисты CL могут использовать для управления этим. 2 предложения недостаточно для определения, что само по себе мало объясняет.

В целом, это сложная проблема, которую, как казалось, пытались избежать разработчики языка. Они часто просто говорят: "Здесь компилятор, он компилирует вещи, все после этого - время исполнения, получайте удовольствие". C предназначен для простой реализации, а не для самой гибкой среды для вычислений. Когда у вас нет компилятора, доступного во время выполнения, или способности легко контролировать, когда выражение оценивается, вы, как правило, получаете хаки на языке, чтобы подделывать общие применения макросов, или пользователи придумывают шаблоны проектирования для имитации имея более мощные конструкции. Простой в использовании язык, безусловно, может быть стоящей целью, но это не значит, что это все, что нужно для разработки языка программирования. (Я не использую EVAL-КОГДА много, но я не могу представить жизнь без нее.)

И пространство проблем вокруг времени компиляции и времени выполнения огромно и до сих пор в значительной степени не изучено. Это не сказать С.О. это подходящее место для обсуждения, но я призываю людей продолжить изучение этой территории, особенно тех, у кого нет предвзятых представлений о том, что должно быть. Вопрос не является ни простым, ни глупым, и мы могли бы хотя бы указать инквизитору в правильном направлении.

К сожалению, я не знаю никаких хороших ссылок на это. CLTL2 говорит об этом немного, но это не очень полезно для изучения этого.