Как Java платформенно независим, когда ему нужна JVM для выполнения?

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

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

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

Кому-то могло нравиться тому, что предназначено, когда Java описан как "независимый от платформы"?

76
задан Duncan Jones 6 December 2013 в 10:53
поделиться

9 ответов

Обычно скомпилированный код представляет собой точный набор инструкций, необходимых процессору для «выполнения» программы. В 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).

106
ответ дан 24 November 2019 в 11:08
поделиться

Edit: Not quite. См. комментарии ниже.

Java не работает напрямую ни на чем. Она должна быть преобразована в байткод с помощью JVM.

Поскольку JVM существуют для всех основных платформ, это делает Java платформонезависимой ВНУТРИ JVM.

-2
ответ дан 24 November 2019 в 11:08
поделиться

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

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

В исходном вопросе Turbo C аналогичен программе javac, а JVM - это OS / HAL.

1
ответ дан 24 November 2019 в 11:08
поделиться

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

3
ответ дан 24 November 2019 в 11:08
поделиться

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

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

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

7
ответ дан 24 November 2019 в 11:08
поделиться

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

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

8
ответ дан 24 November 2019 в 11:08
поделиться

JVM будет зависеть от платформы.
Но то, что она будет генерировать, будет независимым от платформы. [который мы называем байткодом или просто можно сказать... файлом класса]. именно поэтому Java называется платформонезависимой.
Вы можете запустить тот же файл класса на Mac, а также на Windows, но для этого потребуется JRE.

1
ответ дан 24 November 2019 в 11:08
поделиться

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

С помощью Java вы можете компилировать исходный код в Windows, а скомпилированный код (байт-код, если быть точным) может быть выполнен (интерпретирован) на любой платформе, на котором работает JVM. Так что да, вам нужна JVM, но JVM может выполнять любой скомпилированный код, скомпилированный код платформонезависим.

Другими словами, у вас есть как переносимость исходного кода, так и переносимость скомпилированного кода.

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

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

Другими словами, с C / C ++ у вас есть переносимость исходного кода (с некоторой дисциплиной), но не переносимость скомпилированного кода: вам нужно перекомпилировать для каждой архитектуры в специфичные для платформы двоичные файлы.

1
ответ дан 24 November 2019 в 11:08
поделиться

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

25
ответ дан 24 November 2019 в 11:08
поделиться
Другие вопросы по тегам:

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