Perché Android utilizza Java? [chiuso]


114

OK, questo dovrebbe davvero essere chiesto a qualcuno di Google, ma voglio solo altre opinioni.

Anche Android supporta applicazioni in codice nativo, il principale strumento di sviluppo è Java. Ma perché? Voglio dire, non è troppo lento interpretare il codice su un dispositivo mobile? Quando ha presentato Froyo, Google ha affermato che il nuovo compilatore JIT può ottenere applicazioni 2-5 volte più veloci. Ciò significa che l'utilizzo di Java su codice nativo è 2-x volte più lento.

Sì, so che l'utilizzo di applicazioni con codice gestito è più sicuro in termini di stabilità del sistema, poiché la macchina virtuale ha un migliore controllo del programma, ma comunque questo calo delle prestazioni è enorme e non vedo alcun motivo per usarlo.


12
Il codice Java non viene interpretato, almeno non su Android: è compilato ed eseguito su una macchina virtuale.
Radomir Dopieralski

4
Pensavo che Sun avesse dimostrato che Java può essere (in alcune aree, ma abbastanza spesso quasi) veloce come il codice nativo? Inoltre, i ragazzi di Google sono un pacchetto intelligente: sono sicuro che il JIT che hanno recentemente introdotto prima o poi produrrà un codice molto buono.

1
@ b-gen-jack-o-neill La risposta è effettivamente no, perché la VM può dire quale codice viene eseguito in fase di esecuzione e come viene eseguito. Ad esempio, Apple utilizza LLVM in OS X con lo scopo esplicito di ottimizzare le funzioni grafiche critiche per le prestazioni in fase di runtime. Ciò viene fatto specificamente perché è più veloce delle tecniche di codice nativo.
PeterAllenWebb

1
@ b-gen-jack-o-neill, il bytecode Java può essere compilato in codice nativo in fase di runtime.
Mike Daniels

1
@ b-gen-jack-o-neill - la VM ha accesso a più informazioni sull'ambiente di esecuzione rispetto a un tipico compilatore, quindi può fare scelte più intelligenti. In che misura questo compensa il sovraccarico aggiuntivo varierà da app a app.
CurtainDog

Risposte:


98

Alcuni punti:

  1. Java è un linguaggio noto, gli sviluppatori lo sanno e non devono impararlo

  2. è più difficile spararsi con Java che con il codice C / C ++ poiché non ha aritmetica dei puntatori

  3. funziona in una VM, quindi non è necessario ricompilarlo per ogni telefono disponibile ed è facile da proteggere

  4. gran numero di strumenti di sviluppo per Java (vedi punto 1)

  5. diversi telefoni cellulari utilizzavano già Java ME, quindi Java era conosciuto nel settore

  6. la differenza di velocità non è un problema per la maggior parte delle applicazioni; se fosse, dovresti programmare in un linguaggio di basso livello


5
L'esecuzione su una VM (quindi nessuna ricompilazione) è un vantaggio enorme. Inoltre, separa facilmente i processi l'uno dall'altro, impedendo a un'applicazione canaglia di distruggere il tuo telefono o di interferire con altre applicazioni
Falmarri

1
Riguardo alla questione dell'applicazione canaglia, sembra interessante. Correggimi se sbaglio, ma le CPU x86 hanno biult in protezione tramite le modalità paging e ring, quindi l'applicazione non può cambiare la sua pagina in memoria quindi non può interferire con un'altra app diversa dall'utilizzo dell'API del sistema operativo. Ma questa funzione ha CPU ARM? In realtà non ne ho idea. In caso contrario, sarebbe + fantastico per Java su questa piattaforma.
B.Gen.Jack.O.Neill

La CPU non ha nulla a che fare con un'applicazione dannosa che fa cose
nefaste

4
La protezione della memoria fa parte di alcune architetture della cpu. Impedisce a un'applicazione dannosa di accedere alla memoria assegnata a un'altra applicazione. en.wikipedia.org/wiki/Memory_protection
josefx

1
@Falmarri: Sì, lo fa. Fondamentalmente è molto semplice. La tua app ha assegnato il proprio spazio indirizzo. Tutti gli indirizzi a cui vuoi accedere sono tradotti da MMU. Si desidera accedere all'indirizzo 0x0000 e MMU lo traduce ad esempio in 0x0E21. E per impedirti di cambiare l'indirizzo di base, la sua istruzione privilegiata e il tuo programma quando avviato dal sistema operativo ha assegnato il livello di privilegio più basso. In caso contrario, una singola istruzione CLI (disabilita gli interrupt)
bloccherebbe il

39

A livello di codice byte, Android non utilizza Java. La sorgente è Java, ma non utilizza una JVM.


7
sì. Java è l'origine, ma non è compilato in un codice byte compatibile con java virtual machine. Questo è il motivo per cui probabilmente la maggior parte / tutta la controversia sui brevetti con sun / oracle. Usano solo la sintassi della lingua.
John Gardner

1
Deve ancora supportare la maggior parte delle funzioni di java vm. Quindi non possono ottimizzarli.
josefx

1
Allora perché è necessario installare JDK durante lo sviluppo in Android? È solo per l'emulatore?
jiggunjer

@jiggunjer Android Studio è sviluppato in Java, infatti. E così è l'emulatore.
Rudra B. Saraswat

20

Il miglioramento della stabilità del sistema è molto importante su un dispositivo come un telefono cellulare.

La sicurezza è ancora più importante. L'ambiente Android consente agli utenti di eseguire app semi-affidabili che potrebbero sfruttare il telefono in modi davvero spiacevoli senza un'eccellente sicurezza. Eseguendo tutte le app in una macchina virtuale, garantisci che nessuna app possa sfruttare il kernel del sistema operativo a meno che non sia presente un difetto nell'implementazione della VM. L'implementazione della VM, a sua volta, è presumibilmente piccola e ha una superficie di sicurezza piccola e ben definita.

Forse la cosa più importante, quando i programmi vengono compilati in codice per una macchina virtuale, non devono essere ricompilati per il nuovo hardware. Il mercato dei chip per telefoni è vario e in rapida evoluzione, quindi è un grosso problema.

Inoltre, l'utilizzo di Java rende meno probabile che le app che le persone scrivono siano sfruttabili da sole. Nessun sovraccarico del buffer, errori con i puntatori, ecc ...


Un'altra risposta di David dice che Android non usa jvm
Ssenyonjo

13

Il codice nativo non è necessariamente più veloce del codice Java. Dove sono i dati del tuo profilo che mostrano che il codice nativo potrebbe essere eseguito più velocemente?

Perché Java?

  • Android funziona su molte piattaforme hardware differenti. Dovresti compilare e ottimizzare il tuo codice nativo per ciascuna di queste diverse piattaforme per vedere i vantaggi reali.

  • C'è un gran numero di sviluppatori già esperti in Java.

  • Java ha un enorme supporto open source, con molte librerie e strumenti disponibili per semplificare la vita degli sviluppatori.

  • Java ti protegge da molti dei problemi inerenti al codice nativo, come perdite di memoria, cattivo utilizzo del puntatore, ecc.

  • Java consente loro di creare applicazioni sandbox e creare un modello di sicurezza migliore in modo che una cattiva app non possa interrompere l'intero sistema operativo.


7

Prima di tutto, secondo Google, Android non utilizza Java. Ecco perché Oracle ha citato in giudizio Google. Oracle afferma che Android viola alcune tecnologie Java, ma Google afferma che è Dalvik.

In secondo luogo, non vedo un interprete di codice byte Java dal 1995.

Puoi sostenere le tue congetture sulle prestazioni con alcuni benchmark reali? La portata delle tue presunzioni non sembra giustificata date le informazioni di base inesatte che fornisci.


4

Java ha un argomento abbastanza convincente per Google che lo utilizza su Android: ha un'enorme base di sviluppatori. Tutti questi sviluppatori sono (più o meno) pronti a sviluppare per la loro piattaforma mobile.

Tieni presente che, tecnicamente parlando, Android non utilizza Java puro .


2
Penso che tutte le persone interessate allo sviluppo mobile siano interessate anche a linguaggi "più interessanti" di Java.
Earlz

4

Come accennato altrove, il problema principale è che Android è progettato come un sistema operativo portatile, per funzionare su un'ampia varietà di hardware. Si basa anche su un framework e un linguaggio familiare a molti sviluppatori mobili esistenti.

Infine, direi che è una scommessa contro il futuro - qualunque problema di prestazioni esista diventerà irrilevante man mano che l'hardware migliora - ugualmente inducendo gli sviluppatori a codificare contro un'astrazione, Google può estrarre e modificare il sistema operativo sottostante molto più facilmente, che se gli sviluppatori stavano codificando per le API POSIX / Unix.

Per la maggior parte delle applicazioni, il sovraccarico dell'utilizzo di un linguaggio basato su VM rispetto a quello nativo non è significativo (il collo di bottiglia per le app che utilizzano servizi Web, come Twitter, è principalmente di rete). Anche il Palm WebOS lo dimostra, e utilizza JavaScript anziché Java come linguaggio principale.

Dato che quasi tutte le VM JIT si compilano fino al codice nativo, la velocità del codice grezzo è spesso paragonabile alla velocità nativa. Molti ritardi attribuiti ai linguaggi di livello superiore hanno meno a che fare con il sovraccarico della VM rispetto ad altri fattori (un runtime di oggetti complesso, "sicurezza" che controlla l'accesso alla memoria eseguendo il controllo dei limiti, ecc.).

Ricorda inoltre che, indipendentemente dalla lingua utilizzata per scrivere un'applicazione, gran parte del lavoro effettivo viene svolto nelle API di livello inferiore. Il linguaggio di primo livello spesso è solo il concatenamento di chiamate API.

Ci sono, ovviamente, molte eccezioni a questa regola: giochi, app audio e grafiche che spingono i limiti dell'hardware del telefono. Anche su iOS, gli sviluppatori spesso scendono in C / C ++ per ottenere velocità in queste aree.


1

Il nuovo JIT esegue le applicazioni 2 - 5 volte più velocemente del vecchio dalvikVM (entrambi JAVA). Quindi il confronto non è C su JAVA, ma JIT su dalvikVM.


1

Prima di tutto si tratta più o meno della stessa cosa di Windows Mobile o iPhone, il framework .net ha bisogno della propria VM oltre al cacao.

E anche se le prestazioni non sono delle migliori, perché è un'interpretazione del codice byte, Android porta l'intera comunità java come potenziali sviluppatori. Più applicazioni, più client, ecc.

Per finire, nessuna prestazione non è poi così male, ecco perché java viene utilizzato anche su dispositivi più piccoli (vedi JavaMe).


Cocoa non è basato su VM - è tutto codice nativo compilato - ma a differenza del puro C / C ++ ha un runtime dinamico (simile a Smalltalk / Ruby / Python) - che ha i suoi problemi di prestazioni e ottimizzazioni. È interessante notare che la maggior parte dei giochi per iPhone sono in gran parte C ++ piuttosto che Obj-C.
JulesLt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.