2009-01-14 5 views
148

Кажется редким читать Python «виртуальная машина», в то время как в Java «виртуальная машина» используется все время.Java «Виртуальная машина» против языка «Интерпретатор» на языке Python?

Оба интерпретируют байт-коды; зачем вызывать одну виртуальную машину, а другую - интерпретатору?

ответ

104

Виртуальная машина - это виртуальная вычислительная среда с определенным набором атомных четко определенных инструкций, которые поддерживаются независимо от какого-либо конкретного языка, и обычно это воспринимается как песочница для себя. VM аналогична набору команд конкретного ЦП и имеет тенденцию работать на более фундаментальном уровне с очень основными строительными блоками таких инструкций (или байтовых кодов), которые не зависят от следующего. Инструкция выполняет детерминистически основанную только на текущем состоянии виртуальной машины и не зависит от информации в другом месте потока команд в этот момент времени.

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

Компилятор Java преобразует язык Java в поток байтового кода, отличный от компилятора C, преобразует C-языковые программы в код сборки. Интерпретатор, с другой стороны, на самом деле не преобразовывает программу в какую-либо четко определенную промежуточную форму, она просто принимает программные действия в процессе интерпретации источника.

Другое испытание разницы между виртуальной машиной и интерпретатором заключается в том, считаете ли вы ее независимым от языка. То, что мы знаем как виртуальная машина Java, на самом деле не является специфичным для Java. Вы можете сделать компилятор с других языков, что приведет к байт-кодам, которые могут быть запущены на JVM. С другой стороны, я не думаю, что мы действительно подумали бы о «компиляции» другого языка, кроме Python, в Python для интерпретации интерпретатором Python.

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

+4

У меня создалось впечатление, что python действительно генерирует байт-код, pyc, или это то, что вы называете «помощью ускорить такие интерпретируемые языки, вот где мы можем определить промежуточные формы предварительно проанализированного, предварительно обозначенного исходного кода, который более легко интерпретироваться напрямую ». –

+19

@InSciTek Jeff: Из вашего ответа неясно, знаете ли вы, что Python также использует виртуальную машину. – tzot

+3

@TZ - Популярная реализация Python - это компилятор Python с обратной стороной VM. В интерактивном режиме он немного гибрид как с интерфейсом интерпретатора, так и с концом компилятора. Однако это выбор реализации. Я попытался описать разницу между концепцией VM и Interpreter –

7

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

+2

Я брошу вам кость здесь, так как я думаю, что это, вероятно, реальный ответ, и вы получили голос за недостаток бит. – vikingben

+2

Не лучший ответ, но самый правильный! – justinfay

53

Вероятно, одна из причин различной терминологии заключается в том, что обычно предполагается, что исходный код интерпретатора python-интерпретатора является необработанным и не беспокоится о байт-коде и все это.

В Java вы должны явно скомпилировать байт-код, а затем запустить только байт-код, а не исходный код на виртуальной машине.

Несмотря на то, что Python использует виртуальную машину под обложками, с точки зрения пользователя, большую часть времени можно игнорировать эту деталь.

+0

Согласен. Это различие в терминологии действительно сводится к опыту конечного пользователя (разработчика, то есть). Это не имеет ничего общего с реальными техническими различиями, поскольку техническая линия настолько невероятно размыта, что почти не существует. –

+0

+1: И - что еще более важно - в чем смысл? Какую программу вы не можете написать из-за этого различия? Какая трассировка стека вас сбивает с толку? Какая библиотека работает неправильно? –

+0

@S.Lott Потому что всегда полезно выигрывать аргументы с коллегами. ;) – Qix

12

Термин интерпретатор является устаревшим термином, относящимся к более ранним языковым скриптовым языкам. Поскольку «языки сценариев» превратились в полноценные языки, и их соответствующие платформы стали более сложными и изолированными, различие между виртуальной машиной и интерпретатором (в смысле Python) очень мало или вообще не существует.

Интерпретатор Python по-прежнему функционирует так же, как сценарий оболочки, в том смысле, что он может быть выполнен без отдельного этапа компиляции. Помимо этого, различия между интерпретатором Python (или Perl или Ruby's) и виртуальной машиной Java являются в основном деталями реализации. (Можно было бы утверждать, что Java более полно изолирован от Python, но оба в конечном итоге обеспечивают доступ к базовой архитектуре через собственный интерфейс C.)

+1

есть java-оболочки, которые могут запускать Java-код без отдельных (видимых пользователем) шагов компиляции. –

+0

gimme name: D –

3

Не забывайте, что Python имеет JIT-компиляторы, доступные для x86, что еще больше путает проблему , (См. Psyco).

Более строгая интерпретация «интерпретируемого языка» становится более полезной при обсуждении проблем с производительностью виртуальной машины, например, по сравнению с Python, Ruby был (есть?) Считаться медленнее, поскольку он является интерпретированным языком, в отличие от Python - другими словами, контекст - это все.

+1

Это неправильно. Во-первых, нет такой вещи, как «интерпретируемый язык». Вне зависимости от того, использует ли реализация компилятор или интерпретатор, это не является признаком языка, а является его реализацией. Во-вторых, из 13 или около того Ruby-реализаций ровно 1 является интерпретатором, у всех остальных есть компиляторы. –

+2

В-третьих, Ruby не медленный. Язык не медленный, потому что скорость не является признаком языка, а языковой реализацией. Из 13 реализаций Ruby некоторые из них медленнее, чем некоторые из 7 реализаций Python, некоторые из них быстрее. –

+0

Я думаю, что он сравнивает стандартные реализации здесь Jörg. CPython и Ruby (я думаю, официальная реализация называется Ruby). –

14

Интерпретатор, преобразует исходный код в некоторое эффективное промежуточное представление (код) и сразу же выполняет это.

Виртуальная машина, явно выполняет сохраненный предварительно скомпилированный код, созданный компилятором, который является частью системы интерпретатора.

Очень важной характеристикой виртуальной машины является то, что программное обеспечение, запущенное внутри, ограничено ресурсами, предоставляемыми виртуальной машиной. Точно так же он не может вырваться из своего виртуального мира. Подумайте о безопасном выполнении удаленного кода, Java-апплетов.

В случае питона, если мы держим PYC файлы, как уже говорилось в комментарии этого поста, то этот механизм станет больше похож на VM, и этот байт-код выполняется быстрее - он все равно будет интерпретироваться, но из гораздо более дружелюбной формы. Если мы посмотрим на это в целом, PVM - это последний шаг Python Interpreter.

При использовании ссылки на Python Interpreter это означает, что мы ссылаемся на нее в целом, и когда мы говорим о PVM, это означает, что мы просто говорим о части Python Interpreter, среде выполнения. Как и в Java, мы ссылаемся на разные части: дифференцил, JRE, JVM, JDK и т. Д.

Для получения дополнительной информации в Википедии: Interpreter и Virtual Machine. Еще один here. Здесь вы найдете Comparison of application virtual machines. Это помогает понять разницу между компиляторами, интерпретаторами и виртуальными машинами.

112

В этой статье «виртуальная машина» относится к процессам виртуальных машин, а не к системным виртуальным машинам, таким как Qemu или Virtualbox. Виртуальная машина процесса просто программа, которая обеспечивает общую среду программирования - программу , которая может быть запрограммирована.

Java имеет интерпретатор, а также виртуальную машину, а Python имеет виртуальную машину , а также интерпретатор. Причиной «виртуальной машины» является более общий термин « » в Java, а «интерпретатор» - более общий термин в Python, имеет много , чтобы сделать основное различие между двумя языками: статическая типизация (Java) и динамическая типизация (Python).В этом контексте «тип» относится к primitive data types - типам, которые предполагают размер памяти в памяти данных. У виртуальной машины Java это легко. Для этого требуется, чтобы программист указывал примитивный тип данных для каждой переменной. Это обеспечивает достаточную информацию для байт-кода Java не только для интерпретации и исполнения виртуальной машиной Java , но даже для compiled into machine instructions. . Виртуальная машина Python более сложна в том смысле, что перед выполнением каждой операции требуется дополнительная задача приостановки до выполнения каждой операции для определения примитивных типов данных для каждой переменной или структуры данных, участвующих в операции . Python освобождает программиста от мышления с точки зрения примитивных данных и позволяет выполнять операции на более высоком уровне. Цена эта свобода - производительность. «Интерпретатор» является предпочтительным термином для Python , потому что он должен приостановить проверку типов данных, а также потому, что сравнительно сжатый синтаксис динамически типизированных языков подходит для интерактивных интерфейсов. Нет никакого технического барьера для создания интерактивного интерфейса Java , но попытка написать любой статически типизированный код в интерактивном режиме будет утомительным, так что это просто не так.

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

портативный интерпретируются статически типизированный язык

Следующая ближе всего находится LLVM, но LLVM работает на различном уровне:

переносимый интерпретируемый язык ассемблера

Термин «байт-код» используется как в Java, так и в Python, но не для всех байткодов создан равным. байт-код - это всего лишь общий термин для промежуточных языков , используемый компиляторами/переводчиками. Даже компиляторы C, такие как gcc, используют intermediate language (or several), чтобы выполнить эту работу. Байт-код Java содержит информацию о примитивных типах данных, тогда как байт-код Python этого не делает. В этом отношении виртуальная машина Python (и Bash, Perl, Ruby и т. Д.) Действительно существенно медленнее, чем виртуальная машина Java, или, скорее, просто больше работы.Полезно рассмотреть, какая информация содержится в различных форматах байткодом:

  • LLVM: процессор регистрирует
  • Java: примитивные типы данных
  • Python: определяемые пользователем типы

Чтобы нарисовать реальную аналогию: LLVM работает с атомами, виртуальная машина Java работает с молекулами, а виртуальная машина Python работает с материалами. Поскольку все должно в конечном итоге разлагаться на субатомные частицы (реальные операции ), виртуальная машина Python имеет самую сложную задачу.

У программистов/составителей статически типизированных языков просто нет такого же багажа, что у интерпретаторов/составителей динамически типизированных языков. Программисты статически типизированных языков должны занять слабину, для которой выигрыш - это производительность. Однако так же, как все недетерминированные функции тайно детерминированы, так и все динамически типизированные языки тайком статически типизированы. Поэтому различия в производительности между двумя языковыми семьями должны выравниваться по времени Python меняет свое название на HAL 9000.

виртуальные машины динамических языков, как Python реализовать некоторую идеализированную логической машины, и не обязательно очень близко соответствуют к любому реальному физическому оборудованию . Виртуальная машина Java, напротив, более похожа на функциональность на классический компилятор C, за исключением того, что вместо того, чтобы испускать машинные инструкции , он выполняет встроенные подпрограммы. В Python целое число - это объект Python с привязкой к нему атрибутов и методов. В Java, int - обозначенное количество бит, обычно 32. Это не действительно сравнительное сравнение . Целые числа на Python действительно должны сравниваться с классом Integer Java . Явный «примитивный» тип данных «int» не может сравниться ни с чем в языке Python, потому что на языке Python просто отсутствует этот уровень примитивов , а также байт-код Python.

Поскольку Java переменные явно набран, можно разумно ожидать что-то вроде Jython производительности, чтобы быть в том же самом футбольном поле, как cPython. С другой стороны, виртуальная машина Java, реализованная в Python , почти гарантированно медленнее, чем грязь. И не ждите Ruby, Perl и т. Д., , чтобы получить скидку. Они не были предназначены для этого. Они были разработаны для «скриптов» , что и называется программированием в динамическом языке.

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

Психо для Python не является полной виртуальной машины Python, но только по времени компилятор, который перехватывает регулярные Python виртуальную машину в точках она думает, что это может составить несколько строк кода - в основном петли, где это думает, что примитив тип некоторой переменной останется постоянной, даже если значение меняется с каждой итерацией. В этом случае он может отказаться от определения типа постоянной линейной машины . Вы должны быть осторожны, , хотя, чтобы вы не вытащили тип из-под ног Psyco. Pysco, однако, обычно знает, как просто вернуться к обычной виртуальной машине, если он не полностью уверен, что тип не изменится.

Мораль истории состоит в том, что примитивная информация о типе данных действительно полезна компилятору/виртуальной машине.

Наконец, чтобы поставить все это в перспективе рассматривать это: программа Python выполняется с помощью интерпретатора Python/виртуальной машины, реализованной в Java работает на Java интерпретатора/виртуальной машины, реализованной в LLVM работает в QEMU действительно виртуального бега машины на iPhone.

permalink

+0

'попытка написать любой статически типизированный код в интерактивном режиме будет утомительным'. Если вы знаете OCaml и Haskell, вы увидите, что это неверно, так как они очень * сжатые статически типизированные языки. –

0

Прежде всего, вы должны понимать, что программирование или компьютерную науку в целом это не математика, и мы не имеем строгие определения для большинства терминов, которые мы используем часто.

теперь ваш вопрос:

, что это переводчик (в информатике)

Он преобразует исходный код, наименьший исполняемый блок, а затем выполняет этот блок.

что виртуальная машина

в случае виртуальной машины Java виртуальная машина представляет собой программное обеспечение, которое содержит интерпретатор, загрузчики классов, сборщик мусора, планировщик потоков, JIT компилятор и многое другое.

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

почему использование слова «Переводчик», когда речь идет о питона

с Java компиляции часть явно. python, с другой стороны, не является явным как java о его процессе компиляции и интерпретации, поскольку интерпретация перспективы конечного пользователя является единственным механизмом, используемым для выполнения программ python.