Каждая программа представляет собой набор инструкций, будь то добавление двух чисел или отправка запроса через Интернет. Компиляторы и интерпретаторы берут понятный человеку код и преобразуют его в машиночитаемый машинный код.
На скомпилированном языке целевая машина напрямую переводит программу. В интерпретируемом языке исходный код не транслируется напрямую целевой машиной. Вместо этого другая программа, также известная как интерпретатор, читает и выполняет код.
Хорошо ... но что это на самом деле означает?
Представьте, что у вас есть рецепт хумуса, который вы хотите приготовить, но он написан на древнегреческом языке. Вы, не говорящий на древнегреческом языке, можете следовать его указаниям двумя способами.
Во-первых, если кто-то уже перевел его на английский для вас. Вы (и любой другой, кто говорит по-английски) можете прочитать английскую версию рецепта и приготовить хумус. Думайте об этом переведенном рецепте как о скомпилированной версии.
Второй способ - если у вас есть друг, знающий древнегреческий язык. Когда вы будете готовы приготовить хумус, ваш друг садится рядом с вами и переводит рецепт на английский, строка за строкой. В этом случае ваш друг является переводчиком интерпретированной версии рецепта.
Скомпилированные языки
Скомпилированные языки преобразуются непосредственно в машинный код, который может выполнять процессор. В результате они, как правило, быстрее и эффективнее выполняются, чем интерпретируемые языки. Они также дают разработчику больше контроля над аппаратными аспектами, такими как управление памятью и использование ЦП.
Для скомпилированных языков требуется этап «сборки» - сначала их нужно скомпилировать вручную. Вам нужно «перестраивать» программу каждый раз, когда вам нужно внести изменения. В нашем примере с хумусом весь перевод написан до того, как он попадет к вам. Если первоначальный автор решит, что он хочет использовать другой вид оливкового масла, весь рецепт нужно будет снова перевести и повторно отправить вам.
Примерами чистых скомпилированных языков являются C, C ++, Erlang, Haskell, Rust и Go.
Переводимые языки
Интерпретаторы запускают программу построчно и выполняют каждую команду. Здесь, если автор решает использовать другой вид оливкового масла, он может вычеркнуть старое и добавить новое. Затем ваш друг-переводчик может передать вам это изменение, когда оно произойдет.
Интерпретируемые языки когда-то были значительно медленнее, чем компилируемые языки. Но с развитием своевременной компиляции этот разрыв сокращается.
Примеры распространенных интерпретируемых языков: PHP, Ruby, Python и JavaScript.
Небольшая оговорка
Большинство языков программирования могут иметь как скомпилированные, так и интерпретируемые реализации - сам язык не обязательно компилируется или интерпретируется. Однако для простоты их обычно называют таковыми.
Python, например, может выполняться либо как скомпилированная программа, либо как интерпретируемый язык в интерактивном режиме. С другой стороны, большинство инструментов командной строки, интерфейсов командной строки и оболочки теоретически можно отнести к интерпретируемым языкам.
Преимущества и недостатки
Преимущества компилируемых языков
Программы, скомпилированные в машинный код, обычно быстрее интерпретируемого. Это связано с тем, что процесс трансляции кода во время выполнения увеличивает накладные расходы и может замедлить выполнение программы в целом.
Недостатки компилируемых языков
Наиболее заметные недостатки:
- Дополнительное время, необходимое для завершения всего этапа компиляции перед тестированием
- Платформенная зависимость сгенерированного двоичного кода
Преимущества интерпретируемых языков
Интерпретируемые языки обычно более гибкие и часто предлагают такие функции, как динамический набор текста и меньший размер программы. Кроме того, поскольку интерпретаторы сами выполняют исходный программный код, сам код не зависит от платформы.
Недостатки интерпретируемых языков
Наиболее заметным недостатком является типичная скорость выполнения по сравнению с компилируемыми языками.