Se il codice Java può girare su qualsiasi piattaforma, perché gli sviluppatori iOS usano Objective C e non Java per girare sull’iPhone?

La risposta è complicata. Non c'è una ragione tecnica per cui non si possa fare il porting di una VM Java su iOS. Ma si consideri che la macchina virtuale richiede l'accesso alle chiamate di sistema a livello del sistema operativo, mappando l'implementazione della classe di fondazione JDK fino alle funzionalità native del sistema operativo. Ottenere le prestazioni è un'altra sfida, poiché la maggior parte delle JVM usa un JIT per avvicinarsi alle prestazioni del livello nativo. Questi compilatori JIT sono complessi, e richiedono uno specialista per il porting, non un progetto da weekend, a meno che questo non sia quello che si fa per vivere. E la maggior parte delle persone che usano Java si preoccupano delle prestazioni, specialmente nel contesto di un dispositivo con risorse limitate. Il numero di persone nel mondo che si specializzano in quest'area di lavoro è abbastanza piccolo rispetto al tipico sviluppatore di app, richiedendo, conoscenza di C/C++, Assembly per il dispositivo di destinazione, architettura VM, analisi delle prestazioni, sysroot avanzato della toolchain, ecc. Davvero, queste sono alcune delle persone più brillanti e di talento che incontrerete. Se volete saperne di più sugli sforzi esistenti intorno al JDK e al porting della piattaforma JavaSE su mobile, vedete: iOS Platform Implementation Details

Ora la risposta non tecnica, guidata dal monopolio del mercato: Apple blocca la distribuzione di runtime alternativi su iOS. Non si potrebbe, per esempio, presentare un JDK all'App store per ottenere l'approvazione. Apple lo rifiuterebbe. Incorporare i runtime nella vostra app era severamente proibito, e Apple ha un linguaggio su questo nelle sue linee guida per iOS. C'è una certa nozione che Apple non vuole supportare ecosistemi concorrenti, e potrei entrare in un intero thread sui molti modi in cui questo si manifesta nell'attuale processo di approvazione delle App. Tuttavia, sembra che alcune di queste regole siano state allentate. Ancora, mi aspetterei che un'app dalle prestazioni lente (supponendo che si stia eseguendo una VM all'interno di un'app iOS, verrebbe effettivamente rifiutata per motivi di violazione delle linee guida sulle prestazioni. Leggi di più: AppStore / App iOS e codice interpretato - dove tracciano la linea? Ci potrebbe essere un legame storico anche qui, c'era qualche voce che Steve Jobs odiava Java e ha fatto in modo che venisse rimosso da Mac OS (eravamo abituati a godere di un'implementazione Java un po' malandata sul vecchio Mac OS 8 o giù di lì), ed è possibile che questo si sia trasferito nello spazio iOS, anche se, chi lo sa. Ragioni tecniche probabilmente lo rendevano poco pratico da considerare nei vecchi tempi dei dispositivi iOS gen1 e gen2 a causa delle risorse limitate sui dispositivi. I dispositivi di oggi potrebbero certamente gestire il compito di eseguire una JVM.