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

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

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

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

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


person Serenity    schedule 01.05.2010    source источник
comment
@aaa: Насколько я знаю, он был доступен для бесплатной загрузки на сайте Borland.   -  person dan04    schedule 01.05.2010
comment
Да, указано как антикварное программное обеспечение ... (edn.embarcadero.com/article/20841) .   -  person Matthew Flaschen    schedule 01.05.2010
comment
Turbo C (или любой другой «родной» компилятор) не требуется для выполнения скомпилированной программы. компилятор генерирует .exe файл. в лучшем случае требуется библиотека времени выполнения (в .dll файле), а не весь компилятор   -  person Javier    schedule 01.05.2010


Ответы (24)


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

person Edwin Buck    schedule 01.05.2010
comment
Поскольку все JVM работают одинаково, один и тот же код работает одинаково везде без перекомпиляции. Что означает это предложение? Когда вы запускаете одну и ту же программу в разных системах с установленной JVM, мы всегда делаем это javac filename.java. (Возьмем, к примеру, любую простую программу). Если не требуется повторная компиляция программы, то почему говорят, что мы можем запускать один и тот же код в любом месте без перекомпиляции ?. Пожалуйста, объясни. - person Karan Thakkar; 17.04.2016
comment
Вам необходимо скомпилировать исходный код java, отсюда и имя javac filename.java Однако вам нужно это сделать только один раз, а не на каждой машине, где он используется (это отличается от C и C ++). Если вы измените процессоры, 32/64-битные системы, порядок байтов и т. Д., Код все равно будет работать. Это связано с тем, что выходной файл filename.class содержит байтовый код, который является инструкциями для JVM. Поскольку все JVM функционально идентичны, после компиляции кода вы можете запустить этот байт-код на любой виртуальной машине Java без исходного кода. Попробуй, работает. Кроме того, некоторые комментарии, которые вы делаете, путают компиляцию с перекомпиляцией. - person Edwin Buck; 17.04.2016
comment
@KaranThakkar - Я думаю, что расширение того, что имел в виду Эдвин, могло бы быть простой возможностью использовать одни и те же файлы .jar в ваших проектах на любой платформе без их компиляции. - person vanguard69; 26.09.2016

            Technical Article on How java is platform indepedent?

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

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

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

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

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

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

person Jatin Khurana    schedule 28.11.2012
comment
Это глупый ответ. Что делает платформу Java независимой, так это тот факт, что Java зависит от виртуальной машины. Его не волнует, на какой ОС он запущен, пока эта виртуальная машина удовлетворяет запросы к операциям ОС. Сама по себе виртуальная машина не зависит от платформы. Сравнение, которое вы предоставили с языком C / C ++, было ложным, просто скомпилируйте исходный код на этой самой платформе, и он будет работать, зачем переносить этот набор инструкций на другую платформу и глупо ожидать, что он будет работать? Можете ли вы перенести исходный код Java в ARM и ожидать, что он будет работать на виртуальной машине, скомпилированной для моего custom_processor? - person Abhinav Gauniyal; 28.01.2016
comment
Дизайн JVM такой же. Oracle сойдет с ума, создавая разные JVM для каждой машины. Единственное отличие - это байт-код программы, которую вы хотите запустить на каком-то компьютере. Каждая программа генерирует байт-код разного типа. Файл байт-кода имеет шестнадцатеричный формат, чтобы JVM и ЦП могли понять и выполнить набор инструкций. - person Karan Thakkar; 17.04.2016

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

person Matthew Flaschen    schedule 01.05.2010
comment
... Бинарные файлы Java (байт-код) часто можно перенести на совершенно другую архитектуру без перекомпиляции .. На самом деле, они всегда могут. Перекомпиляция необходима только при перемещении кода, скомпилированного для новой JVM, на более старую. - person Stephen C; 01.05.2010
comment
@Stephen, я поменял на системы. Есть много факторов, которые могут препятствовать переносимости, в том числе использование JNA или JNI для компоновки с библиотеками, которые написаны только для одной архитектуры. - person Matthew Flaschen; 01.05.2010
comment
Мне показалось, что JNA или JNI являются единственным фактором, а они довольно редко используются в реальном мире. Даже в этом случае байт-код всегда можно переместить без перекомпиляции - просто вам, возможно, придется также перекомпилировать библиотеки, которые JNI ожидает там. Однако байт-код по-прежнему переносим. - person Kendall Helmstetter Gelner; 01.05.2010
comment
согласен ... но ни в одном из этих случаев перекомпиляция двоичных файлов Java (байт-код) не будет иметь ни малейшего значения !! - person Stephen C; 01.05.2010
comment
У меня есть один вопрос, взаимодействует ли соблюдаемый байт-код Java с ядром ОС? Если да, то один и тот же байт-код нельзя применить к разным ядрам, так как функции ядра разные, не так ли? Или JVM содержит все функции ядра для разных ядер, что очень невероятно ... - person henryyao; 09.06.2013
comment
@henryyao, нет, байт-код не написан для реальной машины и не взаимодействует напрямую с ядром. В простой (не современной) реализации JVM JVM просто интерпретируется шаг за шагом. В современном он перекомпилирован в машинный код, и этот машинный код выполняется непосредственно на процессоре (и, возможно, использует прерывания ядра, не уверен). - person Matthew Flaschen; 11.06.2013

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

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

person Guffa    schedule 01.05.2010

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

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

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

person Lars Andren    schedule 01.05.2010

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

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

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

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

person Tazwar Utshas    schedule 21.02.2015

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

person deamon    schedule 01.05.2010

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

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

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

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

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

person PRATHIKSHA JAIN    schedule 21.01.2012

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

person user3647490    schedule 17.05.2014

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

person ranjan    schedule 16.11.2012

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

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

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

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

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

person time pass    schedule 21.05.2013

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

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

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

person Mohan    schedule 18.10.2018

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

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

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

person John Percival Hackworth    schedule 01.05.2010

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

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

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

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

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

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

person Pascal Thivent    schedule 01.05.2010

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

person Nitz    schedule 01.05.2010

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

person ScoRpion    schedule 29.05.2012

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

person Community    schedule 21.05.2013

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

person user1641361    schedule 06.06.2013

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

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

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

person Community    schedule 31.05.2014

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

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

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

person Monis Majeed    schedule 11.09.2014

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

person Nimish Maskara    schedule 23.02.2015

{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}

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

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

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

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

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

person RishiKesh Pathak    schedule 27.11.2014

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

person Nikita Rawool    schedule 26.04.2020

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

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

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

person Amy B    schedule 01.05.2010
comment
JVM интерпретирует байт-код или JIT. Он не компилируется. - person Matthew Flaschen; 01.05.2010
comment
да. для JVM точнее. - person polygenelubricants; 01.05.2010
comment
jopdesign.com ~ может повторить попытку. эти ребята говорят, что он может работать напрямую на оборудовании. - person jcolebrand; 01.05.2010