¿Por qué las tiendas de aplicaciones móviles no envían el código fuente o el código de byte y compilan al nativo directamente en el dispositivo móvil?

No hay ninguna razón para suministrar la fuente, eso exigiría tener un entorno de compilación en cada teléfono.

En cuanto al código de bytes, eso ya ocurre en Android, donde el 99% de las aplicaciones están escritas en Java y se ejecutarán en dispositivos basados ​​en ARM, x86 o MIPS.

Editar:

El código C * puede * ser portátil, pero generalmente no lo es. C, el lenguaje, se puede utilizar de una manera altamente multiplataforma, Lua es un excelente ejemplo de esto, es un lenguaje de script escrito en ANSI C que se basará en casi cualquier cosa. Sin embargo, en el momento en que utiliza las bibliotecas o las funciones de la plataforma, todas las apuestas están desactivadas.

Digamos, por ejemplo, que Android tiene un ‘botón de retroceso’, iOS no tiene dicho botón, así que en el momento en que desea que C diga ‘adjunte este botón a esta acción’, ¿qué sucede en iOS?

Luego tiene características como la integración de la libreta de direcciones, que tendrá diferentes formas de trabajar en cada plataforma.

Cuando se trata de compatibilidad multiplataforma, el lenguaje de programación casi nunca es el problema, son características específicas de la plataforma, a menudo cosas de GUI, pero a menudo también cosas de back end.

Entonces esto se hace, de alguna manera. El código de bytes de Java en Android está parcialmente compilado. Luego, el software del motor virtual de Java en el dispositivo traduce eso (lo interpreta) sobre la marcha en instrucciones nativas ejecutables.

En iOS, hay un código intermedio LLVM que está comenzando a usarse para permitir que la tienda de aplicaciones se vuelva a compilar según corresponda para algún dispositivo futuro (anunciado en junio de 2015 WWDC).

Pero el código fuente? Hm. Hay muchas razones por las que es una mala idea. El entorno de compilación que tiene un desarrollador se puede configurar de muchas maneras. Mucho de eso afectará la forma en que se construye el software. Perder el control de eso para un desarrollador puede ser algo realmente malo.

Además, el código fuente también puede ser más grande que el código binario resultante. Eso hace que sea menos eficiente mover eso a dispositivos móviles.

Java se compila en un código de bytes y eso es portátil, más o menos. Sin embargo, la interfaz con el sistema operativo y la GUI siempre es un problema. Las aplicaciones multiplataforma tienden a verse simples, deslucidas y no estándar en todas las plataformas. Lo mejor, si puede llamarlo así, el lenguaje multiplataforma es, arriba, JavaScript, que es bastante compatible en todas las plataformas, ya que se ejecuta de manera igualmente extraña en todos.