Cuando las computadoras no entendían letras
Hoy estamos acostumbrados a escribir código utilizando palabras como if, function, class, return o const. Incluso podemos escribir textos, nombres y símbolos dentro de nuestros programas. Sin embargo, las primeras computadoras no trabajaban de esta manera.
Una computadora, en su nivel más básico, trabaja con estados que podemos representar mediante 0 y 1. Para el procesador, esos bits son parte de los datos e instrucciones que debe manejar.
Entonces aparece una pregunta interesante: si la computadora trabaja con números y bits, ¿cómo llegamos a escribir instrucciones utilizando palabras y letras?
1. Primero estaban las instrucciones de máquina
Las primeras formas de programación requerían trabajar con instrucciones que la máquina pudiera interpretar directamente. Estas instrucciones se representaban mediante valores numéricos y, en el nivel más bajo, mediante bits.
Para una persona, algo así resulta difícil de leer y recordar:
10110000
00000101
El problema no era que la computadora necesitara letras. El problema era que los humanos necesitaban una forma más fácil de escribir y recordar las instrucciones.
2. Aparece el lenguaje ensamblador
La solución fue crear una representación más legible de las instrucciones de máquina. En lugar de escribir directamente sus valores numéricos, se comenzaron a utilizar nombres que representaban operaciones.
Por ejemplo, podían utilizarse instrucciones como:
MOV
ADD
SUB
JMP
Esto no significa que la CPU haya aprendido a entender inglés. La CPU sigue trabajando con las instrucciones que reconoce. Lo que cambió fue la forma en que los humanos podían escribirlas.
Un programa llamado ensamblador se encarga de convertir esas palabras e instrucciones en código máquina.
Assembly -> Assembler -> Machine Code -> CPU
3. Entonces, ¿cómo entiende la computadora la palabra MOV?
La computadora no interpreta la palabra MOV directamente como lo haría una persona.
Cuando el programador escribe:
MOV
el ensamblador reconoce que MOV corresponde a una determinada instrucción y la transforma en el código máquina correspondiente.
Por lo tanto, la palabra MOV es una representación para el programador. Para la CPU, lo que finalmente importa es la instrucción codificada que puede ejecutar.
4. El mismo principio sirve para las letras de un texto
Aquí aparece una idea todavía más importante. Las letras también pueden representarse mediante números.
Por ejemplo, con ASCII:
A = 65
B = 66
C = 67
La computadora no necesita almacenar una letra como un objeto especial llamado A. Puede almacenar un valor numérico y utilizar una regla que indique que ese valor representa determinado carácter.
Por ejemplo:
65 -> A
66 -> B
67 -> C
Así, una letra puede terminar almacenada como bits igual que cualquier otro dato.
5. La computadora no aprendió letras, nosotros creamos una representación
Este es el punto fundamental.
Cuando escribimos:
A
nosotros vemos una letra. La computadora trabaja con su representación numérica y binaria.
Lo mismo ocurre con las instrucciones del ensamblador. Nosotros escribimos:
ADD
y el ensamblador utiliza una representación previamente definida para convertir esa instrucción en código que la CPU pueda ejecutar.
En ambos casos existe una misma idea: tomamos algo que resulta fácil de manejar para una persona y establecemos una representación que la máquina pueda procesar.
6. De ensamblador a lenguajes de alto nivel
Con el tiempo, los lenguajes fueron aumentando su nivel de abstracción. Ya no era necesario trabajar directamente con operaciones cercanas a la CPU.
En lugar de escribir instrucciones individuales, los programadores pudieron comenzar a expresar operaciones más complejas utilizando lenguajes como C, Java y JavaScript.
Podemos imaginarlo de forma simplificada:
JavaScript
->
lenguaje de alto nivel
->
otras representaciones
->
Assembly
->
código máquina
->
CPU
Cada nivel utiliza representaciones que hacen más fácil trabajar con el nivel superior.
7. Entonces, ¿qué significa realmente que una computadora "entienda" algo?
Cuando decimos que una computadora entiende una letra, una instrucción o un programa, normalmente estamos simplificando mucho la situación.
La computadora trabaja con datos e instrucciones que tienen una representación definida. Un programa, un texto o una instrucción pueden estar formados por bytes y bits, pero diferentes programas interpretan esos mismos datos de acuerdo con reglas específicas.
Por eso A, MOV, 65 y una secuencia de bits pueden estar relacionados sin ser exactamente la misma cosa. Cada uno pertenece a una capa diferente de representación.
Consideraciones
El paso del código máquina al lenguaje ensamblador fue importante porque permitió que los programadores dejaran de escribir directamente las representaciones numéricas de las instrucciones y comenzaran a utilizar nombres más fáciles de recordar.
Después, los lenguajes de alto nivel llevaron esa idea mucho más lejos. Hoy podemos escribir instrucciones que se parecen bastante al lenguaje humano, pero debajo de esas palabras siguen existiendo múltiples capas de representación que finalmente terminan en datos e instrucciones que el procesador puede manejar.
© Arturo Juárez Monroy