Это просто удивление, которое я испытал, читая о интерпретируемых и компилируемых языках.
Ruby , без сомнения, является интерпретируемым языком, поскольку исходный код обрабатывается интерпретатором в точке исполнения.
Напротив, C - это скомпилированный язык, так как нужно сначала скомпилировать исходный код в соответствии с машиной, а затем выполнить. Это приводит к гораздо более быстрому исполнению.
Теперь перейдем к Python :
- Код Python ( somefile.py ) при импорте создает файл ( somefile.pyc ) в том же каталоге. Допустим, импорт выполняется в оболочке Python или модуле Django. После импорта я немного изменяю код и снова выполняю импортированные функции, чтобы обнаружить, что он все еще выполняет старый код. Это говорит о том, что файлы * .pyc представляют собой скомпилированные файлы Python, аналогичные исполняемым файлам, созданным после компиляции файла C, хотя я не могу выполнить файл * .pyc напрямую.
- Когда файл python (somefile.py) выполняется напрямую (./somefile.py или python somefile.py), файл .pyc не создается, а код выполняется так, как указывает на интерпретированное поведение.
Они предполагают, что код python компилируется каждый раз, когда он импортируется в новый процесс для создания .pyc, в то время как он интерпретируется при непосредственном выполнении.
Так какой тип языка мне следует рассматривать? Интерпретируется или компилируется? И как его эффективность сравнивается с интерпретируемыми и скомпилированными языками?
Согласно странице вики в переводе с языков , он указан как язык, скомпилированный с кодом виртуальной машины. Что это значит?
RUN
. Это было, как если бы у вас был компилятор, который выполнил шаг лексирования, а затем вывел поток токенов, которые нужно было повторно анализировать при каждом запуске программы. Совсем не похоже на современную компиляцию байт-кода, как это делается, скажемjavac
, с использованием лексирования, анализа и оптимизации.Ответы:
Стоит отметить, что языки не интерпретируются и не компилируются, а, скорее, реализации языка либо интерпретируют, либо компилируют код. Вы отметили, что Ruby - это «интерпретируемый язык», но вы можете скомпилировать Ruby в стиле MacRuby , так что это не всегда интерпретируемый язык.
Практически каждая реализация Python состоит из интерпретатора (а не компилятора). Эти
.pyc
файлы вы видите байт - код для виртуальной машины Python ( по аналогии с Явы.class
файлов). Они не совпадают с машинным кодом, сгенерированным компилятором C для собственной машинной архитектуры. Тем не менее, некоторые реализации Python состоят из компилятора, который работает точно по времени , который скомпилирует байт-код Python в машинный код.(Я говорю «почти каждый», потому что я не знаю ни одного машинного компилятора для Python, но я не хочу утверждать, что нигде не существует.)
источник
Python попадет под интерпретируемый байт-код.
.py
Исходный код сначала компилируется в байтовый код как.pyc
. Этот байт-код может быть интерпретирован (официальный CPython) или скомпилирован JIT (PyPy). Исходный код Python (.py
) может быть скомпилирован с другим байтовым кодом, например, IronPython (.Net) или Jython (JVM). Существует несколько реализаций языка Python. Официальный - интерпретируемый байт-код. Существуют также скомпилированные JIT-реализации байт-кода.Для сравнения скорости различных реализаций языков вы можете попробовать здесь .
источник
Скомпилированный или интерпретированный может быть полезен в некоторых контекстах, но при применении в техническом смысле это ложная дихотомия.
Компилятор (в широком смысле) является переводчиком . Программа переводит программу A в программу B и в будущем выполняет ее на машине M.
Переводчик (в широком смысле) является исполнителем . Это машина M, которая выполняет программу A. Хотя мы обычно исключаем из этого определения физические машины (или нефизические машины, которые действуют так же, как физические). Но с теоретической точки зрения это различие несколько произвольно.
Например, взять
re.compile
. Он «компилирует» регулярное выражение в промежуточную форму, и эта промежуточная форма интерпретируется / оценивается / выполняется.В конце концов, это зависит от того, на каком уровне абстракции вы говорите, и что вас волнует. Люди говорят «скомпилировано» или «интерпретировано» как широкое описание наиболее интересных частей процесса, но на самом деле почти каждая программа компилируется (переводится) и интерпретируется (выполняется) тем или иным способом.
CPython (наиболее популярная реализация языка Python) в основном интересен для выполнения кода. Поэтому CPython обычно описывается как интерпретированный. Хотя это свободный ярлык.
источник
Код виртуальной машины - это более компактная версия исходного исходного кода (байт-код). Это все еще должно интерпретироваться виртуальной машиной, так как это не машинный код. Однако анализировать проще и быстрее, чем оригинальный код, написанный человеком.
Некоторые виртуальные машины генерируют машинный код при первой интерпретации кода виртуальной машины (как раз во время компиляции - JIT). Следующие вызовы будут использовать этот машинный код напрямую, что приводит к более быстрому выполнению.
Насколько я знаю, Ruby> = 1.9 тоже использует виртуальную машину, такую как Python.
источник
Среда выполнения Python запускает пользовательский объектный код (байт-код) на виртуальной машине.
Процесс компиляции преобразует исходный код в объектный код.
Чтобы ускорить процесс, объектный код (или, если хотите, байт-код) хранится на диске, поэтому его можно использовать повторно при следующем запуске программы.
источник