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

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

Ответы [ 25 ]

1 голос
/ 22 ноября 2013

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

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

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

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

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

1 голос
/ 25 ноября 2015

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

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

int a = 1 int b = a/0;

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 13 декабря 2017

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

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

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

CLR_diag время компиляции и затем время выполнения2 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)

Время выполнения, время выполнения или время выполнения может означать:

Вычислительный

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

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

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

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

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.

...