El código máquina es un lenguaje de programación de MUY bajo nivel que es directamente ejecutable por la unidad central de procesamiento (CPU) de una computadora.
Si abrimos un programa ejecutable veremos un chicharro de datos como el siguiente (pero con muchas muchas ¡muchas! más líneas)
00 F3 0F 6F 05 D7 8E 06 00 0F 11 74 24 60 0F 11 44 24 70 41 80 FD 03 0F 84
9B 03 00 00 8B 7E 04 45 31 F6 85 FF 0F 89 AF FD FF FF 80 7E 08 00 0F 84 DB
02 00 00 31 FF 41 80 FD 01 40 0F 94 C7 83 C7 06 E9 AD FD FF FF 66 0F 1F 84
00 00 00 00 00 80 7C 24 6F 01 0F 84 3D 04 00 00 8B 44 24 60 48 83 F8 03 0F
86 5A 02 00 00 BA 03 00 00 00 E9 0E FF FF FF 0F 1F 44 00 00 40 84 ED 48 8D
3D 43 84 06 00 48 8D 05 40 84 06 00 48 0F 45 F8 E9 C8 FE FF FF 66 0F 1F 44
00 00 45 84 F6 0F 84 17 03 00 00 45 0F B6 F6 48 8D 05 BC 83 06 00 48 C7 44
24 70 01 00 00 00 41 BD 01 00 00 00 42 0F B6 04 30 88 84 24 80 00 00 00 48
8D 44 24 50 48 89 44 24 30 66 0F EF F6 C6 44 24 50 25 44 8B 76 04 48 8D 54
24 51 F3 0F 5A F1 40 84 FF 74 0A C6 44 24 51 23 48 8D 54 24 52 45 85 F6 78
0F 0F B7 05 12 8E 06 00 48 83 C2 02 66 89 42 FE 40 80 FD 01 C6 42 01 00 BF
F4 01 00 00 4C 89 FB 19 C0 83 E0 20 83 C0 41 88 02 49 8D 45 01 48 89 44 24
38 0F 1F 00 4C 29 EF 4A 8D 0C 2B 48 89 FD 45 85 F6 0F 88 A4 00 00 00 4C 8B
44 24 30 F2 0F 11 74 24 20 45 89 F1 48 89 FA E8 17 F4 FE FF 48 8B 7C 24 78
48 8B 5C 24 68 85 C0 0F 88 A4 00 00 00 48 98 48 39 E8 0F 82 EA 00 00 00 48
8B 54 24 38 48 01 D0 48 39 C7 73 AD 48 89 FD 48 D1 ED 48 01 FD 48 39 C5 48
(... muchas muchas muchas más lineas)
¿Qué es eso? Eso es el código máquina, es decir, el código binario necesario para que tu procesador ejecute el programa. Este es el único lenguaje que entiende tu procesador.
Cada instrucción se corresponde con una operación básica específica que la CPU puede ejecutar. Son operaciones muy básicas y sencillas (por ejemplo, sumar dos números, transferir datos de un lugar a otro en la memoria, o comparar dos números).
Las instrucciones disponibles varían entre arquitecturas y modelos de procesadores. Un antiguo x86 8088 tenía entre 81 instrucciones. Un procesador moderno puede tener varios cientos de instrucciones disponibles.
El código máquina utiliza las instrucciones elementales llamándolas por su “código de operación” (opcode, que simplemente, una representación numérica que le damos a cada instrucción).
Como vemos, el código máquina es totalmente dependiente del hardware subyacente. Cada procesador tiene su propio conjunto de instrucciones, sus opcodes y su propia estructura de registros.
Esto significa que el código máquina escrito para una arquitectura de procesador en concreto no es directamente compatible con otro procesador diferente. Ese montón de bytes sólo va a funcionar en un procesador de un tipo.
Otra característica evidente del código máquina es que su legibilidad para perseonas es muy baja. Está formado por una secuencia de ceros y unos, es muy difícil para los humanos entenderlo y mantenerlo. Además, el código máquina carece de abstracciones y estructuras de control avanzadas que se encuentran en lenguajes de programación de alto nivel.
Aunque os parezca mentira, al principio de la programación se programaba así. Y como os imaginaréis, era un infierno programar en eso. Era un proceso muy lento, complicado, y propenso a errores. Por eso pronto surgieron otros lenguajes, como Ensamblador, que permitían hacer el proceso más sencillo.
Aunque el código máquina se considera (y es) un lenguaje de programación de bajo nivel, su uso directo en el desarrollo de aplicaciones modernas es muy limitado (or no decir prácticamente nulo).
En la actualidad, la mayoría de los programadores utilizan lenguajes de programación de alto nivel, como C++ o Python, que ofrecen abstracciones y estructuras de control más amigables para el desarrollo de software.