Время выполнения против времени компиляции - PullRequest
322 голосов
/ 11 мая 2009

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

Ответы [ 25 ]

431 голосов
/ 11 мая 2009

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

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

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

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

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

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

    • Деление на ноль
    • Разыменование нулевого указателя
    • Недостаточно памяти

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

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

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

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

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

Строковому значению нельзя присвоить переменную типа int, поэтому компилятор точно знает во время компиляции , что у этого кода есть проблема

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

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

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

61 голосов
/ 11 мая 2009

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

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

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

21 голосов
/ 11 мая 2009

( edit : следующее относится к 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
18 голосов
/ 11 мая 2009

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

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

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

Говорят, что то, что происходит на первом шаге, происходит во время компиляции, а то, что происходит на втором шаге, происходит во время выполнения. В интерпретируемой программе (например, MicroSoft basic (на dos) и python (я думаю)):

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

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

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

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

11 голосов
/ 11 мая 2009

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

Например.

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

Если я напишу:

int i = 2;
i += MY_CONSTANT;

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

8 голосов
/ 11 мая 2009

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

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

8 голосов
/ 11 мая 2009

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

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

Run-Time:

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

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

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

8 голосов
/ 25 мая 2015

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

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

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

Подробнее обо всех ошибках программирования здесь

5 голосов
/ 22 февраля 2018

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

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

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

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

...