Ну, я хочу, чтобы все было просто.
Как вы программировали в ZX Spectrum, то есть в старые времена, когда на самом деле вы не используете ОС (даже до эры DOS, в эпоху до ПК). Вы пишете свой код, и вы должны управлять всем. Во многих случаях не было компилятора, поэтому ваша программа была интерпретирована.
Далее было понято, что ОС - отличная вещь, и программы стали проще. Кроме того, компилятор был в более широком использовании. Я говорю о C ++, например. В этих программах, если вам нужно вызвать какую-то функцию ОС, вы добавили нужную библиотеку и сделали свой вызов. Один из недостатков, когда ваша программа зависит от ОС, другая проблема заключалась в том, что ваши программы включают OS DLL в некоторой фиксированной версии. Если другая программа на той же станции требует, чтобы DLL в другой версии, у вас были проблемы.
В первые годы истории JVM не использовался JIT-компилятор. Итак, ваша программа работает в интерпретированном режиме. Вашему приложению больше не нужно напрямую вызывать ОС, вместо этого оно использует JVM для всего, что ему нужно. Вместо этого JVM перенаправляет некоторые вызовы приложений в ОС. Думайте о JVM как о посреднике. Одна из лучших особенностей JVM - универсальность. Если вам не нужно придерживаться определенной ОС (хотя на практике вам нужно внести некоторые незначительные изменения, когда вы не придерживаетесь требований Java, в то время как ваша программа «иногда» работает в какой-то конкретной ОС, например, вы используете C: \ для файлов или предположений в планировщике потоков, что в текущей ОС соответствует действительности, но обычно JVM не гарантируется как истинное). Программисты JVM разрабатывают такой API, который, с одной стороны, может быть простым в использовании для разработчика Java, и с другой стороны можно будет сопоставить любые системные вызовы ОС .
JVM предоставляет вам более простую оболочку для ОС. Например, у него есть собственная модель памяти (синхронизация потоков), которая имеет несколько недельных грантополучателей (она была полностью пересмотрена в JDK 1.5, потому что она была повреждена). У него также есть сборщик мусора, он инициализирует переменные нулевыми значениями (int i
; я буду инициализироваться 0). Это то, что JVM помимо того, что является модератором ОС, действует как вспомогательный код для вашего собственного приложения.
В какой-то момент JIT был добавлен. Он был добавлен для уменьшения накладных расходов, создаваемых JVM. Когда некоторые предположения выполняются, обычно после одного выполнения кода, интерпретация команды может быть скомпилирована в машинный код (я пропускаю фазу байтового кода). Это оптимизация, и я не знаю ни одного случая, где вы могли бы повлиять.
В JDK 1.6 добавлена еще одна оптимизация. Теперь некоторые объекты при некоторых обстоятельствах могут быть размещены в стеке, а не в куче. Я не знаю, может быть, у него есть побочные эффекты, но это пример того, что JVM может сделать для вас.
И мое последнее замечание. Когда вы компилируете свой код, что действительно происходит, ваша программа проверяется на синтаксическую корректность, а затем генерируется байт-код (файл .class). Язык Java использует подмножество существующих байт-кодов (так был реализован AOP, используя существующие байт-коды, которые не являются частью языка Java). Когда Java-программа выполняется, эти байтовые коды интерпретируются , они транслируются на лету в машинные инструкции. Если JIT включен, то некоторые из строк исполнения могут быть скомпилированы для машинного языка и использованы повторно вместо интерпретации «на лету».