Dlaczego Android używa Java? [Zamknięte]

114

OK, naprawdę należy o to poprosić kogoś z Google, ale chcę tylko innych opinii.

Nawet Android obsługuje aplikacje z kodem natywnym, głównym narzędziem programistycznym jest Java. Ale dlaczego? Chodzi mi o to, czy interpretacja kodu na urządzeniu mobilnym nie jest zbyt wolna? Wprowadzając Froyo, Google powiedział, że nowy kompilator JIT może osiągnąć 2-5 razy szybsze aplikacje. Oznacza to, że używanie języka Java zamiast kodu natywnego jest 2-krotnie wolniejsze.

Tak, wiem, że korzystanie z aplikacji kodu zarządzanego jest bezpieczniejsze pod względem stabilności systemu, ponieważ maszyna wirtualna ma lepszą kontrolę nad programem, ale nadal ten spadek wydajności jest ogromny i nie widzę sensu, dlaczego go używać.

B.Gen.Jack.O.Neill
źródło
12
Kod Java nie jest interpretowany, przynajmniej nie na Androidzie - jest kompilowany i uruchamiany na maszynie wirtualnej.
Radomir Dopieralski 24.08.10
4
Myślałem, że Sun udowodnił, że Java może być (w kilku obszarach, ale często prawie) tak szybka, jak kod natywny? Poza tym faceci z Google to sprytny pakiet - jestem pewien, że JIT, który niedawno wprowadzili, prędzej czy później wyprodukuje bardzo dobry kod.
1
@ b-gen-jack-o-neill W rzeczywistości odpowiedź brzmi nie, ponieważ maszyna wirtualna może określić, jaki kod jest wykonywany w czasie wykonywania i jak jest wykonywany. Na przykład firma Apple używa LLVM w systemie OS X w celu optymalizacji funkcji graficznych o krytycznym znaczeniu w czasie wykonywania. Odbywa się to szczególnie, ponieważ jest szybsze niż techniki kodu natywnego.
PeterAllenWebb
1
@ b-gen-jack-o-neill, kod bajtowy Java może być kompilowany do kodu natywnego w czasie wykonywania.
Mike Daniels
1
@ b-gen-jack-o-neill - maszyna wirtualna ma dostęp do większej ilości informacji o środowisku excution niż typowy kompilator, dzięki czemu może dokonywać bardziej inteligentnych wyborów. W jakim stopniu to równoważy dodatkowe koszty, będzie się różnić w zależności od aplikacji.
CurtainDog,

Odpowiedzi:

98

Kilka punktów:

  1. Java to znany język, programiści go znają i nie muszą się go uczyć

  2. trudniej jest strzelić sobie w Javie niż za pomocą kodu C / C ++, ponieważ nie ma on arytmetyki wskaźnikowej

  3. działa na maszynie wirtualnej, więc nie ma potrzeby ponownej kompilacji dla każdego dostępnego telefonu i jest łatwy do zabezpieczenia

  4. duża liczba narzędzi programistycznych dla języka Java (patrz punkt 1)

  5. Kilka telefonów komórkowych korzystało już z Javy ME, więc Java była znana w branży

  6. różnica prędkości nie jest problemem dla większości aplikacji; gdyby tak było, powinieneś kodować w języku niskiego poziomu

josefx
źródło
5
Uruchomienie na maszynie wirtualnej (bez ponownej kompilacji) to ogromny plus. Ponadto łatwo oddziela procesy od siebie, zapobiegając niszczeniu telefonu przez nieuczciwą aplikację lub zakłócaniu działania innych aplikacji
Falmarri
1
Co do nieuczciwych aplikacji - to brzmi interesująco. Popraw mnie, jeśli się mylę, ale procesory x86 mają wbudowaną ochronę za pośrednictwem trybów stronicowania i pierścienia, dlatego aplikacja nie może zmienić swojej strony w pamięci, dlatego nie może ingerować w inną aplikację poza używaniem interfejsu API systemu operacyjnego. Ale czy ta funkcja ma procesory ARM? Właściwie nie mam pojęcia. Jeśli nie, byłoby to świetne + dla Javy na tej platformie.
B.Gen.Jack.O. Neill
Procesor nie ma nic wspólnego ze złośliwą aplikacją, która robi nikczemne rzeczy
Falmarri
4
Ochrona pamięci jest częścią niektórych architektur procesorów. Uniemożliwia złośliwej aplikacji dostęp do pamięci przypisanej do innej aplikacji. en.wikipedia.org/wiki/Memory_protection
josefx
1
@Falmarri: Tak, to prawda. Zasadniczo jest to bardzo proste. Twoja aplikacja ma przypisaną własną przestrzeń adresową. Wszystkie adresy, do których chcesz uzyskać dostęp, są tłumaczone przez MMU. Chcesz uzyskać dostęp do adresu 0x0000, a MMU tłumaczy go na przykład na 0x0E21. Aby zapobiec zmianie adresu podstawowego, jego uprzywilejowanych instrukcji i programu po uruchomieniu przez system operacyjny, przypisano najniższy poziom uprawnień. Jeśli nie, pojedyncza instrukcja CLI (wyłączenie przerwań) spowodowałaby awarię systemu ...
B.Gen.Jack.O. Neill
39

Na poziomie kodu bajtowego system Android nie używa języka Java. Źródłem jest Java, ale nie używa maszyny JVM.

David Thornley
źródło
7
tak. Java jest źródłem, ale nie jest skompilowana do kodu bajtowego zgodnego z maszyną wirtualną Java. To jest powód, dla którego prawdopodobnie będą większość / całość sporu patentowego ze słońcem / wyrocznią. Używają tylko składni języka.
John Gardner
1
Nadal musi obsługiwać większość funkcji maszyny wirtualnej Java. Więc nie mogą ich zoptymalizować.
josefx
1
Skąd więc potrzeba instalowania JDK podczas programowania na Androida? Czy to tylko dla emulatora?
jiggunjer
@jiggunjer Android Studio jest w rzeczywistości rozwijany w Javie. Podobnie jak emulator.
Rudra B. Saraswat
20

Poprawa stabilności systemu jest bardzo ważna na urządzeniu takim jak telefon komórkowy.

Bezpieczeństwo jest jeszcze ważniejsze. Środowisko Android umożliwia użytkownikom uruchamianie częściowo zaufanych aplikacji, które mogą wykorzystywać telefon w naprawdę nieprzyjemny sposób bez doskonałych zabezpieczeń. Uruchamiając wszystkie aplikacje na maszynie wirtualnej, gwarantujesz, że żadna aplikacja nie będzie w stanie wykorzystać jądra systemu operacyjnego, chyba że istnieje luka w implementacji maszyny wirtualnej. Z kolei implementacja maszyny wirtualnej jest prawdopodobnie niewielka i ma małą, dobrze zdefiniowaną powierzchnię bezpieczeństwa.

Być może najważniejsze, gdy programy są kompilowane do kodu dla maszyny wirtualnej, nie trzeba ich ponownie kompilować na nowy sprzęt. Rynek chipów do telefonów jest zróżnicowany i szybko się zmienia, więc to wielka sprawa.

Ponadto korzystanie z Javy zmniejsza prawdopodobieństwo, że aplikacje, które ludzie piszą, będą same nadawały się do wykorzystania. Brak przepełnień bufora, błędów ze wskaźnikami itp.

PeterAllenWebb
źródło
Inna odpowiedź Davida mówi, że Android nie używa
jvm
13

Kod natywny niekoniecznie jest szybszy niż kod Java. Gdzie są dane Twojego profilu pokazujące, że kod natywny może działać szybciej?

Dlaczego Java?

  • Android działa na wielu różnych platformach sprzętowych. Aby zobaczyć rzeczywiste korzyści, musisz skompilować i zoptymalizować swój kod natywny dla każdej z tych różnych platform.

  • Wielu programistów już biegle posługuje się Javą.

  • Java ma ogromne wsparcie open source, z wieloma dostępnymi bibliotekami i narzędziami, które ułatwiają życie programistom.

  • Java chroni Cię przed wieloma problemami związanymi z kodem natywnym, takimi jak wycieki pamięci, nieprawidłowe użycie wskaźnika itp.

  • Java pozwala im tworzyć aplikacje piaskownicy i tworzyć lepszy model bezpieczeństwa, tak aby jedna zła aplikacja nie mogła wyłączyć całego systemu operacyjnego.

Cheryl Simon
źródło
7

Przede wszystkim według Google Android nie używa Javy. Dlatego Oracle pozywa Google. Oracle twierdzi, że Android narusza niektóre technologie Java, ale Google twierdzi, że to Dalvik.

Po drugie, od 1995 roku nie widziałem interpretera kodu bajtowego Javy.

Czy możesz poprzeć swoje przypuszczenia dotyczące wydajności za pomocą rzeczywistych testów porównawczych? Zakres twoich domniemań nie wydaje się uzasadniony, biorąc pod uwagę niedokładne informacje ogólne, które podajesz.

erickson
źródło
4

Java ma dość przekonujący argument za tym, że Google używa jej w systemie Android: ma ogromną bazę programistów. Wszyscy ci programiści są (w pewnym sensie) gotowi do rozwijania swojej platformy mobilnej.

Pamiętaj, że technicznie rzecz biorąc, Android nie używa czystej Javy.

Pablo Santa Cruz
źródło
2
Myślę, że wszystkie osoby zainteresowane programowaniem mobilnym są również zainteresowane językami „fajniejszymi” niż Java.
Earlz
4

Jak wspomniano w innym miejscu, głównym problemem jest to, że Android został zaprojektowany jako przenośny system operacyjny, który działa na szerokiej gamie sprzętu. Opiera się również na strukturze i języku znanych wielu istniejącym programistom mobilnym.

Na koniec powiedziałbym, że jest to zakład na przyszłość - wszelkie problemy z wydajnością staną się nieistotne wraz z poprawą sprzętu - podobnie, zachęcając programistów do kodowania wbrew abstrakcjom, Google może znacznie łatwiej wydobyć i zmienić podstawowy system operacyjny, niż gdyby programiści kodowali do API POSIX / Unix.

W przypadku większości aplikacji narzut związany z używaniem języka opartego na maszynach wirtualnych zamiast natywnego nie jest znaczący (wąskim gardłem dla aplikacji korzystających z usług internetowych, takich jak Twitter, jest głównie sieć). Palm WebOS również to pokazuje - i to używa JavaScript zamiast Javy jako głównego języka.

Biorąc pod uwagę, że prawie wszystkie maszyny wirtualne JIT kompilują się do kodu natywnego, prędkość surowego kodu jest często porównywalna z prędkością natywną. Wiele opóźnień przypisywanych językom wyższego poziomu ma mniej wspólnego z narzutem maszyny wirtualnej niż z innymi czynnikami (złożone środowisko wykonawcze obiektów, „bezpieczeństwo” sprawdzanie dostępu do pamięci poprzez sprawdzanie granic itp.).

Pamiętaj też, że niezależnie od języka używanego do pisania aplikacji, wiele faktycznej pracy jest wykonywana w API niższego poziomu. Język najwyższego poziomu często po prostu łączy wywołania API w łańcuchy.

Istnieje oczywiście wiele wyjątków od tej reguły - gry, aplikacje audio i graficzne, które przesuwają granice sprzętu telefonicznego. Nawet na iOS programiści często przechodzą do C / C ++, aby uzyskać prędkość w tych obszarach.

JulesLt
źródło
1

Nowy JIT uruchamia aplikacje 2 - 5 razy szybciej niż stary dalvikVM (obie JAVA). Zatem porównanie to nie C przez JAVA, ale JIT przez dalvikVM.

klawiszowiec
źródło
1

Przede wszystkim chodzi o to samo, co Windows Mobile czy iPhone, framework .net potrzebuje własnej maszyny wirtualnej, a także kakao.

I nawet jeśli wydajność nie jest najlepsza, ponieważ jest to interpretacja kodu bajtowego, Android przyciąga całą społeczność Java jako potencjalnych programistów. Więcej aplikacji, więcej klientów itp.

Na koniec żadna wydajność nie jest taka zła, dlatego java jest używana nawet na mniejszych urządzeniach (patrz JavaMe).

Colin Hebert
źródło
Cocoa nie jest oparta na maszynach wirtualnych - to wszystko jest skompilowanym kodem natywnym - ale w przeciwieństwie do czystego C / C ++ ma dynamiczne środowisko uruchomieniowe (podobne do Smalltalk / Ruby / Python) - które ma własne problemy z wydajnością i optymalizacje. Warto zauważyć, że większość gier na iPhone'a to głównie C ++, a nie Obj-C.
JulesLt