Мне дали понять, что Python является интерпретируемым языком ...
Этот популярный мем некорректен или, скорее, построен на неправильном понимании (естественного) языкаУровни: похожая ошибка - сказать: «Библия - книга в твердом переплете».Позвольте мне объяснить это сравнение ...
"Библия" - это "книга" в том смысле, что она является классом (реальных физических объектов, идентифицированных как) книг;Предполагается, что книги, обозначенные как «копии Библии», имеют нечто общее (содержание, хотя даже они могут быть на разных языках, с разными приемлемыми переводами, уровнями сносок и другими аннотациями), однако эти книгивполне допустимо отличаться множеством аспектов, которые не считаются фундаментальными - вид переплета, цвет переплета, шрифт (ы), используемые при печати, иллюстрации, если таковые имеются, широкие поля для записи или нет,числа и виды встроенных закладок и т. д. и т. п.
Вполне возможно, что типичная печать Библии действительно будет в переплете - в конце концов, этокнига, которую обычно нужно читать снова и снова, добавлять в закладки в нескольких местах, пролистывать в поисках заданных указателей глав и стихов и т. д., и т. д., и хорошее связывание в твердом переплете может продлить срок действия данной копии при таком использовании.Однако это обычные (практические) проблемы, которые нельзя использовать для определения того, является ли данный фактический объект книги копией Библии или нет: печатные издания в мягкой обложке вполне возможны!
Аналогично, Python - это «язык»в смысле определения класса language реализаций , которые все должны быть похожи в некоторых фундаментальных отношениях (синтаксис, большинство семантик, кроме тех частей, где им явно разрешено различаться)но им разрешено различаться практически во всех деталях «реализации», включая то, как они справляются с исходными файлами, которые им предоставляются, скомпилируют ли они исходники в некоторые формы более низкого уровня (и, если да, то какая форма - исохраняют ли они такие скомпилированные формы на диск или в другое место), как они выполняют указанные формы и т. д.
Классическая реализация, CPython, часто для краткости называется просто «Python» - но это всего лишь одиннескольких реализаций качества производства, наряду с IronP от Microsoftython (который компилируется в коды CLR, т. е. ".NET"), Jython (который компилируется в коды JVM), PyPy (который написан на самом Python и может компилироваться в огромное разнообразие "внутренних" форм, включая "простосвоевременно созданный машинный язык).Все они - Python (== "реализации языка Python"), точно так же, как многие поверхностно разные книжные объекты могут быть Библиями (== "копии Библии").
Если вы заинтересованы вВ частности, CPython: он компилирует исходные файлы в специфичную для Python форму нижнего уровня (известную как «байт-код»), делает это автоматически при необходимости (когда нет файла байт-кода, соответствующего исходному файлу, или файл байт-кода старше, чемисходный код или скомпилированный другой версией Python), обычно сохраняет файлы байт-кода на диск (чтобы избежать их повторной компиляции в будущем).OTOH IronPython обычно компилируется в коды CLR (сохраняя их на диск или нет, в зависимости от ситуации) и Jython в коды JVM (сохраняя их на диск или нет - он будет использовать расширение .class
, если сохранит их).
Эти формы более низкого уровня затем выполняются соответствующими «виртуальными машинами», также известными как «интерпретаторы» - виртуальная машина CPython, среда выполнения .Net, виртуальная машина Java (также известная как JVM).
Таким образом, в этом смысле (что делают типичные реализации), Python является «интерпретируемым языком» тогда и только тогда, когда есть C # и Java: у всех них есть типичная стратегия реализации - сначала генерировать байт-код, а затем выполнять его через VM / интерпретатор..
Скорее всего, основное внимание уделяется тому, насколько «тяжелым», медленным и запоминающимся является процесс компиляции. CPython предназначен для компиляции настолько быстро, насколько это возможно, настолько легко, насколько это возможно, с минимально возможной церемонией - компилятор выполняет очень мало проверки и оптимизации ошибок, поэтому он может работать быстро и с небольшими объемами памяти, что, в свою очередь, позволяет ему запускаться автоматически и прозрачно при необходимости, даже если пользователю не нужно знать, что в большинстве случаев происходит компиляция. Java и C # обычно принимают больше работы во время компиляции (и поэтому не выполняют автоматическую компиляцию), чтобы более тщательно проверять ошибки и выполнять больше оптимизаций. Это континуум серых шкал, а не черно-белая ситуация, и было бы совершенно произвольно установить порог на каком-то заданном уровне и сказать, что только выше этого уровня вы называете это «компиляцией»! -)