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


79

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

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

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

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


4
@aaa: Насколько я знаю, он был доступен для бесплатной загрузки на сайте Borland.
dan04

1
Да, указано как Antique Software ... ( edn.embarcadero.com/article/20841 ).
Мэтью Флашен,

2
Turbo C (или любой другой «родной» компилятор) не требуется для выполнения скомпилированной программы. компилятор создает .exeфайл. в лучшем случае для этого требуется библиотека времени выполнения (в .dllфайле), а не весь компилятор
Хавьер

Ответы:


111

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


1
«Поскольку все JVM работают точно так же, один и тот же код работает одинаково везде без перекомпиляции». Что означает это предложение? Каждый раз, когда вы запускаете одну и ту же программу в разных системах с установленной JVM, мы всегда делаем это "javac filename.java". (Возьмем, к примеру, любую простую программу) Если не требуется повторная компиляция программы, то почему говорят, что «мы могли бы запускать один и тот же код где угодно без перекомпиляции?». Пожалуйста, объясни.
Каран Таккар

3
Вам необходимо скомпилировать исходный код java, отсюда и "javac filename.java". Однако вам нужно это сделать только один раз, а не на каждой машине, где он используется (это отличается от C и C ++). Если вы измените процессоры, 32/64-битные системы, порядок байтов и т. Д., Код все равно будет работать. Это потому, что вывод "filename.class" содержит байтовый код, который является инструкциями для JVM. Поскольку все JVM функционально идентичны, после компиляции кода вы можете запустить этот байт-код на любой виртуальной машине Java без исходного кода. Попробуй, работает. Кроме того, некоторые комментарии, которые вы делаете, путают компиляцию с перекомпиляцией.
Эдвин Бак

@KaranThakkar - я думаю, что расширение того, что имел в виду Эдвин, могло бы быть простой возможностью использовать одни и те же файлы .jar в ваших проектах на любой платформе без их компиляции.
vanguard69

54
            Technical Article on How java is platform indepedent?

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

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

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

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

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

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


5
Это глупый ответ. Что делает платформу Java независимой, так это тот факт, что Java зависит от виртуальной машины. Его не волнует, на какой ОС он запущен, пока эта виртуальная машина удовлетворяет вызовы операций ОС. И VM сама по себе не зависит от платформы. Сравнение, которое вы предоставили с языком C / C ++, было подделкой, просто скомпилируйте исходный код на этой самой платформе, и он запустится, зачем переносить этот набор инструкций на другую платформу и глупо ожидать, что он будет работать? Можете ли вы перенести исходный код Java в ARM и ожидать, что он будет работать на виртуальной машине, скомпилированной для моего custom_processor?
Abhinav Gauniyal

Дизайн JVM такой же. Oracle сойдет с ума, создавая разные JVM для каждой машины. Единственное отличие - это байт-код программы, которую вы хотите запустить на каком-то компьютере. Каждая программа генерирует байт-код разного типа. Файл байт-кода имеет шестнадцатеричный формат, чтобы JVM и ЦП могли понять и выполнить набор инструкций.
Каран Таккар

26

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


10
«... двоичные файлы Java (байт-код) часто можно перенести на совершенно другую архитектуру без перекомпиляции.». На самом деле, они всегда могут. Перекомпиляция необходима только при перемещении кода, скомпилированного для новой JVM, на более старую.
Stephen C

@Stephen, я изменил его на "системы". Есть много факторов, которые могут препятствовать переносимости, в том числе использование JNA или JNI для компоновки с библиотеками, которые написаны только для одной архитектуры.
Мэтью Флашен,

1
Мне показалось, что JNA или JNI являются единственным фактором, а они довольно редко используются в реальном мире. Даже в этом случае байт-код всегда можно переместить без перекомпиляции - просто вам, возможно, придется также перекомпилировать библиотеки, которые JNI ожидает там. Однако байт-код по-прежнему переносим.
Кендалл Хельмштеттер Гельнер,

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

У меня один вопрос, взаимодействует ли соблюдаемый байт-код Java с ядром ОС? Если да, то один и тот же байт-код нельзя применить к разным ядрам, так как функции ядра разные, не так ли? Или JVM содержит все функции ядра для разных ядер, что очень невероятно ...
Генрияо 09

9

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

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


8

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

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

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


4

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

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

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

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


3

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


3

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

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

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

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

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


3

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


2

1:jvm(т.е. виртуальная машина Java) - это набор программ, который содержит множество файлов, которые обеспечивают различные функциональные возможности, присутствующие в папке (то есть коллекции программ в формате среднего уровня), как вызывается packages. jvmпомогает не быть перегруженным o/sтам, где он помогает выполнять только .classфайлы или java-приложения только сам по себе. Он помогает сделать его формат среднего уровня равенства после компиляции java, затем он предоставляет представление байтового кода (файл .class), которое не является специфическим для o/sи processor.
2: jvm делает байт-код в .exeфайл для понятного обработчику и представляет распределение памяти для каждой функции после получения байт-кода от FRM.
3: jvm также освобождает выделение памяти из оперативной памяти после того, как управление завершает выполнение.


2

JVM зависит от ОС. для каждой ОС JVM разные.

".class" одинаков для всех JVM. Итак, каждая JVM понимает данные файла ".class".

Зависящая от Windows JVM дает зависящую от Windows инструкцию для Windows, зависимая от Linux JVM дает зависимую от Linux инструкцию для linux.

это похоже на другие операционные системы. Итак, java работает в любой операционной системе.

вот почему Java не зависит от ОС.


2

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

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

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


1

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

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

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


1

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

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

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

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

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

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


1

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


0

байт-код не является независимым от формы, но его JVM делает байт-код независимым. Байт-код не совпадает с кодом. байт-коды - это компактные числовые коды, константы и ссылки (обычно числовые адреса), которые кодируют результат синтаксического анализа и семантического анализа таких вещей, как тип, объем и глубина вложенности программных объектов. Поэтому они обеспечивают гораздо лучшую производительность, чем прямая интерпретация исходного кода. байт-код необходимо интерпретировать перед выполнением, что всегда выполняется интерпретатором JVM.


0

Просто примечание к обсуждению JVM и JIT-компиляции. Это тот же принцип, что и в C # и CLR и в некоторой степени в Python, и когда кто-то говорит, что код работает «непосредственно на оборудовании», что на самом деле верно в тех инструкциях, которые уже скомпилированы, можно будет воспользоваться преимуществами оптимизации. на машине / процессоре, на котором он запущен. Таким образом, даже если первоначальная компиляция модуля происходит довольно медленно, при следующем запуске этого модуля выполняемый код будет работать с собственной скоростью и, так сказать, будет выполняться непосредственно на оборудовании.


0

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


0

Javac - компилятор, преобразующий исходный код в байтовый код. JVM - интерпретатор, преобразующий байтовый код в код машинного языка.

Как мы знаем, java - это язык, основанный на компиляции ** r и ** интерпретатора . После компиляции java-кода, также известного как исходный код, он преобразуется в собственный код, известный как BYTE CODE, который является переносимым и может быть легко выполнен во всех операционных системах. Сгенерированный байт-код в основном представлен в шестнадцатеричном формате . Этот формат одинаков на всех платформах, будь то рабочая станция Solaris или Macintosh, Windows или Linux. После компиляции интерпретатор считывает сгенерированный байт-код и переводит его в соответствии с хост-машиной. . Байт-код интерпретируется виртуальной машиной Java, которая доступна во всех устанавливаемых нами операционных системах. поэтому для переноса программ Java на новую платформу все, что требуется, - это портировать интерпретатор и некоторые из библиотечных процедур.

Надеюсь, поможет!!!


0

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

Теперь в случае с java после компиляции мы получаем байт-код вместо нативного кода. Когда мы запустим байтовый код, он преобразуется в собственный код с помощью JVM, а затем будет выполнен.

Таким образом, Java не зависит от платформы, а C или C ++ не зависит от платформы.


0

ну, хороший вопрос, но когда исходный код заменяется компилятором на промежуточный собственный байт-код, в котором он преобразует программу в байтовый код, выдавая ошибки сразу после всей проверки (если обнаружена), а затем программе нужен интерпретатор, который будет проверять программу построчно и напрямую преобразовывать ее в машинный код или объектный код, и каждая операционная система по умолчанию не может иметь интерпретатора java из-за некоторых соображений безопасности, поэтому вам нужно иметь jvm любой ценой, чтобы запустить его на этой другой платформе ОС Независимость, как вы сказали здесь, означает, что программу можно запускать в любой ОС, такой как unix, mac, linux, windows и т. д., но это не означает, что каждая ОС сможет запускать коды без jvm, в котором говорится о спецификации, реализации, и, например,если я продвинусь вперед, изменив конфигурацию вашего компьютера, чтобы у вас был загрузчик классов, который может открывать даже байтовый код, тогда вы также можете выполнять байтовый код Java, апплеты и т. д. -by nimish :) удачи


0

{App1 (код Java) ------> App1byteCode} ........ {(JVM + MacOS) помогает работать с App1, App2, App3}

{App2 (Java Code) -----> App2byteCode} ........ {(JVM + LinuxOS) помогает работать с App1, App2, App3}

{App3 (Java Code) -----> App3byteCode} ........ {(JVM + WindowsOS) помогает работать с App1, App2, App3}

Как это происходит?

ByteCodeОтвет : JVM имеет возможность читать и отвечать в соответствии с базовой ОС, поскольку JVM синхронизируется с ОС.

Итак, мы обнаруживаем, что нам нужна JVM с синхронизацией с платформой.

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

Эта гибкость написания программы на Java --- компиляция ByteCodeи запуск на любой машине (да, для ее выполнения необходима ЗАВИСИМАЯ от платформы JVM) делает Java платформенно независимой.


-1

когда мы компилируем файл java, создается файл .class этой программы, в котором файл .class содержит байтовый код. Этот байтовый код не зависит от платформы, байтовый код может работать в любой операционной системе с использованием виртуальной машины Java. Независимость от платформы касается не только операционной системы, но и аппаратного обеспечения. Когда вы запускаете Java-приложение на 16-битной машине, которое вы сделали на 32-битной, вам не нужно беспокоиться о преобразовании типов данных в соответствии с целевой системой. Вы можете запустить свое приложение на любой архитектуре и получить одинаковый результат в каждой.


-3

Изменить: не совсем. См. Комментарии ниже.

Java напрямую ни на чем не работает. Его необходимо преобразовать в байт-код с помощью JVM.

Поскольку JVM существуют для всех основных платформ, это делает платформу Java независимой ЧЕРЕЗ JVM.


1
JVM интерпретирует байт-код или JIT. Он не компилируется.
Мэтью Флашен,

Да. "для JVM" точнее.
Полигенные смазки

1
jopdesign.com ~ может попробовать это еще раз. эти ребята говорят, что он может работать напрямую на оборудовании.
jcolebrand
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.