Prima di tutto, vale la pena notare che la JVM di Sun è stata scritta in C. C è un linguaggio molto popolare quando è necessaria la portabilità.
La lingua C è portatile anche se molti programmi non lo sono. Questo perché C non pone tante restrizioni sul programmatore o fa tante ipotesi. Se un programmatore C vuole che i suoi programmi siano portatili, deve mettere queste restrizioni su se stesso.
In pratica, questo non è molto più difficile di vivere con le restrizioni che le forze Java hanno su di te. È principalmente una questione di essere consapevoli della tua endianità e delle dimensioni primitive e utilizzare librerie portatili come GTK + invece di librerie specifiche per piattaforma.
Potresti realizzare un target GTK + e un compilatore C che supportava una macchina virtuale, anche probabilmente la JVM, e ottenere il codice esistente per lavorare con pochissime modifiche. In effetti, senza la garbage collection, una macchina virtuale C sarebbe probabilmente molto più semplice. Perché vorresti, però?
Il contrario, compilando Java al codice nativo, è altrettanto fattibile. Questo è fondamentalmente ciò che fa il JIT. Perché vorresti, però? Sono sicuro che ci sono progetti pet per farlo "solo perché", ma non sono in uso serio.