Скомпилированные и интерпретируемые языки

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

Большая часть моего опыта программирования связана с CPython (динамический, интерпретируемый) и Java (статический, скомпилированный). Однако я понимаю, что есть и другие виды интерпретируемых и компилируемых языков. Помимо того факта, что исполняемые файлы могут распространяться из программ, написанных на компилируемых языках, есть ли какие-либо преимущества / недостатки для каждого типа? Часто я слышу, как люди утверждают, что интерпретируемые языки можно использовать в интерактивном режиме, но я считаю, что скомпилированные языки также могут иметь интерактивные реализации, верно?


person chimeracoder    schedule 16.07.2010    source источник
comment
Для этого сравнения вы выбрали именно худшие языки. Оба компилируются побайтно. Единственная реальная разница между ними - это JITer, и даже у Python есть частичный (psyco).   -  person Ignacio Vazquez-Abrams    schedule 16.07.2010
comment
Хорошим примером интерактивного компилируемого языка является Clojure - все полностью скомпилировано (сначала в JVM, затем в собственный код через JIT). Однако большая часть перекомпиляции происходит динамически, и разработка часто выполняется в интерактивной оболочке REPL, где вы можете оценить любую функцию, которую хотите, в работающей среде.   -  person mikera    schedule 16.07.2010
comment
Standard ML - еще один интерактивный компилируемый язык; встроенный компилятор тоже выдает настоящий машинный код.   -  person Donal Fellows    schedule 16.07.2010
comment
publib .boulder.ibm.com / infocenter / zos / basics / index.jsp? topic = /   -  person pvllnspk    schedule 16.09.2013
comment
queception.com/question.php?question=16   -  person Stack Overflow    schedule 12.04.2019


Ответы (12)


Компилируемый язык - это язык, в котором после компиляции программа выражается в инструкциях целевой машины. Например, операция добавления «+» в исходном коде может быть преобразована непосредственно в инструкцию «ADD» в машинном коде.

Интерпретируемый язык - это язык, в котором инструкции не выполняются напрямую целевой машиной, а вместо этого читаются и выполняются какой-либо другой программой (которая обычно написана на языке собственной машины). Например, та же операция «+» будет распознаваться интерпретатором во время выполнения, который затем вызовет свою собственную функцию «add (a, b)» с соответствующими аргументами, которая затем выполнит инструкцию машинного кода «ADD». .

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

Я собираюсь полностью обобщить (простят меня пуристы!), Но, грубо говоря, вот преимущества компилируемых языков:

  • Повышение производительности за счет прямого использования собственного кода целевой машины
  • Возможность применить довольно мощные оптимизации на этапе компиляции

И вот преимущества интерпретируемых языков:

  • Проще реализовать (писать хорошие компиляторы очень сложно !!)
  • Нет необходимости запускать этап компиляции: можно выполнять код прямо «на лету»
  • Может быть удобнее для динамических языков

Обратите внимание, что современные методы, такие как компиляция байт-кода, добавляют некоторую дополнительную сложность - здесь происходит то, что компилятор нацелен на «виртуальную машину», которая не совпадает с базовым оборудованием. Эти инструкции виртуальной машины могут быть затем снова скомпилированы на более позднем этапе для получения собственного кода (например, как это делает JIT-компилятор Java JVM).

person mikera    schedule 16.07.2010
comment
Не всем компилируемым языкам нужен медленный этап компиляции. Серьезные реализации Common Lisp - это компиляторы, и они часто не возятся с интерпретатором, предпочитая просто компилировать очень быстро на лету. С другой стороны, Java действительно нуждается в этапе компиляции, и он обычно видим. - person David Thornley; 16.07.2010
comment
@David полностью согласен! Как я уже сказал, я несколько обобщал :-) Я довольно часто использую Clojure, который точно так же компилируется на лету (в JVM). - person mikera; 16.07.2010
comment
@mikera отличный ответ. Только одно уточнение относительно вашего мнения о том, что интерпретатор является более жизнеспособным выбором для динамических языков. Почему легко реализовать интерпретатор для динамических языков, таких как JavaScript? - person Geek; 08.09.2013
comment
@mikera Если интерпретатор делает следующее: 1- берет неродной код. 2- вызывает соответствующую функцию в этом коде, которая, что неудивительно, вызывает соответствующую встроенную функцию. С другой стороны, JIT-компиляция делает следующее: 1- принимает неродной код. 2- компилирует его на промежуточный язык, который, как я понимаю, каким-то образом транслируется в собственный машинный код и выполняется. тогда каковы реальные преимущества JIT-компиляции над интерпретацией? - person kzidane; 17.09.2013
comment
@Kareem: JIT-компилятор выполняет только 1) и 2) один раз - после этого это полностью собственный код. Интерпретатор должен выполнять и 1), и 2) каждый раз, когда вызывается код (что может быть много, много раз ...). Так что со временем JIT-компилятор выигрывает с большим отрывом. - person mikera; 17.09.2013
comment
@mikera Разве байт-код не транслируется в машинный код во время выполнения? Если нет, то когда именно он переводится в машинный код? - person kzidane; 18.09.2013
comment
Да, байт-код преобразуется в машинный код в какой-то момент во время общего выполнения программы (в отличие от перед выполнением программы, как в случае с традиционным компилятором). Но данный фрагмент кода может быть выполнен более 10 миллионов раз в течение всего выполнения программы. Он (вероятно) компилируется только один раз из байт-кода в машинный код. Следовательно, накладные расходы времени выполнения JIT невелики, и их можно игнорировать для длительно выполняющихся программ. После того, как JIT-компилятор завершит свою работу, вы фактически полностью будете выполнять чистый машинный код. - person mikera; 18.09.2013
comment
На самом деле это ложная дихотомия. В языке нет ничего такого, что заставляло бы его компилировать и интерпретировать. Это не более чем широко распространенное заблуждение. Многие языки имеют обе реализации, и все языки могут иметь обе. - person mmachenry; 25.05.2014
comment
@mmachenry, это не ложная дихотомия. язык программирования включает в себя как дизайн, так и реализацию. Хотя в теоретическом смысле определение данного языка может быть как скомпилировано, так и интерпретировано, в реальной практике существуют значительные различия в реализации. Никто еще не решил, как эффективно составлять определенные языковые конструкции, например, - это открытая исследовательская проблема. - person mikera; 28.05.2014
comment
@mikera Действительно, это так. Есть преимущества компиляции и есть преимущества для интерпретации. Тот факт, что технология компилятора развивается для улучшения некоторых языковых функций, не означает, что мы можем что-либо сказать о преимуществах компиляции языка с этой функцией. Объединение языка и реализации приводит к ложному пониманию выбора компиляции или интерпретации для реализации. Например ваш комментарий [интерпретаторы] Может быть удобнее для динамических языков - person mmachenry; 29.05.2014
comment
Добавить базовую проверку синтаксиса всей программы в список для компиляторов. - person Marco van de Voort; 29.05.2016
comment
Таким образом, в интерпретируемых языках существует слой между машиной и кодом, который вы пишете, тогда как в скомпилированном языке нет слоя косвенного обращения. - person ahnbizcad; 07.06.2017
comment
Opportunity to apply quite powerful optimizations during the compile stage Значит ли это, что один и тот же исходный файл может создавать разные объектные файлы в зависимости от того, как он компилируется? Т.е. операторы в конкретном исходном файле и машинные инструкции из результирующей компиляции не обязательно имеют отношение «один-к-одному», но, возможно, взаимосвязь «один-ко-многим»? - person Nicholas Cousar; 04.02.2021

Сам язык не компилируется и не интерпретируется, только конкретная реализация языка. Java - прекрасный тому пример. Существует платформа на основе байт-кода (JVM), собственный компилятор (gcj) и интерпретатор для расширенного набора Java (bsh). Так что же такое Java сейчас? Скомпилирован в байт-код, скомпилирован в собственном коде или интерпретирован?

Другие языки, которые компилируются и интерпретируются, - это Scala, Haskell или Ocaml. У каждого из этих языков есть интерактивный интерпретатор, а также компилятор байтового или машинного кода.

Так что в целом разделение языков на «скомпилированные» и «интерпретируемые» не имеет особого смысла.

person lunaryorn    schedule 16.07.2010
comment
Я согласен. Или, скажем так: есть собственные компиляторы (создающие машинный код для ЦП) и не совсем собственные компиляторы (создающие токенизированный материал, то есть промежуточный код, который какой-то своевременный компилятор компилирует в машинный код раньше ( или во время) выполнения ONCE), и есть настоящие некомпиляторы, которые никогда не производят машинный код и никогда не позволяют процессору запускать код. Последние - переводчики. Сегодня нативные компиляторы, которые непосредственно производят машинный код (ЦП) во время компиляции, становятся все более редкими. Delphi / Codegear - один из лучших выживших. - person TheBlastOne; 16.07.2010

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

Давным-давно жили вычислительные интерпретаторы и компиляторы. Возникла всякая суета по поводу достоинств одного перед другим. Общее мнение в то время было примерно таким:

  • Интерпретатор: Быстро разрабатывать (редактировать и запускать). Медленное выполнение, потому что каждый оператор должен был интерпретироваться в машинный код каждый раз, когда он выполнялся (подумайте, что это означало для цикла, выполняемого тысячи раз).
  • Компилятор: медленно разрабатывать (редактировать, компилировать, связывать и запускать. Этапы компиляции / компоновки могут занять много времени). Быстро выполнить. Вся программа была уже в машинном коде.

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

Сегодня ландшафт изменился до такой степени, что составленное / интерпретируемое различие в значительной степени неуместно. Многие скомпилированные языки вызывают службы времени выполнения, которые не полностью основаны на машинном коде. Кроме того, большинство интерпретируемых языков перед выполнением «компилируются» в байт-код. Интерпретаторы байт-кода могут быть очень эффективными и конкурировать с кодом, сгенерированным компилятором, с точки зрения скорости выполнения.

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

person NealB    schedule 16.07.2010
comment
Красиво - отличное резюме в последнем абзаце - спасибо! - person ckib16; 31.12.2018

Крайний и простой случаи:

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

  • Интерпретатор представит пользователю приглашение в цикле, где он может вводить операторы или код, и после нажатия RUN или эквивалентного интерпретатор будет исследовать, сканировать, анализировать и интерпретировать каждую строку до тех пор, пока программа не дойдет до точки остановки или ошибка. Поскольку каждая строка обрабатывается сама по себе, и интерпретатор ничего не «узнает» из того, что видел строку раньше, усилия по преобразованию понятного человеку языка в машинные инструкции возникают каждый раз для каждой строки, так что это очень медленно. С другой стороны, пользователь может проверять свою программу и иным образом взаимодействовать с ней различными способами: изменять переменные, изменять код, работать в режимах трассировки или отладки ...

Разобравшись с этим, позвольте мне объяснить, что жизнь уже не так проста. Например,

  • Многие интерпретаторы предварительно компилируют предоставленный им код, поэтому шаг перевода не нужно повторять снова и снова.
  • Некоторые компиляторы компилируются не в машинные инструкции, специфичные для процессора, а в байт-код, своего рода искусственный машинный код для фиктивной машины. Это делает скомпилированную программу немного более переносимой, но требует интерпретатора байт-кода в каждой целевой системе.
  • Интерпретаторы байт-кода (я здесь смотрю на Java) в последнее время склонны повторно компилировать байт-код, который они получают для ЦП целевой секции непосредственно перед выполнением (так называемый JIT). Чтобы сэкономить время, это часто делается только для часто запускаемого кода (горячие точки).
  • Некоторые системы, которые выглядят и действуют как интерпретаторы (например, Clojure), немедленно компилируют любой код, который они получают, но предоставляют интерактивный доступ к среде программы. Это в основном удобство интерпретаторов со скоростью двоичной компиляции.
  • Некоторые компиляторы на самом деле не компилируются, они просто предварительно переваривают и сжимают код. Некоторое время назад я слышал, как работает Perl. Так что иногда компилятор просто выполняет небольшую работу, и большая часть ее остается интерпретацией.

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

person Carl Smotricz    schedule 16.07.2010

С http://www.quora.com/What-is-the-difference-between-compiled-and-interpreted-programming-languages

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

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

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

Вы, возможно, догадались, основываясь на приведенных выше определениях, что эти два метода реализации не исключают друг друга и могут даже дополнять друг друга. Традиционно объектным языком компилятора был машинный код или что-то подобное, что относится к любому количеству языков программирования, понятных конкретным процессорам компьютера. Тогда машинный код будет работать «на металле» (хотя можно увидеть, если присмотреться, что «металл» работает во многом как интерпретатор). Сегодня, однако, очень распространено использование компилятора для генерации объектного кода, предназначенного для интерпретации - например, именно так работала Java (а иногда и продолжает работать). Существуют компиляторы, которые переводят другие языки на JavaScript, который затем часто запускается в веб-браузере, который может интерпретировать JavaScript или скомпилировать его как виртуальную машину или собственный код. У нас также есть интерпретаторы машинного кода, которые можно использовать для эмуляции одного типа оборудования на другом. Или можно использовать компилятор для генерации объектного кода, который затем является исходным кодом для другого компилятора, который может даже скомпилировать код в памяти как раз вовремя для его запуска, что в свою очередь. . . вы поняли. Есть много способов объединить эти концепции.

person Community    schedule 21.01.2015
comment
Можете ли вы исправить это предложение: существуют компиляторы, которые переводят другие языки на JavaScript, который затем часто запускается в веб-браузере, который может интерпретировать JavaScript или компилировать его как виртуальную машину или собственный код. - person Koray Tugay; 24.01.2015
comment
Успешно справился. Другая распространенная ошибка - приписывать полезность языка существующим API. - person Little Endian; 24.01.2016

Самым большим преимуществом интерпретируемого исходного кода перед скомпилированным исходным кодом является ПОРТАТИВНОСТЬ.

Если ваш исходный код скомпилирован, вам необходимо скомпилировать другой исполняемый файл для каждого типа процессора и / или платформы, на которой вы хотите, чтобы ваша программа работала (например, один для Windows x86, один для Windows x64, один для Linux x64 и т. Д. на). Кроме того, если ваш код не полностью соответствует стандартам и не использует какие-либо функции / библиотеки, специфичные для платформы, вам действительно нужно будет написать и поддерживать несколько баз кода!

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

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

person Niko Bellic    schedule 20.05.2014
comment
в этом смысле java не может считаться компилируемым языком, но этап компиляции дает преимущества компиляции (проверка типов, раннее обнаружение ошибок и т. д.) и создает байт-код, который можно запускать на любой ОС с виртуальной машиной Java. при условии. - person Rogelio Triviño; 17.01.2017

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

Традиционно «скомпилированный» означает, что этот перевод выполняется за один раз, выполняется разработчиком, а полученный исполняемый файл распространяется среди пользователей. Чистый пример: C ++. Компиляция обычно занимает довольно много времени и пытается выполнить множество дорогостоящих оптимизаций, чтобы получившийся исполняемый файл работал быстрее. Конечные пользователи не имеют инструментов и знаний для самостоятельной компиляции, а исполняемый файл часто должен работать на различном оборудовании, поэтому вы не можете выполнять много оптимизаций для конкретного оборудования. Во время разработки отдельный этап компиляции означает более длительный цикл обратной связи.

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

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

person Michael Borgwardt    schedule 16.07.2010
comment
Однако модель компиляции C ++ унаследована от C и была разработана без учета таких функций, как шаблоны. Эта неуклюжесть приводит к длительному времени компиляции C ++ в гораздо большей степени, чем любой другой фактор, и делает его плохим примером. - person ; 18.07.2010

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

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

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

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

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

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

person Uri    schedule 16.07.2010
comment
C на самом деле не привязан к машине. Синтаксис и семантика C довольно просты. Реализовать C-интерпретатор не должно быть особенно сложно, только очень много времени (потому что стандартная библиотека также должна быть реализована). И, кстати, Java можно скомпилировать в собственный машинный код (используя gcj). - person lunaryorn; 16.07.2010
comment
@lunaryorn: Я не согласен с GCJ. GCJ просто предоставляет вам среду на основе исполняемых файлов. Скомпилированные приложения связаны со средой выполнения GCJ, libgcj, которая предоставляет библиотеки основных классов, сборщик мусора и интерпретатор байт-кода. - person Uri; 16.07.2010
comment
GCJ действительно создает собственный машинный код, а не только исполняемую среду со встроенным интерпретатором и байт-кодом. libgcj предоставляет интерпретатор байт-кода для поддержки вызовов из машинного кода в байт-код Java, а не для интерпретации скомпилированной программы. Если бы libgcj не предоставлял интерпретатор байт-кода, GCJ не соответствовал бы спецификации Java. - person lunaryorn; 16.07.2010
comment
@lunaryorn: А. Хорошо, я ценю разъяснения и исправлен. В основном мы используем Java в среде Windows, поэтому я уже много лет не пробовал gcj. - person Uri; 16.07.2010
comment

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

person Steven Mohr    schedule 16.07.2010
comment
Конечно, вы можете создать компилятор для интерпретируемого языка, но скомпилированный машинный код сам по себе является зеркалом среды выполнения. - person Aiden Bell; 16.07.2010
comment
Не просто зеркало среды выполнения. Например. представьте себе такие конструкции, как eval(), во многих языках сценариев: вам действительно нужно будет включить компилятор в результирующую программу, а не только во время выполнения. - person uliwitness; 02.10.2020

Книга Python © 2015 Imagine Publishing Ltd просто подчеркивает разницу следующей подсказкой, упомянутой на странице 10 как:

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

person Ahmed Shaban Helwa    schedule 18.09.2016

Компиляция - это процесс создания исполняемой программы из кода, написанного на скомпилированном языке программирования. Компиляция позволяет компьютеру запускать и понимать программу без необходимости в программном обеспечении, используемом для ее создания. Когда программа компилируется, она часто компилируется для конкретной платформы (например, платформы IBM), которая работает с IBM-совместимыми компьютерами, но не для других платформ (например, платформы Apple). Первый компилятор был разработан Грейс Хоппер во время работы над компьютером Harvard Mark I. Сегодня большинство языков высокого уровня будут включать свой собственный компилятор или иметь доступные наборы инструментов, которые можно использовать для компиляции программы. Хорошим примером компилятора, используемого с Java, является Eclipse, а примером компилятора, используемого с C и C ++, является команда gcc. В зависимости от размера программы для компиляции может потребоваться несколько секунд или минут, и если при компиляции не обнаружено ошибок, создается исполняемый файл. Проверьте эту информацию.

person salehvm    schedule 17.08.2017

Краткое (неточное) определение:

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

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

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

В чем разница между компиляцией и интерпретацией?

Или мой более поздний пост в блоге:

https://orangejuiceliberationfront.com/the-difference-between-compiler-and-interpreter/

person uliwitness    schedule 15.02.2020