Интерпретируемые языки программирования исполняются или переводятся в машинный код

Введение

Когда дело доходит до компиляции и выполнения кода. Не все языки программирования следуют одному и тому же подходу. Один из распространенных. Хотя и не идеальных способов их дифференциации-разделить их на 2 группы компилируемых и интерпретируемых языков.

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

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

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

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

Компилируемый язык — это язык программирования. Который обычно реализуется с помощью компиляторов. А не интерпретаторов.

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

Хорошим примером компилируемого языка является C++.

В C++ исходный код компилируется в машинный код. Процесс компиляции состоит из предварительной обработки, компиляции и связывания. Но конечным результатом является либо библиотека. Либо исполняемый файл. Который может быть выполнен непосредственно процессором. Для которого была скомпилирована программа.

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

Основными недостатками являются плохая переносимость. Так как программы должны быть скомпилированы для конкретной архитектуры процессора и долгое время. Необходимое для фактической компиляции.

Другими примерами популярных компилируемых языков являются C, Go, Haskell или Rust.

Интерпретируемые языки

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

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

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

Несмотря на то, что довольно трудно найти какой-либо популярный язык в категории полностью интерпретируемого языка. Мы легко можем найти их много в интерпретируемом байт-коде. Примеры: Java, C#, Python или Ruby.

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

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

Середина? JIT Компиляция

Пока что похоже, что оба языка, скомпилированные и интерпретируемые, имеют свои плюсы и минусы.

Что, если я скажу вам, что вы все еще можете достичь скорости полностью скомпилированного языка. Не жертвуя переносимостью и более быстрым временем компиляции? Звучит невероятно? Это то, где JIT компиляция приходит, чтобы играть.

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

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

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

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

Некоторые из языков, которые используют JIT-компиляцию, являются Java. C# (альтернативная реализация Python) и V8 (Javascript engine).

Краткие сведения

Давайте сравним несколько основных характеристик скомпилированных. Интерпретированных и JIT-скомпилированных языков один за другим.

составленныйинтерпретированныйJIT-компиляция
скорость выполнениябыстрыймедленныйобычно быстро (в зависимости от реализации JIT)
портативностьбедныйхорошохорошо
время компиляциимедленныйбыстрый (байт-код)быстрый (байт-код)

Как вы, вероятно, уже заметили. Разделение языков программирования на скомпилированные и интерпретируемые языки довольно искусственно. Поскольку полностью интерпретируемых языков осталось не так уж много.

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

Дополнительный

Еще один интересный факт, прежде чем мы закончим.

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

Это не исчерпывающий список альтернативных реализаций Python

  • IronPython (Python работает на .NET)
  • Jython (Python, работающий на виртуальной машине Java)
  • PyPy (Python с JIT-компилятором)

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