* Arquitectura del conjunto de instrucciones (ISA): Este es el conjunto fundamental de instrucciones que entiende una CPU. Diferentes CPU (incluso del mismo fabricante) tienen diferentes ISA. ¿Cuál es una simple instrucción de adición en una CPU podría ser una operación compleja de múltiples pasos en otro, o ni siquiera podría existir? La codificación de estas instrucciones (los patrones de bits específicos que representan cada instrucción) varía enormemente entre ISAS.
* Número de registros: Las CPU tienen registros internos para el almacenamiento de datos temporales. El número y el tamaño de estos registros difieren entre las CPU. Un programa escrito para usar un número y tipo de registros específicos no funcionará en una CPU con una configuración diferente.
* Modos de direccionamiento de memoria: La forma en que la CPU accede a la memoria (por ejemplo, direccionamiento directo, direccionamiento indirecto, etc.) varía entre las arquitecturas. El código de la máquina refleja estos modos de direccionamiento, lo que lo hace incompatible con las CPU utilizando diferentes métodos.
* Representaciones de datos: La forma en que los tipos de datos (enteros, números de punto flotante, etc.) se representan en formato binario pueden diferir. Un programa compilado para la representación de datos de una CPU podría producir resultados incorrectos o incluso bloqueos en una CPU con una representación diferente.
* Llamadas del sistema: Los programas a menudo interactúan con el sistema operativo a través de llamadas al sistema. La forma en que se realizan estas llamadas y los códigos específicos utilizados son CPU y específicos del sistema operativo, lo que agrega otra capa de incompatibilidad.
En esencia, el código de la máquina es extremadamente de bajo nivel y está bien acoplado al hardware físico. Intentar ejecutar el código de la máquina compilado para una CPU en una diferente es como tratar de reproducir un récord destinado a un tocadiscos de 33 ° RPM en un plato giratorio de 45 rpm:las velocidades son diferentes y el resultado es galimatías. Los idiomas de nivel superior (como C ++, Java, Python) resuelven este problema mediante el uso de compiladores o intérpretes para traducir el código en un formulario adecuado para la arquitectura de la CPU objetivo.