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

114

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

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

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

B.Gen.Jack.O.Neill
источник
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. разница в скорости не является проблемой для большинства приложений; если бы это было, вы должны кодировать на языке низкого уровня

josefx
источник
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 снижает вероятность того, что приложения, которые пишут люди, сами будут эксплуатироваться. Никаких переполнений буфера, ошибок с указателями и т. Д.

PeterAllenWebb
источник
В другом ответе Дэвида говорится, что 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 ++, чтобы ускорить работу в этих областях.

JulesLt
источник
1

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

keyboardsurfer
источник
1

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

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

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

Колин Хеберт
источник
Какао не основан на виртуальной машине - это весь скомпилированный собственный код, но в отличие от чистого C / C ++ он имеет динамическую среду выполнения (похожую на Smalltalk / Ruby / Python), которая имеет собственные проблемы с производительностью и оптимизацию. Примечательно, что большинство игр для iPhone в основном написаны на C ++, а не на Obj-C.
JulesLt