Интерпретируемые и скомпилированные языки программирования: в чем разница?

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

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

Хорошо ... но что это на самом деле означает?

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

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

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

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

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

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

Примерами чистых скомпилированных языков являются C, C ++, Erlang, Haskell, Rust и Go.

Переводимые языки

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

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

Примеры распространенных интерпретируемых языков: PHP, Ruby, Python и JavaScript.

Небольшая оговорка

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

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

Преимущества и недостатки

Преимущества компилируемых языков

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

Недостатки компилируемых языков

Наиболее заметные недостатки:

  • Дополнительное время, необходимое для завершения всего этапа компиляции перед тестированием
  • Платформенная зависимость сгенерированного двоичного кода

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

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

Недостатки интерпретируемых языков

Наиболее заметным недостатком является типичная скорость выполнения по сравнению с компилируемыми языками.