Почему Android использует Java? [закрыто]


114

Хорошо, это действительно нужно спросить у кого-нибудь из Google, но мне просто нужно другое мнение.

Даже Android поддерживает приложения с собственным кодом, основным инструментом разработки является Java. Но почему? Я имею в виду, не слишком ли медленно интерпретировать код на мобильном устройстве? Представляя Froyo, Google сказал, что новый JIT-компилятор может работать с приложениями в 2-5 раз быстрее. Это означает, что использование Java поверх нативного кода в 2 раза медленнее.

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


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

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

1
@ b-gen-jack-o-neill На самом деле ответ отрицательный, потому что виртуальная машина может определить, какой код выполняется во время выполнения и как он выполняется. Например, Apple использует LLVM в OS X с явной целью оптимизации критических для производительности графических функций во время выполнения. Это сделано специально, потому что это быстрее, чем методы с собственным кодом.
— PeterAllenWebb

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

1
@ b-gen-jack-o-neill - виртуальная машина имеет доступ к большему количеству информации о среде выполнения, чем обычный компилятор, поэтому она может делать более разумный выбор. В какой степени это компенсирует дополнительные накладные расходы, будет варьироваться от приложения к приложению.
— CurtainDog

Ответы:


98

Некоторые моменты:

  1. Java - известный язык, разработчики знают его, и ему не нужно его изучать

  2. с Java труднее застрелиться, чем с кодом C / C ++, поскольку в нем нет арифметики указателей

  3. он работает в виртуальной машине, поэтому не нужно перекомпилировать его для каждого телефона, и его легко защитить

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

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

  6. разница в скорости не является проблемой для большинства приложений; если бы это было, вы должны кодировать на языке низкого уровня


5
Запуск на виртуальной машине (без перекомпиляции) - огромный плюс. Кроме того, он легко отделяет процессы друг от друга, не позволяя мошенническим приложениям разрушить ваш телефон или помешать другим приложениям
— Falmarri,

1
Насчет мошенничества с приложениями - звучит интересно. Поправьте меня, если я ошибаюсь, но процессоры x86 имеют двойную защиту с помощью режимов подкачки и звонка, поэтому приложение не может изменить свою страницу в памяти, поэтому не может мешать другому приложению, кроме использования API ОС. Но есть ли у этой функции процессоры ARM? На самом деле я понятия не имею. Если нет, это было бы здорово + для Java на этой платформе.
— B.Gen.Jack.O.Neill

ЦП не имеет ничего общего с вредоносным приложением, которое делает гнусные вещи
— Фалмарри,

4
Защита памяти является частью некоторых архитектур ЦП. Он предотвращает доступ вредоносного приложения к памяти, назначенной другому приложению. en.wikipedia.org/wiki/Memory_protection
— josefx,

1
@Falmarri: Да, это так. В основном это очень просто. Ваше приложение назначило собственное адресное пространство. Все адреса, к которым вы хотите получить доступ, переводятся MMU. Вы хотите получить доступ к адресу 0x0000, и MMU переводит его, например, в 0x0E21. И чтобы предотвратить изменение базового адреса, его привилегированных инструкций и вашей программе при запуске из ОС назначен самый низкий уровень привилегий. В противном случае, одна инструкция CLI (отключить прерывания) приведет к сбою системы ....
— Б.Г. Джек.О. Нил

39

На уровне байт-кода Android не использует Java. Источник - Java, но не использует JVM.


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

1
Он по-прежнему должен поддерживать большинство функций java vm. Так что они не могут их оптимизировать.
— josefx

1
Тогда зачем устанавливать JDK при разработке на android? Это только для эмулятора?
— jiggunjer

Фактически, @jiggunjer Android Studio разработана на Java. И эмулятор тоже.
— Рудра Б. Сарасват,

20

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

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

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

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


В другом ответе Дэвида говорится, что Android не использует 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.
— Earlz

4

Как уже упоминалось в другом месте, основная проблема заключается в том, что Android разработан как портативная ОС, предназначенная для работы на широком спектре оборудования. Он также основан на структуре и языке, знакомом многим существующим мобильным разработчикам.

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

Для большинства приложений накладные расходы, связанные с использованием языка на основе виртуальной машины по сравнению с родным языком, не значительны (узким местом для приложений, использующих веб-службы, таких как Twitter, в основном, является сеть). Palm WebOS также демонстрирует это - и здесь в качестве основного языка используется JavaScript, а не Java.

Учитывая, что почти все виртуальные машины JIT компилируются до собственного кода, скорость исходного кода часто сравнима с собственной скоростью. Многие задержки, связанные с языками более высокого уровня, связаны не столько с накладными расходами виртуальной машины, сколько с другими факторами (сложная среда выполнения объекта, «безопасная» проверка доступа к памяти путем проверки границ и т. Д.).

Также помните, что независимо от языка, на котором написано приложение, большая часть фактической работы выполняется в API нижнего уровня. Язык верхнего уровня часто просто связывает вместе вызовы API.

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


1

Новый JIT запускает приложения в 2-5 раз быстрее, чем старый dalvikVM (оба JAVA). Таким образом, сравнение - это не C с JAVA, а JIT с dalvikVM.


1

Во-первых, это то же самое, что и Windows Mobile или iPhone, инфраструктуре .net нужна собственная виртуальная машина, а также какао.

И даже если производительность не на высоте, потому что это интерпретация байтового кода, android привлекает все сообщество Java в качестве потенциальных разработчиков. Больше приложений, больше клиентов и т. Д.

В заключение отметим, что производительность не так уж плоха, поэтому java используется даже на небольших устройствах (см. JavaMe).


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