Чому Android використовує Java? [зачинено]


114

Гаразд, це дійсно слід запитати у когось із Google, але я просто хочу інших думок.

Навіть Android підтримує кодові програми Native, головним інструментом розробки є Java. Але чому? Тобто, чи не занадто повільно інтерпретувати код на мобільному пристрої? Представляючи Froyo, Google зазначив, що новий компілятор JIT може досягти в 2-5 разів швидших програм. Це означає, що використання Java над власним кодом у 2 рази повільніше.

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


12
Код Java не інтерпретується, принаймні, не на Android - він компілюється та працює на віртуальній машині.
Радомир Доперальський,

4
Я думав, що Sun показав, що Java може бути (у кількох областях, але часто майже майже) настільки ж швидким, як рідний код? Плюс, хлопці з Google - це розумна упаковка - я впевнений, що нещодавно представлений JIT рано чи пізно створить дуже хороший код.

1
@ b-gen-jack-o-neill Відповідь насправді ні, тому що VM може сказати, який код виконується під час виконання та як він виконується. Наприклад, Apple використовує LLVM в OS X для явної мети оптимізації критичних функціональних функцій графіки під час виконання. Це робиться спеціально, тому що це швидше, ніж методи нативного коду.
PeterAllenWebb

1
@ b-gen-jack-o-neill, байт-код Java може бути скомпільований у нативний код під час виконання.
Майк Даніельс

1
@ b-gen-jack-o-neill - VM має доступ до більшої інформації про середовище виправдання, ніж типовий компілятор, тому він може робити більш розумний вибір. Наскільки це компенсує додаткові накладні витрати, залежать від програми до програми.
CurtainDog

Відповіді:


98

Деякі моменти:

  1. Java - відома мова, розробники її знають і не повинні її вивчати

  2. важче знімати себе Java, ніж код C / C ++, оскільки він не має арифметики вказівника

  3. він працює в VM, тому не потрібно перекомпілювати його на кожен телефон там, і його легко забезпечити

  4. велика кількість інструментів розробки для Java (див. пункт 1)

  5. кілька мобільних телефонів вже використовували Java ME, тому Java була відома в галузі

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


5
Запуск на VM (таким чином, не перекомпіляція) - величезний плюс. Крім того, він легко відокремлює процеси один від одного, не даючи програмі
шахраю

1
Про штучне застосування - це звучить цікаво. Виправте мене, якщо я помиляюся, але процесори x86 захищаються через режими пейджингу та дзвінка, тому програма не може змінити свою сторінку в пам'яті, тому не може втручатися в інший додаток, крім використання API OS. Але чи є ця функція ARM-процесори? Я насправді поняття не маю. Якщо ні, це буде чудово + для Java на цій платформі.
B.Gen.Jack.O.Neill

Процесор не має нічого спільного зі зловмисним додатком, який робить шкідливі речі
Falmarri

4
Захист пам’яті є частиною деяких архітектур процесора. Це не дозволяє шкідливому додатку отримати доступ до пам'яті, призначеної іншому додатку. en.wikipedia.org/wiki/Memory_protection
josefx

1
@Falmarri: Так, так і є. В основному це дуже просто. Ваш додаток призначив власне місце для адреси. Усі адреси, до яких ви хочете отримати доступ, перекладені MMU. Ви хочете отримати доступ до адреси 0x0000 і MMU переводить її, наприклад, 0x0E21. І щоб запобігти вам зміни базового адреси, його привілейована інструкція та ваша програма при запуску ОС призначила найнижчий рівень приватного доступу. Якщо ні, то одна інструкція CLI (відключення переривань) призведе до збою системи ....
B.Gen.Jack.O.Neill

39

На рівні байт-коду Android не використовує Java. Джерелом є Java, але він не використовує JVM.


7
так. Java є джерелом, але його не компілюється на сумісний байтовий код віртуальної машини Java. Ось чому вони, ймовірно, найбільше / всі суперечки щодо патентів з sun / oracle. Вони використовують лише синтаксис мови.
Джон Гарднер

1
Він все ще повинен підтримувати більшість функцій java vm. Тому вони не можуть оптимізувати їх.
josefx

1
Тоді навіщо потрібно встановлювати JDK при розробці в android? Це просто для емулятора?
jiggunjer

@jiggunjer Android Studio розроблений на Java, по суті. Так само і емулятор.
Рудра Б. Сарасват

20

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

Безпека ще важливіша. Середовище Android дозволяє користувачам запускати напівнадійні програми, які можуть експлуатувати телефон по-справжньому неприємними способами без відмінної безпеки. Запускаючи всі додатки у віртуальній машині, ви гарантуєте, що жоден додаток не може використовувати ядро ​​ОС, якщо у вашому виконанні VM не буде недоліків. Реалізація VM, в свою чергу, імовірно мала і має невелику, чітко виражену поверхню безпеки.

Мабуть, найголовніше, коли програми складаються для кодування віртуальної машини, їх не потрібно перекомпілювати для нового обладнання. Ринок телефонних мікросхем різноманітний і швидко змінюється, тому це велика справа.

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


Ще одна відповідь Девіда говорить, що андроїд не використовує jvm
Ssenyonjo

13

Рідний код не обов'язково швидше, ніж код Java. Де ваші дані профілю показують, що нативний код може працювати швидше?

Чому Java?

  • Android працює на багатьох апаратних платформах. Вам потрібно буде скласти і оптимізувати свій рідний код для кожної з цих різних платформ, щоб побачити реальні переваги.

  • Існує велика кількість розробників, які вже володіють Java.

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

  • Java захищає вас від багатьох проблем, притаманних рідному коду, як-от витоку пам'яті, поганого використання вказівника тощо.

  • Java дозволяє їм створювати пісочні програми та створювати кращу модель безпеки, щоб одна погана програма не могла зняти всю вашу ОС.


7

Перш за все, за даними Google, Android не використовує Java. Тому Oracle подає до суду на Google. Oracle стверджує, що Android порушує деякі технології Java, але Google каже, що це Dalvik.

По-друге, я не бачив інтерпретатора коду байт Java з 1995 року.

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


4

У Java є досить вагомий аргумент для Google, який використовує її в Android: у неї величезна база розробників. Усі ці розробники готові розробити для своєї мобільної платформи.

Майте на увазі, що технічно кажучи, Android не використовує чисту Java.


2
Я думаю, що всі люди, які цікавляться мобільним розвитком, також зацікавлені в «крутіших» мовах, ніж Java.
Граф

4

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

Нарешті, я б сказав, що це ставка проти майбутнього - незалежно від того, які проблеми з продуктивністю будуть нерелевантними, оскільки обладнання покращується - однаково, отримуючи розробників для кодування проти абстракції, Google може вивернути та змінити базову ОС набагато простіше, ніж якщо розробники кодували API POSIX / Unix.

Для більшості застосунків витрати на користування мовою на основі VM над рідною не мають значного значення (вузьке місце для додатків, що споживають веб-сервіси, як, наприклад, Twitter, переважно мережеві). Це також демонструє Palm WebOS - і в якості основної мови використовується JavaScript, а не Java.

Зважаючи на те, що майже всі JM JIT компілюються до нативного коду, швидкість неочищеного коду часто порівнянна з нативною швидкістю. Багато затримок, пов’язаних з мовами вищого рівня, менше пов'язані з накладними витратами на VM, ніж з іншими факторами (складний час виконання об'єкта, "безпека", перевірка доступу до пам'яті шляхом перевірки меж тощо).

Також пам’ятайте, що незалежно від мови, що використовується для написання програми, багато фактичної роботи виконується в API нижчого рівня. Мова верхнього рівня часто просто поєднує дзвінки API разом.

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


1

Новий JIT запускає програми в 2 - 5 разів швидше, ніж старий dalvikVM (обидва JAVA). Тож порівняння - це не C над JAVA, а JIT над dalvikVM.


1

Перш за все, це приблизно те саме, що буде для Windows Mobile або iPhone, .net Framework потребує власної VM, а також какао.

І навіть якщо продуктивність не найкраща, тому що це інтерпретація байт-коду, андроїд приносить всю спільноту java як потенційних розробників. Більше додатків, більше клієнтів тощо.

На завершення, продуктивність не така вже й погана, тому java використовується навіть на менших пристроях (див. JavaMe).


Какао не заснований на ВМ - це все зібраний нативний код, але на відміну від чистого C / C ++, він має динамічний час виконання (подібний до Smalltalk / Ruby / Python) - який має власні проблеми та оптимізацію роботи. Примітно, що більшість ігор для iPhone значною мірою є C ++, а не Obj-C.
JulesLt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.