Aquí están mis notas resumidas incompletas sobre el tema, pero suficientes para responder a su pregunta.
CONJUNTO DE INSTRUCCIONES:
Los procesadores están fabricados con matrices de semiconductores, generalmente de silicio monocristalino de grado electrónico. No saben inglés ni ningún otro idioma humano, sólo entienden 0
y 1
. Así que el diseñador del procesador nos dice en qué secuencia de ceros y unos podemos instruir a ese procesador específico. Este lenguaje numérico de instrucciones se estandariza como Machine Language
y el conjunto de instrucciones de la máquina se llama Instruction Set
. Un procesador sólo puede actuar sobre un único tipo de conjunto de instrucciones.
Los conjuntos de instrucciones pueden ser de 8/16/32/64 bits (definen cuántas instrucciones puede procesar un procesador a la vez), siendo las dos últimas las más comunes hoy en día.
LENGUAJES DE BAJO NIVEL:
Pero escribir el código de un programa (instrucciones) directamente en lenguaje de máquina (el archivo ejecutable) es casi imposible porque se tardan años en escribir y depurar un programa razonablemente grande (que hoy en día podemos escribir en unas horas). Por eso, para que los programadores se sientan cómodos, se desarrolló el lenguaje ensamblador, que sigue siendo un lenguaje específico del procesador, pero que es relativamente fácil de entender. El código escrito en lenguaje ensamblador se convierte en código máquina mediante Assembler
- un programa escrito en lenguaje de máquina. Ambos se denominan lenguajes de bajo nivel.
LENGUAJES DE ALTO NIVEL:
Para reducir aún más el esfuerzo humano en la comunicación con el hardware, se desarrollaron lenguajes de alto nivel que no están vinculados a un conjunto de instrucciones específico (que denota una arquitectura concreta). Son idénticos a los lenguajes humanos, por lo que son fáciles de escribir, comprender, depurar y aplicar a múltiples arquitecturas. El código escrito en lenguaje de alto nivel se convierte en lenguaje de bajo nivel mediante Compiler
- un programa escrito en lenguaje de bajo nivel. Uno de los lenguajes de alto nivel más utilizados es C. Pero a veces el código no se precompila a código máquina, sino que se ejecuta directamente (o se compila durante la ejecución) por Interpreter
. Java es uno de esos "escribir una vez, ejecutar en cualquier lugar" (WORA) idiomas que se compila a byte-code
y luego interpretado por Virtual Machine
- de nuevo un programa compilado.
INTERFAZ BINARIA DE APLICACIÓN (ABI):
Dado que un programa (código) independiente de la arquitectura puede convertirse en un código dependiente de la arquitectura para cualquier procesador, el compilador tiene el deber de ocuparse de todos los requisitos de una arquitectura específica. Eso es lo que define la interfaz binaria de aplicación (ABI). En términos sencillos, una ABI representa una o varias arquitecturas específicas. Para obtener más detalles sobre las ABI integradas, es necesario conocer las fases de ensamblaje y compilación, el código objeto, el formato ejecutable y enlazable (ELF), la vinculación estática (archivo) y dinámica de las bibliotecas, etc.
Ahora vamos a tu pregunta:
¿QUÉ SON x86
Y ARM
?
x86 es una familia de conjuntos de instrucciones, desarrollada principalmente por Intel y AMD. ARM es otra familia, diseñada por una sola entidad ARM Holdings
y se ha concedido la licencia a muchos fabricantes de soluciones integradas, como Qualcomm, Mediatek, Samsung y Huawei. Snapdragon, Exynos y Kirin son sus marcas. No son fabricantes de procesadores, pero tienen licencias para incluir procesadores ARM con sus propios circuitos System on Chip (SoC).
¿QUÉ ES EL SOC?
Un sistema en chip (SoC) es un pequeño circuito que incluye procesadores junto con otros componentes como GPU, RAM, Flash/eMMC (equivalente a HDD o SSD), módulo WiFi y bluetooth, conectividad USB, UART (puertos serie), JTAG (un protocolo de comunicación serie de muy bajo nivel), GPS, módems (para la conectividad celular) y posiblemente otros.
ARM ABIs:
Aunque la mayor parte de las aplicaciones de Android están escritas en Java, se puede programar en lenguajes nativos como C y C++, que necesitan ser compilados. Android proporciona su propio kit de desarrollo nativo ( NDK ) incluyendo (bibliotecas, archivos de cabecera y) un compilador que puede compilar código para múltiples ABIs incluyendo armeabi-v7a
y x86
.
Por lo tanto, una aplicación Android (Java) no es específica de una arquitectura. El código de bytes de Java ( classes.dex
archivo en el interior .apk
) es ejecutable en cualquier dispositivo Android en una instancia separada de Dalvik Virtual Machine
ejecutado para cada aplicación por un proceso llamado Zygote
. Pero si el archivo apk (zip) contiene además binarios/bibliotecas ELF, éstos son específicos de la arquitectura.
Aplicaciones/programas/binarios/ejecutables/bibliotecas nativas construidas con conjuntos de compiladores dirigidos a ARM Embedded ABI v7a
( armeabi-v7a ) puede ejecutarse en Application profile of 7th version of ARM processors
( Armv7-A ).
32 BITS VS. 64 BITS:
El procesador ARM puede ser de 32 o 64 bits. Depende de los fabricantes de SoC lo que quieran construir con su sistema embebido, por ejemplo, Snapdragon puede ser de 32 o 64 bits. Los procesadores ARM de 32 bits fueron mejorados en cuanto a rendimiento y se añadieron nuevas características desde la versión 2 hasta la versión 7. El soporte de 64 bits se introdujo en ARMv8.
Para saber si un dispositivo es de 32 o 64 bits, hay que comprobar las especificaciones de su SoC y luego de su procesador. Por ejemplo, si un SoC contiene Cotrex-53
procesador como Qualcomm Snapdragon 625 (MSM 8953) Es evidente que el especificaciones técnicas de Cortex-53 que es un procesador ARMv8 de 64 bits que tiene plena compatibilidad con ARMv7 de 32 bits, por lo que puede ejecutar binarios/bibliotecas compilados tanto para ABI armeabi-v7a y arm64-v8a pero no para armeabi o x86 .