La notizie e le informazioni in internet vanno sempre verificate. Molte cose infatti si tramandano di bocca in bocca (o di tastiera in tastiera) fino a confondersi. Le senti ripetere talmente tante volte che alla fine te ne convinci e le accetti acriticamente.
Arriva poi il giorno che ti informi e scopri che le cose non sono proprio così o che, in fondo, sono molto più complesse. Fra questo ricade anche l’asserzione Android è scritto in Java.
Android non è scritto in Java?
Si e no. Intendiamoci, il titolo dell’articolo è volutamente provocatorio e non dobbiamo pensare che Java non c’entri nulla con Android, piuttosto dobbiamo capire dove si ferma Java e dove comincia il resto.
Per prima cosa Android è scritto in C. Il kernel è Linux e tutti i ricami sovrastanti sono scritti ovviamente in C. Sembra banale ma ho sentito dire che il kernel di Android è scritto in Java… quindi meglio essere puntuali.
Seconda cosa. La gran parte dello strato applicativo poggia su Dalvik.
Ovvero la nota Java Virtual Machine. Giusto?
Si e no. Anche qui dobbiamo essere precisi. Quando uno dice “le applicazioni di Android sono in Java” apre un mondo di se e di ma.
Quando pensiamo a un applicazione in Java pensiamo alle applicazioni Java che girano sul mattone delle Java VM standard. Quando facciamo questa affermazione diamo l’idea che anche le applicazioni di Android siano dello stesso tipo e girino su una VM equivalente. Ma questo è completamente falso!
Dalvik non esegue codice Java?
NO! Questo ci tengo a specificarlo perché è la chiave di tutto il discorso. Dalvik non esegue e compila il codice Java! Dalvik compila il Java bytecode ed esegue il Dalvik Bytecode! La differenza è abissale, enorme, è come la differenza fra il codice Morse e il Dolce Stil Novo. Basti pensare che il Java Bytecode (quello dei file .class) esegue istruzioni codificate in 8-bit invece dei 16-bit delle istruzioni di Dalvik (nei file eseguibili .dex).
In ogni caso se Dalvik compila il Java ByteCode non è la stessa cosa?
Assolutamente No. Sarebbe come dire che io so il giapponese perché so tradurre in italiano le scritte giapponesi che qualcuno mi traduce in inglese.
Inoltre questa caratteristica permette (in teoria) di utilizzare linguaggi alternativi a Java in modo piuttosto semplice. Ad esempio possiamo scrivere applicazioni per Dalvik anche in Python a patto di compilare il codice Python in Java ByteCode (ad esempio usando Jython ). Il codice compilato in questo modo può quindi passare per Dalvik che lo convertirà in file .dex.
Usare Python (o altri linguaggi) per programmare in Android è tuttavia attualmente impossibile. Tutte le librerie di sistema Android (le API che scarichiamo quando configuriamo l’ambiente) sono scritte in Java, tuttavia se qualcuno avesse pazienza e voglia di convertire tali librerie in Python (compatibile con Jython) si potrebbe usare questo linguaggio in modo quasi trasparente.
Quindi Dalvik non è una Java VM?
Dalvik è una VM che interpreta il Java ByteCode. La differenza è molto sottile concettualmente ma importante per non fare confusione.
Inoltre ci sono numerosissime altre differenze con la Java VM di cui molte incentrate all’ottimizzazione del sistema su dispositivi mobili e con risorse limitate che potete scoprire cercando Dalvik su uno qualsiasi dei motori di ricerca.
A me, sviluppatore, cosa cambia?
Nulla. Tu sviluppatore scriverai applicazioni per Android in Java. Di chi compila ed esegue il tuo codice non ti interessa. Quindi per te le applicazioni Android sono in Java.
Ora però sai che la situazione è più complessa di così e la consapevolezza di come funzionano le cose in realtà le cose è l’arma più potente di ogni sviluppatore.
Pingback: Frattanto nella blogosfera #16 « Ok, panico
Fico. Grazie del chiarimento. 😀
ci tengo a dire che si può programmare in python per android grazie ad ASE: http://code.google.com/p/android-scripting/ che tra l’altro supporta un’altra decina circa di linguaggi (se non ricordo male)
Grazie dell’informazione 😀 Il principio è esattamente quello che spiegavo. 😀 Qualunque script che compila in bytecode può essere usato nativamente per programmare in Android. 🙂
È esattamente quello che intendevo. Qualunque cosa compila in bytecode può essere usata per programmare in Android.
Mi fa piacere che ci siano questi progetti a conferma della mia tesi. 😀
esattamente 🙂