В этой статье «виртуальная машина» относится к процессам виртуальных машин, а не к системным виртуальным машинам, таким как 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
У меня создалось впечатление, что python действительно генерирует байт-код, pyc, или это то, что вы называете «помощью ускорить такие интерпретируемые языки, вот где мы можем определить промежуточные формы предварительно проанализированного, предварительно обозначенного исходного кода, который более легко интерпретироваться напрямую ». –
@InSciTek Jeff: Из вашего ответа неясно, знаете ли вы, что Python также использует виртуальную машину. – tzot
@TZ - Популярная реализация Python - это компилятор Python с обратной стороной VM. В интерактивном режиме он немного гибрид как с интерфейсом интерпретатора, так и с концом компилятора. Однако это выбор реализации. Я попытался описать разницу между концепцией VM и Interpreter –