Warum verwendet Android Java? [geschlossen]

114

OK, das sollte wirklich jemand von Google gefragt werden, aber ich möchte nur andere Meinungen.

Selbst Android unterstützt native Codeanwendungen. Das Hauptentwicklungstool ist Java. Aber wieso? Ich meine, ist es nicht zu langsam, Code auf einem mobilen Gerät zu interpretieren? Bei der Einführung von Froyo sagte Google, dass der neue JIT-Compiler 2-5-mal schnellere Anwendungen erzielen kann. Dies bedeutet, dass die Verwendung von Java über nativen Code 2-mal langsamer ist.

Ja, ich weiß, dass die Verwendung von verwalteten Codeanwendungen im Hinblick auf die Systemstabilität sicherer ist, da die virtuelle Maschine eine bessere Kontrolle über das Programm hat. Dennoch ist dieser Leistungsabfall enorm und ich sehe keinen Grund, warum ich sie verwenden soll.

B.Gen.Jack.O.Neill
quelle
12
Java-Code wird nicht interpretiert, zumindest nicht unter Android - er wird kompiliert und auf einer virtuellen Maschine ausgeführt.
Radomir Dopieralski
4
Ich dachte, Sun hat bewiesen, dass Java (in einigen Bereichen, aber oft fast) so schnell wie nativer Code sein kann. Außerdem sind die Google-Leute ein Smart Pack - ich bin zuversichtlich, dass die kürzlich eingeführte JIT früher oder später sehr guten Code produzieren wird.
1
@ b-gen-jack-o-neill Die Antwort lautet eigentlich nein, da die VM erkennen kann, welcher Code zur Laufzeit ausgeführt wird und wie er ausgeführt wird. Beispielsweise verwendet Apple LLVM in OS X explizit, um leistungskritische Grafikfunktionen zur Laufzeit zu optimieren. Dies geschieht speziell, weil es schneller als native Code-Techniken ist.
PeterAllenWebb
1
@ b-gen-jack-o-neill, Java-Bytecode kann zur Laufzeit zu nativem Code kompiliert werden.
Mike Daniels
1
@ b-gen-jack-o-neill - Die VM hat Zugriff auf mehr Informationen über die Excution-Umgebung als ein typischer Compiler, sodass sie intelligentere Entscheidungen treffen kann. Inwieweit dies den zusätzlichen Overhead kompensiert, variiert von App zu App.
CurtainDog

Antworten:

98

Ein paar Punkte:

  1. Java ist eine bekannte Sprache, Entwickler kennen sie und müssen sie nicht lernen

  2. Es ist schwieriger, sich mit Java zu fotografieren als mit C / C ++ - Code, da es keine Zeigerarithmetik gibt

  3. Es wird in einer VM ausgeführt, sodass es nicht für jedes Telefon neu kompiliert werden muss und einfach zu sichern ist

  4. große Anzahl von Entwicklungstools für Java (siehe Punkt 1)

  5. Einige Mobiltelefone verwendeten bereits Java ME, sodass Java in der Branche bekannt war

  6. Der Geschwindigkeitsunterschied ist für die meisten Anwendungen kein Problem. Wenn ja, sollten Sie in einer einfachen Sprache codieren

josefx
quelle
5
Das Ausführen auf einer VM (daher keine Neukompilierung) ist ein großes Plus. Außerdem werden Prozesse leicht voneinander getrennt, wodurch verhindert wird, dass eine betrügerische Anwendung Ihr Telefon zerstört oder andere Anwendungen
stört
1
Über die Schurkenanwendungssache - das klingt interessant. Korrigieren Sie mich, wenn ich falsch liege, aber x86-CPUs über Paging- und Ring-Modi nur schwer geschützt sind. Daher kann die Anwendung ihre Seite im Speicher nicht ändern und kann daher keine andere App als die Verwendung der OS-API stören. Aber hat diese Funktion ARM-CPUs? Ich habe eigentlich keine Ahnung. Wenn nicht, wäre dies großartig + für Java auf dieser Plattform.
B.Gen.Jack.O.Neill
Die CPU hat nichts mit einer bösartigen Anwendung zu tun, die schändliche Dinge tut
Falmarri
4
Der Speicherschutz ist Teil einiger CPU-Architekturen. Es verhindert, dass eine böswillige Anwendung auf den Speicher zugreift, der einer anderen Anwendung zugewiesen ist. en.wikipedia.org/wiki/Memory_protection
Josefx
1
@ Falmarri: Ja, das tut es. Grundsätzlich ist es sehr einfach. Ihre App hat einen eigenen Adressraum zugewiesen. Alle Adressen, auf die Sie zugreifen möchten, werden von der MMU übersetzt. Sie möchten auf die Adresse 0x0000 zugreifen und die MMU übersetzt sie beispielsweise in 0x0E21. Und um zu verhindern, dass Sie die Basisadresse ändern, hat die privilegierte Anweisung und Ihr Programm beim Start durch das Betriebssystem die niedrigste Berechtigungsstufe zugewiesen. Wenn nicht, würde eine einzelne CLI-Anweisung (Interrupts deaktivieren) das System zum Absturz bringen ....
B.Gen.Jack.O.Neill
39

Auf der Bytecode-Ebene verwendet Android kein Java. Die Quelle ist Java, es wird jedoch keine JVM verwendet.

David Thornley
quelle
7
Ja. Java ist die Quelle, aber nicht mit Java Virtual Machine kompatiblem Bytecode kompiliert. Dies ist der Grund, warum sie wahrscheinlich den größten Teil des Patentstreits mit Sonne / Orakel führen werden. Sie verwenden nur die Syntax der Sprache.
John Gardner
1
Es muss noch die meisten Funktionen des Java VM unterstützen. Sie können diese also nicht optimieren.
Josefx
1
Warum muss das JDK dann bei der Entwicklung in Android installiert werden? Ist es nur für den Emulator?
Jiggunjer
@jiggunjer Android Studio wurde tatsächlich in Java entwickelt. Und der Emulator auch.
Rudra B. Saraswat
20

Die Verbesserung der Systemstabilität ist bei einem Gerät wie einem Mobiltelefon sehr wichtig .

Sicherheit ist noch wichtiger. In der Android-Umgebung können Benutzer semi-vertrauenswürdige Apps ausführen, die das Telefon ohne hervorragende Sicherheit auf wirklich unangenehme Weise ausnutzen können. Indem Sie alle Apps in einer virtuellen Maschine ausführen, stellen Sie sicher, dass keine App den Betriebssystemkernel ausnutzen kann, es sei denn, die VM-Implementierung weist einen Fehler auf. Die VM-Implementierung wiederum ist vermutlich klein und verfügt über eine kleine, genau definierte Sicherheitsoberfläche.

Am wichtigsten ist vielleicht, dass Programme, die zum Code für eine virtuelle Maschine kompiliert werden, nicht für neue Hardware neu kompiliert werden müssen. Der Markt für Telefonchips ist vielfältig und verändert sich schnell. Das ist eine große Sache.

Durch die Verwendung von Java ist es außerdem weniger wahrscheinlich, dass die von den Benutzern geschriebenen Apps selbst ausgenutzt werden können. Keine Pufferüberläufe, Fehler mit Zeigern usw.

PeterAllenWebb
quelle
Eine andere Antwort von David sagt, dass Android jvm nicht verwendet
Ssenyonjo
13

Native Code ist nicht unbedingt schneller als Java-Code. Wo zeigen Ihre Profildaten, dass nativer Code schneller ausgeführt werden kann?

Warum Java?

  • Android läuft auf vielen verschiedenen Hardwareplattformen. Sie müssten Ihren nativen Code für jede dieser verschiedenen Plattformen kompilieren und optimieren, um echte Vorteile zu erzielen.

  • Es gibt eine große Anzahl von Entwicklern, die Java bereits beherrschen.

  • Java bietet eine enorme Open Source-Unterstützung mit vielen Bibliotheken und Tools, die Entwicklern das Leben erleichtern.

  • Java schützt Sie vor vielen Problemen, die mit nativem Code verbunden sind, wie Speicherlecks, schlechte Zeigernutzung usw.

  • Mit Java können sie Sandbox-Anwendungen erstellen und ein besseres Sicherheitsmodell erstellen, sodass eine schlechte App nicht Ihr gesamtes Betriebssystem herunterfahren kann.

Cheryl Simon
quelle
7

Erstens verwendet Android laut Google kein Java. Deshalb verklagt Oracle Google. Oracle behauptet, dass Android gegen eine Java-Technologie verstößt, aber Google sagt, es sei Dalvik.

Zweitens habe ich seit 1995 keinen Java-Bytecode-Interpreter mehr gesehen.

Können Sie Ihre Leistungsvermutung mit einigen tatsächlichen Benchmarks untermauern? Der Umfang Ihrer Vermutungen erscheint angesichts der von Ihnen angegebenen ungenauen Hintergrundinformationen nicht gerechtfertigt.

erickson
quelle
4

Java hat ein ziemlich überzeugendes Argument für Google, das es in Android verwendet: Es hat eine riesige Basis von Entwicklern. Alle diese Entwickler sind (irgendwie) bereit, für ihre mobile Plattform zu entwickeln.

Beachten Sie, dass Android technisch gesehen kein reines Java verwendet.

Pablo Santa Cruz
quelle
2
Ich denke, dass alle Leute, die sich für die mobile Entwicklung interessieren, auch an "cooleren" Sprachen als Java interessiert sind.
Earlz
4

Wie bereits an anderer Stelle erwähnt, besteht das Hauptproblem darin, dass Android als tragbares Betriebssystem für die Ausführung auf einer Vielzahl von Hardware konzipiert ist. Es baut auch auf einem Framework und einer Sprache auf, die vielen bestehenden mobilen Entwicklern vertraut sind.

Schließlich würde ich sagen, dass dies eine Wette gegen die Zukunft ist - unabhängig davon, welche Leistungsprobleme bestehen, wird mit der Verbesserung der Hardware irrelevant -, und indem Entwickler Entwickler dazu bringen, gegen eine Abstraktion zu programmieren, kann Google das zugrunde liegende Betriebssystem weitaus einfacher herausreißen und ändern, als wenn Entwickler codierten auf die POSIX / Unix-APIs.

Für die meisten Anwendungen ist der Aufwand für die Verwendung einer VM-basierten Sprache über native nicht wesentlich (der Engpass für Apps, die Webdienste wie Twitter nutzen, besteht hauptsächlich im Netzwerk). Das Palm WebOS demonstriert dies ebenfalls - und das verwendet JavaScript anstelle von Java als Hauptsprache.

Da fast alle VMs JIT bis auf nativen Code kompiliert werden, ist die Geschwindigkeit des Rohcodes häufig mit der Geschwindigkeit des nativen Codes vergleichbar. Viele Verzögerungen, die höheren Sprachen zugeschrieben werden, haben weniger mit dem VM-Overhead zu tun als mit anderen Faktoren (komplexe Objektlaufzeit, Sicherheitsüberprüfung des Speicherzugriffs durch Überprüfung der Grenzen usw.).

Denken Sie auch daran, dass unabhängig von der Sprache, in der eine Anwendung geschrieben wird, ein Großteil der eigentlichen Arbeit in APIs niedrigerer Ebene ausgeführt wird. Die Sprache der obersten Ebene verkettet häufig nur API-Aufrufe.

Es gibt natürlich viele Ausnahmen von dieser Regel - Spiele, Audio- und Grafik-Apps, die die Grenzen der Telefonhardware überschreiten. Selbst unter iOS greifen Entwickler häufig auf C / C ++ zurück, um in diesen Bereichen Geschwindigkeit zu erzielen.

JulesLt
quelle
1

Die neue JIT führt die Anwendungen zwei- bis fünfmal schneller aus als die alte dalvikVM (beide JAVA). Der Vergleich ist also nicht C über JAVA, sondern JIT über dalvikVM.

Keyboard-Surfer
quelle
1

Zuallererst ist es ungefähr dasselbe wie bei Windows Mobile oder dem iPhone. Das .net-Framework benötigt eine eigene VM sowie Kakao.

Und selbst wenn die Leistung nicht optimal ist, weil es sich um eine Interpretation des Bytecodes handelt, bringt Android die gesamte Java-Community als potenzielle Entwickler mit. Mehr Anwendungen, mehr Kunden usw.

Zum Schluss ist keine Leistung so schlecht, deshalb wird Java auch auf kleineren Geräten verwendet (siehe JavaMe).

Colin Hebert
quelle
Cocoa ist nicht VM-basiert - es ist alles kompilierter nativer Code - aber im Gegensatz zu reinem C / C ++ hat es eine dynamische Laufzeit (ähnlich wie Smalltalk / Ruby / Python) - die ihre eigenen Leistungsprobleme und Optimierungen hat. Es ist bemerkenswert, dass die meisten iPhone-Spiele größtenteils C ++ und nicht Obj-C sind.
JulesLt