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


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

24 295

24 ответа:

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

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

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

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

времени

  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(). Некоторые значения можно преобразовать в инт, другие не могут. Это может быть определено только в run время

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

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

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

(edit: следующее относится к 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] может происходить (примерно) двумя способами; назовите их компиляцией и интерпретацией.

на compiled программа (примеры 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 Как Int.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

синтаксическая ошибка-как ваш код может быть скомпилирован в инструкции машинного уровня, если они неоднозначны?? Ваш код должен на 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 разница между сборкой и компиляцией и жизненным циклом сборки 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 Февраля Я иду назад по отношению к другим ответам:

запуск получает некоторый двоичный исполняемый файл (или скрипт, для интерпретируемых языков), чтобы быть, ну ... выполняется как новый процесс на компьютере; компиляция-это процесс разбора программы, написанной на некотором языке высокого уровня (выше если сравнивать с машинным кодом), проверяя его синтаксис, семантику, связывая библиотеки, возможно, делая некоторую оптимизацию, а затем создавая двоичную исполняемую программу в качестве вывода. Этот исполняемый файл может быть в виде машинного кода или какого-то байтового кода-то есть инструкций, предназначенных для какой-то виртуальной машины; построение обычно включает в себя проверку и предоставление зависимостей, проверку кода, компиляцию кода в двоичный код, запуск автоматических тестов и упаковку полученного двоичного кода[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 предложения едва достаточно для a определение, который сам по себе далек от объяснение.

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

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

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