Чи є Java (все ще) мовою крос-платформи? [зачинено]


20

Коли я почав використовувати Java в дев'яностих, з першого дня все було " Пишіть один раз, бігайте кудись! " Це, мабуть, все було правдою тоді, і я був частиною хору.

Я вже не впевнений, що про це вже думати, враховуючи всі інші мови, що використовують багатоплатформні режими виконання (python, flash, perl, html, php ...). Але я все ще бачу безліч аргументів, які говорять, що ви повинні використовувати Java, оскільки це нібито краще для розробки крос-платформ.

Отже, чи справді це і сьогодні? Чи залишається Java мовою вибору для розробки декількох платформ?

  • Будь ласка, будьте конкретні, зосередившись на аспектах крос-платформи.
  • Я не прошу порівняння загальних мовних особливостей.

Оновлення: Чудові відгуки поки що! Здається, більшість відповідей надають перевагу Java або Інтернету. Будь-який внесок з натовпу сценаріїв?



3
Цей коментар не стосується суті питання, але це фактор, який слід врахувати: Веб-додатки на базі Java, орієнтовані на користувачів Windows, - це те, про що не варто піти. Останнім часом у Oracle JVM для Windows виникло багато проблем із безпекою. Таким чином, ви можете виявити, що кмітливі користувачі не використовуватимуть веб-додатки на базі Java, оскільки вони видалили JVM.
ткнути

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

Відповіді:


10

Мови стилів сценаріїв, такі як python, також спрощують розробку крос-платформ. Тепер, чи подобається вам Python (чи інші подібні мови), залежить від вас, і нам, мабуть, не потрібно починати цю дискусію тут.

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

Чи перевага Java там? Я думаю, що в будь-якому випадку ви можете написати портативний код з подібною легкістю. Тобто, ви можете написати код, і він зазвичай буде працювати на різних платформах. Але ви не можете уникнути просто написання коду і припускаючи, що він буде працювати всюди. Я працював над проектом python, який виробляв версії для Windows, Linux та Mac, і ми зіткнулися з дуже малою проблемою між платформою. (Єдине, що я пам’ятаю, було пов’язано з помилкою в бібліотеці, в якій ми використовували pygame, що спричинило проблеми з малюванням в Linux.

Ще одне питання - розгортання. Якщо ви хочете поширювати окремі програми, які виконують ваш код, вам доведеться виробляти різні версії для різних платформ. Для Java ви можете поширити одну версію і припустити, що у користувача встановлена ​​Java або може її встановити. У цьому випадку Java, ймовірно, перемагає у простоті відділу розгортання.

Зрештою, я думаю, що це зводиться до того, якою мовою ви любите працювати та який тип розгортання потрібно виконувати.


18

У той час як Java не може бути або єдиним життєздатним крос-платформний інструмент, має деякі переваги:

  • Це надзвичайно швидко.
  • Це надзвичайно надійно.
  • Він надзвичайно портативний (наприклад, байт-код, зібраний 10 років тому в Windows 95, працює в OS X сьогодні).

і деякі слабкі сторони:

  • Основні бібліотеки графічного інтерфейсу (Swing ...) демонструють свій вік (тут допомагають сторонні доповнення).
  • Мова сама по собі може бути менш багатослівною (наприклад, перевірені винятки ...).
  • Час запуску може бути швидшим (хоча він весь час покращується).

Якщо конкретно говорити про платформу Java , є ще один момент:


19
Надзвичайно швидко? У порівнянні з чим?
HardCode

18
@HardCode: У порівнянні з будь-якою інтерпретованою мовою чи більшості складених мов. C і C ++ можна зробити швидше в деяких випадках, але це важко і продовжує ускладнюватися, коли кількість ядер зростає. З одночасністю Java (використання цих декількох ядер ефективно) на практиці легше досягти.
Joonas Pulakaka

5
@HardCode, мабуть, JVM - це найшвидший час виконання майже для будь-якої мови, що інтерпретується (на відміну від тих, які зробили самі хакери)

14

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

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

Хоча для мене мережа не є суворою мовою, веб є платформою, на якій є вибір. Передній кінець HTML / JavaScript означає, що ваша програма працюватиме на майже будь-якій клієнтській платформі, і в більшості випадків це була реальна мета - не турбуватися, чи це Mac, чи ПК, яка версія ОС тощо.

Звичайно, як правило, ви все ще будете диктувати серверну платформу, але коли люди просто стають набагато гнучкішими, особливо в наші дні, коли більшість компаній вже підтримують поєднання серверів Windows та Linux.


8
Гарна відповідь. Звичайно, переконайтесь, що ваш додаток працює правильно у всіх різних версіях браузера, може бути головним болем.
Тім Гудман

5
@Tim: хороший момент. Я вважаю, що програми браузерів набагато більше "тестування та налагодження скрізь", ніж додатки для настільних програм Java.
Joonas Pulakaka

5
@Tim: +1. Зробити додаток webapp для роботи однаково у всіх основних браузерах так само важко, як і те, щоб програма Java працювала однаково у кількох ОС.
Євгеній Брікман

3
"писати один раз, налагоджувати всюди" - не вірно в моєму досвіді. доки ви розсудливі та уникаєте залежностей від платформи, у мене не було проблем із запуском одного і того ж коду Java на кількох платформах (включаючи GUI). Так, звичайно, ви повинні перевірити це, але я думаю, що за майже 15 років кодування Java у мене лише один раз виникала справжня проблема переносимості (яка була моєю власною помилкою в жорсткому кодуванні роздільників каталогів Windows, а не в тому, що я використовував службову трансляцію файлів Java File.pathSeparator !)
мікера

2
@mikera - Ми бачили проблеми між Linux та Windows, які не мали нічого спільного з нашим кодом. Вони рідкісні, але вони існують.
Джон Хопкінс

9

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

  • Поки ви обережні зі своїми залежностями (наприклад, уникайте бібліотек, які використовують JNI для взаємодії з нативним кодом), тоді Java може бути записана без змін на всіх основних платформах JVM

  • Beacuse Java зазвичай поширюється у вигляді байт-коду, незалежного від машини, ви можете запускати без перекомпіляції на будь-якому JVM (оскільки локальний JVM сам обробляє JIT-компіляцію до рідного коду). Наприклад, мені вдалося отримати розумну складну програму GUI, яка вперше запускається на Mac після розробки в Windows - з тим же файлом jar . На відміну від більшості інших мов міжплатформних програм, для яких зазвичай потрібні різні бібліотеки або перекомпіляція для іншої платформи.

  • Багато основних бібліотек, які вам потрібні (графічний інтерфейс, мережа, IO тощо), є частиною стандартного режиму виконання та написані крос-платформним способом. Тож вам не потрібно ходити на полювання та тестувати бібліотеки між платформами, ви впевнені, що майже все, що вам потрібно, вже є у середовищі виконання.


3

Я думаю, у вас є такий вибір:

1) використовувати або a

  • складений або
  • інтерпретована мова.

2) Як ви будете пакувати та доставляти свій код?

  • Один "передній", один бінарний / скрипт?
  • Один "передній", кілька бінарних файлів / скриптів?
  • Кілька "передніх", кілька бінарних файлів / скриптів?

Ці варіанти впливають на продуктивність, видимість та поширення коду.

Ви не проти віддати свій вихідний код? Мови компіляції можуть бути для вас. Мови, що складаються, здаються ефективнішими в мікро-орієнтирах, ніж інтерпретовані (навіть JITed) мови. Крім того, якщо ви залежите від середовища виконання, наприклад Java, Python, Ruby тощо, ваш код може бути складніше розподілити.

Я виявив, що найпопулярніші настільні платформи для настільних ПК призначені для "Один передній, кілька бінарних файлів", використовуючи C / C ++ та бібліотеку віджетів крос-платформ, наприкладAudacity, Blender, Firefox, Google Earth, OpenOffice, Skype, Songbird, Stellarium, VLC.


Ви зробили цікаву помилку, перераховуючи Skype у своїх прикладах, але це надзвичайно популярне додаток насправді було запущено з Delphi / Pascal для Windows і перенесено з C / C ++ на Linux та Objective-C на MacOS / iPhone
Maksee

Я думаю, що складена / інтерпретована дихотомія є дещо оманливою - Java в певному сенсі ні тому, що вона компілюється в незалежний від машини байт-код для розповсюдження (тобто більше не у вихідній формі), а потім JIT згодом збирається у рідний код на на якій би машині ви не працювали. Це повністю крос-платформа, але також отримує домашню продуктивність, плюс вам не потрібно розповсюджувати джерело, якщо цього не хочете. win / win / win.
mikera

0

Я скажу ні. python та ruby ​​використовуються дуже багато, а також javascript як для клієнта, так і для сервера. Я особисто використовую .NET і не маю жодних проблем змусити його працювати на Mac і Linux (під час розробки на Windows)

- Я чую, що LLVM стає популярною, але все ще надзвичайно мало. Це дозволить вам використовувати крос-платформу C ++ в одному двійковому. Мабуть, це буде виконано в браузері, але я не побачив приклад, де він дозволяє змінювати dom або виклик javascript.


LLVM - це не запуск браузера ... Ви говорите про emscripten?
Каміло Мартін

перевірити дату. 4 роки тому emscripten не існувало. NativeClient, мабуть, працював (і мав дум), але цього не сталося.

Тепер я бачу дату, але все ж LLVM ніколи не стосувався браузерів, правда?
Каміло Мартін

1
Ні. Хоча я б хотів, щоб я міг написати C ++ або якусь іншу мову, підтримує LLVM замість JS ...


-1

Якщо ви вводите мобільні платформи в суміш, вам також потрібно принаймні включити перекомпіляцію. Наприклад, android, j2me.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.