Я учусь Java и следующие вещи являются немного запутанным для me.What я понял это:
Разъяснение относительно традиционного интерпретатора, компилятора и JIT-компилятора/интерпретатора (JAVA)
Java от компилятора> Java компилятор просто конвертировать .java-программы в .class файлы, , что означает преобразование исходного кода в байтовый код (это список операционных кодов для виртуальной машины (JVM), который делает Java, независимым от платформы).
Java Interpreter-> просто «интерпретирует» код и НЕ преобразует его в собственный машинный код. Он выполняет каждый инструкции по одному из байт-кода в качестве команды и выполняет его независимо, сколько раз происходит та же команда. (Вот почему это медленно и Java вводит концепцию JIT.)
JIT от компилятора > Это также входит в картину во время выполнения. JIT может повысить производительность за счет кэширования результатов блоков кода, который был TRANSLATED - по сравнению с простой переоценкой каждой строки или операнда в Bytecode каждый раз, когда это происходит.
Теперь у меня есть несколько вопросов.
1. Поскольку мой физический процессор понимает только машинный код, как программа Java запускается на выполнение с помощью интерпретатора JVM, как интерпретатор оленьей кожи конвертировать байты-код в машинный code.Untill, и если кто-то не помещает машинный код в память, физический процессор не сможет его выполнить.
2. Предположив, каким-то образом, интерпретатор также преобразует байт-код в машинный код, то «Блок исполнения кода с кэшированием (JIT) и построчного выполнения (интерпретатора)» является единственным, что differenciates JIT и переводчик ?
3. Если во время выполнения выдается JIT преобразует байт-код в машинный код (для выполнения программы) почему не использовать Java раньше времени компиляции, как после создания виртуальной машины Java зависимой байткод (который в свою очередь, делает независимым от Java-плагина), доставляет его на целевую машину (где мы хотим ее выполнить) и просто переводим ее в собственный машинный код (создаем .exe или .out и т. д., как в случае компиляции C). Это может быть возможно, re, имеющих определенную JVM для каждой системы. Это будет намного быстрее, чем использование JIT, поскольку для компиляции/загрузки программы требуется некоторое время, и она по-прежнему будет независимой от платформы, просто распространяя Bytecode (сгенерированный до окончательного перевода с Bytecode на M/c Код).
простите меня, если это глупый вопрос.
1.С помощью JVM вы имеете в виду переводчика или комбинацию некоторых других вещей? 2. Вы имеете в виду, что JIt делает задачу интерпретатора намного быстрее, но после JITing требуется интерпретация? 3.Как компилятор JIT может улучшить оптимизацию? Традиционный (B-code to m-code) компилятор может улучшить оптимизацию, так как он имеет полный код, доступный до выполнения. (GCC может сделать очень хорошую оптимизацию в случае C/C++) –
1) JVM в основном означает «то, что запускает Java-программу», которое ВКЛЮЧАЕТ интерпретацию, но также и другие вещи. 2) Да и нет. Даже если класс MyClass был JITted, остальная часть программы все равно может быть интерпретирована. Таким образом, JVM все еще должен быть там, чтобы обрабатывать переходы между интерпретированным и JIT-кодом. 3) Я не знаю никаких примеров из рук в руки. Я точно забыл, какие данные собираются, поэтому мне сложно думать о гипотетическом сценарии. – Smallhacker
Спасибо за вашу помощь. Но мне все же интересно узнать, почему концепция jit была принята, если есть традиционный способ компиляции и оптимизации, который может поддерживать как мобильность, так и хорошую производительность. –