JVM по определению представляет собой виртуальную машину, т. е. программную машину, которая имитирует работу реальной машины. делает. Как и настоящие машины, он имеет набор инструкций (bytecodes), архитектуру виртуального компьютера и модель выполнения. Он способен запускать код, написанный с помощью этого виртуального набора инструкций, почти так же, как реальная машина может запускать машинный код.
Итак, файлы классов содержат инструкции в виртуальном наборе инструкций, и он способен их выполнять. Если на то пошло, виртуальная машина может либо интерпретировать сам код, либо скомпилировать его для аппаратной архитектуры, на которой она работает в данный момент. Некоторые делают оба, некоторые только один из них (например, среда выполнения .net компилируется один раз при первом вызове метода).
Например, Java HotSpot первоначально интерпретирует байт-коды и постепенно компилирует код в машинный код. Это называется адаптивной оптимизацией. Некоторые виртуальные машины всегда напрямую компилируются в машинный код.
Итак, вы можете видеть, что есть две разные концепции компиляции. Один состоит в преобразовании кода Java в байт-коды JVM (из .java в .class). И вторая фаза компиляции происходит, когда программа запускается, где байт-коды могут быть либо интерпретированы, либо скомпилированы в реальный машинный код. Это делается с помощью компилятора Just-in-time внутри JVM.
Итак, как видите, компьютер не может напрямую запускать Java-программу, потому что программа не написана на языке, понятном компьютеру. Он написан на лингва-франка, который могут понять все реализации JVM. И существуют реализации этой JVM для многих операционных систем и аппаратных архитектур. Эти JVM переводят программы на этот язык общения (байт-коды) для любого конкретного оборудования (машинный код). В этом прелесть виртуальной машины.
29.03.2014