Java “Виртуальная машина” по сравнению с языком “Интерпретатора” Python?

** Предупреждение: подход, описанный в этом ответе, применим только к очень конкретным сценариям и не является безопасным, поскольку атаки SQL-инъекции не только полагаются на возможность вставлять X=Y. **

Если злоумышленники пытаются взломать форму с помощью переменной PHP $_GET или с помощью строки запроса URL, вы сможете поймать их, если они не защищены.

RewriteCond %{QUERY_STRING} ([0-9]+)=([0-9]+)
RewriteRule ^(.*) ^/track.php

Поскольку 1=1, 2=2, 1=2, 2=1, 1+1=2 и т. д. ... являются распространенными вопросами к базе данных SQL злоумышленника. Возможно, он также используется многими хакерскими приложениями.

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

196
задан Matthias Braun 24 January 2018 в 07:33
поделиться

9 ответов

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

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

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

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

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

128
ответ дан Tall Jeff 23 November 2019 в 05:18
поделиться

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

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

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

58
ответ дан Mr Fooz 23 November 2019 в 05:18
поделиться

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

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

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

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

концевая строка, когда отсылают интерпретатор Python, это означает, что мы отсылаем его в целом, и когда мы говорим PVM, который означает, что мы просто говорим о части интерпретатора Python, среды выполнения. Подобный тому из Java, мы отсылаем различные части по-другому, JRE, JVM, JDK, и т.д.

Для больше, статья в Википедии: Интерпретатор , и Виртуальная машина . Еще один один здесь . Здесь можно найти Сравнение виртуальных машин приложений . Это помогает в понимании различия между, Компиляторы, Интерпретаторы и VMs.

15
ответ дан Adeel Ansari 23 November 2019 в 05:18
поделиться

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

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

12
ответ дан Daniel Naab 23 November 2019 в 05:18
поделиться

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

9
ответ дан Cody Brocious 23 November 2019 в 05:18
поделиться

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

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

3
ответ дан Arafangion 23 November 2019 в 05:18
поделиться

Python может интерпретировать код, не компилируя его в байт-код. Java не может .

Python является интерпретируемым языком, в противоположность скомпилированному, хотя различие может быть расплывчатым из-за присутствия компилятора байт-кода. Это означает, что исходные файлы могут быть выполнены непосредственно, явно не создавая исполняемый файл, который затем выполняется.

(из документации).

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

Однако в типичном случае, большая часть Python (по крайней мере, CPython) кодирует выполнения в эмулированной стековой машине, которая имеет почти идентичные инструкции к тем из JVM, таким образом, нет никакой большой разницы.

настоящая причина для distiction однако - то, потому что с начала Java выпустил под брендом себя "портативным, исполняемым байт-кодом", и Python выпустил под брендом себя динамическим, интерпретируемым языком с REPL. Палка имен!

1
ответ дан 23 November 2019 в 05:18
поделиться

Я думаю строки и между размываюсь, люди главным образом обсуждают вокруг значения слова "интерпретатор" и как близко язык стоит каждой стороне "интерпретатора... компилятор" спектр. Ни один не делает 100% как бы то ни было. Я думаю, что легко записать Java или реализацию Python, которая можно иметь любую ценность спектра.

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

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

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

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

0
ответ дан 23 November 2019 в 05:18
поделиться

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

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

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

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

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

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

Термин «байт-код» используется в как Java, так и Python, но не весь байт-код созданы равными. байт-код - это просто общий термин для промежуточных языков используется компиляторами / интерпретаторами. Даже компиляторы C, такие как gcc, используют промежуточное звено язык (или несколько) для выполнения работы. Байт-код 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 действительно следует сравнивать с Java Целочисленный класс. Примитивный тип данных Java "int" нельзя сравнивать ни с чем в язык Python, потому что в языке Python просто отсутствует этот уровень примитивов, как и байт-код Python.

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

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

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

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

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

постоянная ссылка

153
ответ дан 23 November 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: