Как Java независима от платформы, когда ей нужна JVM для запуска? - PullRequest
76 голосов
/ 01 мая 2010

Я только начал изучать Java и запутался в теме независимости от платформы.

Разве «независимый» не означает, что код Java должен работать на любом компьютере и не требует установки специального программного обеспечения? И все же в машине должна присутствовать JVM.

Например, нам нужен Turbo C Compiler для того, чтобы скомпилировать исходный код C / C ++ и затем выполнить его. На машине должен быть установлен компилятор C.

Может ли кто-нибудь сказать, что имеется в виду, когда Java описывается как «независимый от платформы»?

Ответы [ 23 ]

105 голосов
/ 01 мая 2010

Как правило, скомпилированный код - это точный набор инструкций, которые требуется ЦПУ для «выполнения» программы. В Java скомпилированный код представляет собой точный набор инструкций для «виртуального ЦП», который должен работать одинаково на каждой физической машине.

Таким образом, в некотором смысле разработчики языка Java решили, что язык и скомпилированный код будут независимыми от платформы, но, поскольку в конечном итоге код должен работать на физической платформе, они решили поместить всю платформу зависимый код в JVM.

Это требование для JVM противоречит вашему примеру с Turbo C. В Turbo C компилятор будет генерировать код, зависящий от платформы, и JVM не будет работать аналогично, поскольку скомпилированная программа Turbo C может выполняться непосредственно процессором.

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

Единственный способ, которым весь этот байт-код Java работает на всех виртуальных машинах Java, заключается в том, что был написан довольно строгий стандарт для работы виртуальных машин Java. Это означает, что независимо от того, какую физическую платформу вы используете, та часть, где байт-код Java взаимодействует с JVM, гарантированно будет работать только одним способом. Поскольку все JVM работают абсолютно одинаково, один и тот же код везде работает одинаково без перекомпиляции. Если вы не можете пройти тесты, чтобы убедиться, что это то же самое, вы не можете называть свою виртуальную машину «виртуальной машиной Java».

Конечно, есть способы, которые могут нарушить переносимость Java-программы. Вы можете написать программу, которая ищет файлы, найденные только в одной операционной системе (например, cmd.exe). Вы можете использовать JNI, который эффективно позволяет помещать скомпилированный код C или C ++ в класс. Вы можете использовать соглашения, которые работают только для определенной операционной системы (например, предполагая, что ":" разделяет каталоги). Но вам гарантированно никогда не придется перекомпилировать вашу программу для другой машины, если вы не делаете что-то действительно особенное (например, JNI).

54 голосов
/ 28 ноября 2012
            Technical Article on How java is platform indepedent?

Прежде чем углубляться в детали, сначала вы должны понять, что означает платформа? Платформа состоит из компьютерного оборудования (в основном архитектура микропроцессора) и ОС. Платформа = оборудование + операционная система

Все, что не зависит от платформы, может работать на любой операционной системе и оборудовании.

Java не зависит от платформы, поэтому java может работать на любой операционной системе и оборудовании. Теперь вопрос, как это зависит от платформы?

Это из-за магии Байт-кода, который не зависит от ОС. Когда компилятор java компилирует любой код, он генерирует байт-код, а не машинный код (в отличие от компилятора C). Теперь это Байт-код требует интерпретатора для выполнения на машине. Этот переводчик - JVM. Таким образом, JVM читает этот байт-код (это не зависит от машины) Я выполню это. Разные JVM предназначены для разных ОС, а байт-код может работать на разных ОС.

В случае C или C ++ (язык, не зависящий от платформы), компилятор создает файл .exe, который зависит от ОС, поэтому, когда мы Запустите этот файл .exe на другой ОС, он не запустится, так как этот файл зависит от ОС, поэтому не совместим с другой ОС.

Наконец, независимый от ОС байт-код делает платформу Java независимой.

25 голосов
/ 01 мая 2010

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

8 голосов
/ 01 мая 2010

Нет, все наоборот. Именно потому, что вы используете виртуальную машину, программа Java получает независимую информацию.

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

7 голосов
/ 01 мая 2010

JVM - это «симулируемая машина», которую можно установить в разных системах. Таким образом, один и тот же код Java может выполняться в разных системах, поскольку он опирается на JVM, а не на саму операционную систему.

То есть, это позволяет программисту взаимодействовать с виртуальной системой (JVM) и использовать ее функции вместо функций конкретной машины и ОС. Поскольку Java полагается только на JVM, она не зависит от платформы (если на платформе установлена ​​JVM).

Короче говоря, Java не является независимой от платформы как таковой, она требует установки JVM для всех систем, на которых она должна работать. Однако он будет работать во всех системах, в которых установлена ​​JVM.

4 голосов
/ 21 февраля 2015

Java не зависит от платформы, так как имеет JVM (виртуальная машина Java). Давайте проиллюстрируем это на примере из реальной жизни. Давайте предположим, что вы свободны для членов вашей семьи. Но почему?

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

Аналогичным образом, если вы код, а я JVM. Кроме того, ваша семья - платформа Windows, а моя - платформа Linux. В случае, если вы были C или другими зависимыми от платформы языками, вы знаете только членов своей семьи и наоборот. Вот почему только платформа, на которой вы были написаны, знает этот код и будет его поддерживать. Но если вы код JAVA и когда вы приходите в мою семью, а именно. платформу Linux, и если вы найдете меня, JVM, то я смогу представить вас моей семье, платформе Linux, и вы сможете с ней взаимодействовать.

Для платформо-зависимых языков нет таких друзей, как JVM, которые могли бы представиться в любом семействе платформ. Вот как Java независима от платформы. :)

3 голосов
/ 17 мая 2014

Java не является независимой от платформы, она сама является платформой, основанной на той платформе, на которой работают Java-приложения, но сама платформа Java зависит от платформы

3 голосов
/ 01 мая 2010

JVM абстрагируется от конкретной платформы. Ваша программа опирается только на JVM, и поскольку JVM доступна для разных платформ, таких как Windows и Linux, ваша программа не зависит от платформы (но зависит от jvm).

3 голосов
/ 21 января 2012

В c / c ++ исходный код (программный файл c) после компиляции с использованием компилятора напрямую преобразуется в собственный машинный код (что понятно для конкретной машины, на которой вы компилируете код). И, следовательно, скомпилированный код c / c ++ не может работать на разных ОС.

Но в случае Java: исходный файл java (.java) будет скомпилирован с использованием компилятора JAVAC (присутствует в JDK), который предоставляет байт-код (файл .class), понятный для любой JVM, установленной в любой ОС ( Физическая система).

Здесь нам нужно иметь разные JVM (которые зависят от платформы) для разных операционных систем, в которых мы хотим запустить код, но файл .class (скомпилированный код / ​​промежуточный код) остается тем же, потому что он понятен любому из JVM установлена ​​в любой ОС.

В c / c ++: только исходный код является машинно-независимым. В Java: и исходный код, и скомпилированный код не зависят от платформы.

Это делает платформу Java (машинную) независимой.

2 голосов
/ 18 октября 2018

Проще говоря:

Язык программирования Java не зависит от платформы.

JVM зависит от платформы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...