Як Java не залежить від платформи, коли їй потрібна JVM?


79

Я тільки почав вивчати Java, і мене бентежить тема незалежності платформи.

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

Наприклад, нам потрібно мати компілятор Turbo C, щоб скомпілювати вихідний код C / C ++, а потім виконати його. Машина повинна мати компілятор C.

Хтось може потішити, що мається на увазі, коли Java описується як "незалежна від платформи"?


4
@aaa: Останнє, що я перевірив, його можна було безкоштовно завантажити на веб-сайті Borland.
dan04

1
Так, зазначено як Античне програмне забезпечення ... ( edn.embarcadero.com/article/20841 ).
Matthew Flaschen

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 у своїх проектах на будь-якій платформі без їх компіляції.
авангард69

54
            Technical Article on How java is platform indepedent?

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

Все, що не залежить від платформи, може працювати на будь-якій операційній системі та обладнанні.

Java не залежить від платформи, тому Java може працювати на будь-якій операційній системі та апаратному забезпеченні. Тепер питання полягає в тому, як він незалежний від платформи?

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

У випадку C або C ++ (мова, яка не залежить від платформи), компілятор генерує файл .exe, який є депедентним для ОС, тому, коли ми запускаємо цей файл .exe в іншій ОС, він не запускатиметься, оскільки цей файл не залежить від ОС, тому не сумісний з інша ОС.

Нарешті, проміжний байт-код, який не залежить від ОС, робить платформу Java незалежною.


5
Це дурна відповідь. Що робить платформу Java незалежною, це той факт, що java залежить від віртуальної машини. Його не цікавить, на якій ОС вона працює, до тих пір, поки ця ВМ задовольняє виклики операцій ОС. І сама по собі віртуальна машина не є незалежною від платформи. Порівняння, яке ви надали з мовою C / C ++, було помилковим, просто скомпілюйте вихідний код на цій самій платформі, і він буде працювати, навіщо брати цей набір інструкцій на іншу платформу і безглуздо сподіватися, що він буде працювати? Чи можете ви перенести свій вихідний код Java на ARM і очікувати, що він буде працювати на віртуальній машині, скомпільованій для мого custom_processor?
Абхінав Гауніял

Дизайн JVM однаковий. Oracle зійде з розуму, розробляючи різні JVM для кожної машини. Різниця полягає лише в байт-коді програми, яку ви хочете запустити на якійсь машині. Кожна програма генерує інший тип байт-коду. Файл байт-коду має шістнадцятковий формат, щоб JVM та CPU могли розуміти та виконувати набір команд.
Каран Таккар

26

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


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

@Stephen, я змінив його на "системи". Є багато факторів, які можуть перешкоджати переносимості, зокрема використання JNA або JNI для посилання на бібліотеки, написані лише для однієї архітектури.
Метью Флашен,

1
JNA або JNI, здається, є єдиним фактором для мене, і це досить рідкісні випадки у реальному світі. Навіть тоді байт-код все одно завжди можна перемістити без перекомпіляції - просто вам, можливо, доведеться також перекомпілювати бібліотеки, які JNI очікує там. Байт-код все ще є портативним.
Kendall Helmstetter Gelner

погодився ... але в жодному з цих випадків перекомпіляція "двійкових файлів Java (байт-код)" не зробить ні найменшої різниці !!
Stephen C

У мене є одне запитання, чи взаємодіє відповідний байт-код Java із ядром ОС? Якщо так, один і той же байт-код не можна застосовувати до різних ядер, оскільки функції ядра різні, чи не так? Або JVM містить усі функції ядра для всіх різних ядер, що дуже неймовірно ...
henryyao

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) після компіляції з використанням компілятора безпосередньо перетворюється на власний машинний код (що зрозуміло конкретній машині, на якій u складає код). А отже, скомпільований код 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, а потім забезпечити репрезентацію байтового коду (файл. не є специфічним для o/sі processor.
2: jvm робить байтовий код у .exeфайлі для процесора зрозумілим і представляє розподіл пам'яті для всіх функцій після отримання байт-коду frm.
3: jvm також звільняє виділення пам'яті з оперативної пам'яті після того, як керування завершує їх виконання.


2

JVM залежить від ОС. для кожного ОС JVM різний.

".class" однаковий для всіх JVM. отже, кожен JVM розуміє дані файлу ".class".

JVM, що залежать від Windows, дає інструкції, залежні від Windows, для Linux.

це як для інших операційних систем. отже, Java працює на будь-якій операційній системі.

ось чому Java незалежний від os.


2

Простіше кажучи:

Мова програмування Java не залежить від платформи.

JVM залежить від платформи


1

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

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

У вашому оригінальному запитанні Turbo C є аналогом програми javac, а JVM - це OS / HAL.


1

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

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

Іншими словами, у вас є як портативність вихідного коду, так і портативність скомпільованого коду.

Як, наприклад, нам потрібно мати компілятор Turbo C, щоб скомпілювати вихідний код 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 Virtual Machine, який доступний у всіх операційних системах, які ми встановлюємо. тому для перенесення програм Java на нову платформу потрібно лише перенести інтерпретатор та деякі підпрограми бібліотеки.

Сподіваюся, це допоможе !!!


0

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

Тепер у випадку з Java після компіляції ми отримуємо байт-код замість власного коду. Коли ми запустимо байтовий код, він перетворюється у власний код за допомогою JVM, а потім буде виконаний.

Отже, Java не залежить від платформи, а C або C ++ не залежить від платформи.


0

добре питання, але коли вихідний код змінено компілятором на проміжний власний байт-код, в якому він перетворює програму в байт-код, видаючи помилки після всієї перевірки одночасно (якщо знайдено), а потім програмі потрібен інтерпретатор, який перевіряв би програму рядок за рядком і безпосередньо міняв її на машинний код або об’єктний код, і кожна операційна система за замовчуванням не може мати інтерпретатор Java з певних міркувань безпеки, тому вам потрібно мати jvm за будь-яку ціну, щоб запустити її на тій іншій платформі ОС Незалежність, як ви сказали тут, означає, що програму можна запускати в будь-яких ОС, таких як unix, mac, linux, windows тощо, але це не означає, що кожен ОС зможе запускати коди без jvm, який говорить про специфікацію, реалізацію, і екземпляр,якщо я заздалегідь, змінивши конфігурацію вашого ПК, щоб у вас був завантажувач класів, який може відкрити навіть байтовий код, тоді ви також можете виконати байт-код Java, аплети тощо - за допомогою nimish :) удачі


0

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

{App2 (Java Code) -----> App2byteCode} ........ {(JVM + LinuxOS) допомога в роботі з App1, App2, App3}

{App3 (Java-код) -----> App3byteCode} ........ {(JVM + WindowsOS) допомога в роботі з App1, App2, App3}

Як це відбувається?

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

Тож ми знаходимо, нам потрібна JVM із синхронізацією з платформою.

Але головне, що програміст не повинен знати конкретних знань про Платформу і програмувати свій додаток, маючи на увазі одну конкретну платформу.

Ця гнучкість програми запису на Java --- компіляція ByteCodeта запуск на будь-якій машині (так, для її запуску потрібно мати платформу DEPENDENT 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.