¿Xamarin en Android compila el código nativo de Android como en iOS o todavía usa la máquina virtual mono? Y por qué, ¿por qué no se vuelve completamente nativo?

Se compila al nativo como lo hace Java desde 4.4 KitKat cuando se introdujo ART (tiempo de ejecución avanzado).

Esto no es nada nuevo, parte de la teoría del compilador, para ser una generación y optimización de código más precisa. Tanto CLR (.net common lagnuage runtime) como JVM (máquina virtual java) se detienen en un pseudo-ensamblador de nivel “superior” llamado CIL (lenguaje intermedio común, la gente de MSFT lo llama MSIL, pero el nombre estándar ECMA / ISO es CIL) y el código JavaByte . Esas representaciones se pueden ejecutar en CLR o JVM. ¿Por qué? Porque es más fácil portar máquinas virtuales (CLR y / o JVM) a plataformas diferentes que toda la infraestructura del compilador.

Verifique que LLVM todos estén cambiando los backends a este sistema de compilación porque es modular y puede ser fácilmente portado / reorientado. Incluso agregaron otro nivel de abstracción (nivel inferior) llamado código de bits que es aún más código de ensamblador utilizado en los relojes Apple (y no solo) y se utiliza para optimizar aún más el rendimiento.

¿Por qué se introdujo el ART? La razón principal fue la batería. VM sigue marcando incluso en modo inactivo esperando nuevas instrucciones.

Xamarin tenía tecnología de compilación de AoT (anticipada) hace mucho tiempo en el bolsillo, simplemente no necesitaba usarla en Android. Apple prohibió las máquinas virtuales, por lo que se usó en iOS. Esta tecnología es parte de .net desde el inicio de .net. Había una herramienta llamada ngen.exe que generaba código nativo de CIL (hablo de eso en todas mis charlas / discursos sobre Xamarin y cómo Microsoft desperdició pocas buenas oportunidades).

Compruebe .net Native hoy y cómo funciona la generación de código para las aplicaciones UWP de Windows 10: parte del código se optimiza y genera en Visual Studio, parte de él en AppStore y, finalmente, la última optimización se realiza en el dispositivo durante la instalación, según la arquitectura x86 o ARM …

Entonces, el resultado final. Xamarin compila a nativo, pero esto es una simplificación excesiva, porque hay 2 mundos .net y java en la historia de Xamarin.Android y no es TAN simple …

Si piensa en aplicaciones Java que generalmente se consideran ‘nativas’, las aplicaciones Java en Android se ejecutan en VM. ¿Entonces solo puede preguntar por qué han decidido tener su propia VM en lugar de compilar en otra VM? Tienes la respuesta completa aquí: Android portado a C # | pero la historia corta .NET VM tiene un mejor rendimiento