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

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

24 ответов


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

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

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

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

времени

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

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

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

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

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

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

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

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

время работы:

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

например.

свертка констант:

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

int i = 2;
i += MY_CONSTANT;

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


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

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


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

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

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

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


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

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

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

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

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

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

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


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


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

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

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


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

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

...Он Продолжает:..

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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


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

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

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

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


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

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

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


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

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

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

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

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


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

Джозеф Kulandai.


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

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

int a = 1 int b = a/0;

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

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

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

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

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

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

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

в ссылка


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

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

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

  1. поиск в google и сравнение ошибок выполнения против компиляции ошибки:

runtime errors

compile errors ;

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

3.2 разница между этими 3 вещами: compile vs build vs runtime

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

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


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

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

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


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

тест открытого класса {

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)

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


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

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

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

и problemspace во времени компиляции и времени выполнения-это огромный и по-прежнему во многом неизведанный. Это не значит, что S. O.-правильное место для обсуждения, но я призываю людей исследовать эту территорию дальше, особенно тех, у кого нет предвзятых представлений о том, что это должно быть. Вопрос не простой и не глупый, и мы могли бы, по крайней мере, указать инквизитору правильное направление.

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