Узнаем, какая разница между компилятором и интерпретатором…
Прежде чем мы будем говорить о том, как работают разные языки, необходимо выделить непосредственные категории ЯП.
Внимание: разделение ЯП на компиляторы и интерпретаторы условное, так как тот же интерпретатор может быть сформирован абсолютно для любого из них.
P-код, или независимый от аппаратного элемента. Его использует Java, Python, Perl и т. д. Под P-кодом чаще всего подразумевается алгоритм аппаратно-независимого кода: при инициализации программы начинается его интерпретация. При этом исходный код автоматически конвертируется в двоичный.
Не стоит смешивать истинный машинный код и P-код. Первый имеет более сложное устройство, а второй гораздо мощнее, чем машинный
Изначально концепция аппаратно-независимого P-кода задумывалась как гибрид: компилятор + интерпретатор.
Компилируемые языки программирования
Этот вид можно назвать стандартным, так как он более распространен. Из примеров можно назвать Ada, C (Objective-C и C++), Pascal, Swift, Fortran, Rust, Delphi, D и множество других.
Эти языки работают следующим образом:
- Исходный код преобразуется программой-компилятором.
- Образуется машинный код.
- Машинный код заносится в файл. Такой файл имеет уникальное расширение или заголовок (что-то одно или оба сразу).
- Созданный файл исполняется ОС.
Компилируемые типы позволяют запускать созданные двоичные коды без учета исходника. Еще один маркер этой категории — высочайшая скорость выполнения.
Как правило, компилируемые ЯП имеют более сложное устройство, кроме того — они труднее непосредственно в плане кодинга
Ведь машинный код (сформированный в ходе компиляции) не может быть прочитан человеком. Зато все функции операционной системы в них обычно доступны изначально.
Интерпретируемые языки программирования
Этот вид отличается тем, что исходник (изначальный код программы) исполняется через интерпретацию. Примеры таких языков — Python, PHP, Ruby, Perl. В отличие от компилируемых вариантов, интерпретируемые содержат инструкции, которые не должны выполняться машиной. Это работа делегируется иной программе.
Интерпретаторы выполняют написанную программу построчно. Эта категория допускает просчеты и позволяет совершать некоторые ошибки — выполнение кода не пострадает
Интерпретируемые языки гораздо более гибкие. Легче поделиться своим кодом, так как он будет работать на любой машине, которая может его интерпретировать:
Динамические области видимости, независимость от изначальной базы и динамическая типизация — вот главные маркеры интерпретируемых языков
Изначально интерпретируемые языки были заметно медленнее, чем компилируемые, сейчас эта тенденция выровнялась. Минусы: нет такого широкого вызова функций ОС как в компилируемых вариантах.
Интерпретируемые ЯП работают следующим образом:
- Программа-интерпретатор сканирует исходник.
- Исходный код переводится в необходимые вычисления. Параллельно выполняются сопутствующие операции, например, создание системных вызовов.
- Исходник интерпретируется повторно до тех пор, пока не будет выполнена программа.
Главное, что нужно запомнить: в случае с интерпретируемыми ЯП с программой функционирует не само ядро ОС, а интерпретатор.
Теперь переходим к двум самым популярным вопросам, когда дело касается интерпретируемых и компилируемых языков
Python — это компилируемый или интерпретируемый язык?
Python является скомпилировано-интерпретируемым языком программирования. При запуске программы сперва анализируется синтаксис программы, затем программа компилирует исходный код и конвертирует его в байт, затем байт-код подгружается сразу в системную память.
Да, во многих моментах Python функционирует как настоящий интерпретируемый язык, но код перед выполнением всё равно компилируется
Java — это компилируемый или интерпретируемый язык?
Здесь тоже всё не так просто. Вообще Java изначально компилируется в промежуточный код, после этот байт-код конвертируется и затем переходит в виртуальную машину Java. В свою очередь, уже эта ВМ интерпретирует полученный код необходимым образом.
Java задействует так называемую JIT-компиляцию, которая необходима для создания машинного кода, хотя (если брать последовательно) сперва этот код конвертируется в интерпретируемое воплощение
Наконец то нормальная статья объясняющая разницу между компиляцией и интерпретацией. Спасибо