Enciclopedia de Conocimientos Fundamentales
UNAM ˜ SIGLO XXI


regreso








6.5 SEGUNDO PISO: LENGUAJES DE BAJO NIVEL

El uso de la abstracción en la construcción del hardware de la computadora es muy importante. Por ejemplo, las compuertas lógicas, la jerarquía de memoria, etc. En la parte del software también, como ya se empezó a discutir en el tema sobre abstracción, y se describe con más detalle a continuación.

6.5.1 Lenguaje de máquina

Se ha dicho que una computadora no es otra cosa que un ejecutor de algoritmos, y que éstos consisten en una secuencia de instrucciones. Por otra parte, también se ha comentado que absolutamente todo lo que se almacena en la memoria de una computadora, todos los datos con los que opera, son cadenas de ceros y unos (en realidad, presencias o ausencias de corriente). Se deduce entonces que las instrucciones que debe ejecutar un procesador están representadas por cadenas binarias. En efecto, en el mundo real de las computadoras electrónicas digitales, este lenguaje está hecho de ceros y unos. Las instrucciones que la computadora "entiende" son cadenas de bits. Al lenguaje que puede ejecutar el procesador directamente se le denomina lenguaje de máquina.

La primera labor del diseñador de computadoras es determinar el catálogo de cosas que el procesador central sabrá hacer por sí mismo, usando únicamente sus componentes físicos, su hardware. Debe decidir qué instrucciones implementar en hardware, y cuáles dejar para ser programadas en software utilizando las del hardware. Sería ideal implementar muchísimas en hardware, ya que se ejecutarían más rápido, pero éste se complicaría mucho. Conforme se va logrando miniaturizar más y más los circuitos electrónicos se pueden incluir más instrucciones en hardware.

Se puede decidir, por ejemplo, que la computadora sabrá sumar, restar y hacer operaciones como el OR o el AND con operandos de 32 bits de longitud, o también que no sabrá multiplicar. Esto, por supuesto, no significa que la máquina no pueda multiplicar, sólo que para hacerlo deberá ejecutar un algoritmo basado en las operaciones que sí sabe hacer por sí misma, como la suma. Al catálogo de instrucciones que la computadora sabe hacer sin ayuda de un programa se le llama conjunto de instrucciones.

Este conjunto de instrucciones se numera, con lo que ahora cada operación diferente tendrá un código asociado que la identifica y que se utilizará después, en lenguaje de máquina, para indicarle al procesador que debe llevar a cabo esa operación. Así, por ejemplo, la suma puede ser la número 23 (0010111 en binario en siete bits) de un catálogo de 128 instrucciones diferentes, de manera que el código 0010111, al ser leído por la unidad de control del procesador, le indica que debe ordenarle a la ALU que realice una suma.

Con lo que se ha visto acerca del procesador y sus registros, se puede tener ya una idea clara de cómo se ven las instrucciones de lenguaje de máquina. Una instrucción de suma (a la que se le había asignado el código de operación 23 o 0010111 en binario) entre dos registros del procesador, por ejemplo, el número 10 (001010 en binario en seis bits) y el 14 (001110 en binario) podría comenzar así: 0010111,001010,001110 (se han puesto comas para separar el código de operación y los números de los registros, pero por supuesto no estarían en la memoria de la máquina). Esta suma genera un resultado que habrá que guardar en algún lado, por ejemplo, en el registro 12 (001100 en binario). Con esto en mente y quitando las comas, la instrucción completa se vería así:

0010111001010001110001100


Curiosidades
En la práctica son comunes dos tipos de conjuntos de instrucciones: CISC y RISC (por sus siglas en inglés), de computadora de conjunto de instrucciones completo y reducido, respectivamente. Para cada uno de estos conjuntos existen diversos procesadores que implementan o entienden dicho conjunto de instrucciones. Hoy en día, muchas arquitecturas de dispositivos tan variados como las computadoras de mano (Palm, PocketPC), las consolas de videojuegos (Nintendo), los reproductores de música, los teléfonos (iPod, iPhone, varios modelos de Nokia, etc.) y, por supuesto, una plétora de computadoras están basadas en RISC.


Cuando el procesador recibe esta cadena, su unidad de control ya sabe que los primeros siete bits son el código que indica qué operación se debe realizar, sabe que los siguientes dos segmentos de seis bits son los nombres de los registros cuyo contenido será usado como operando y que los últimos bits son el nombre del registro en el que se debe guardar el resultado de la operación. Éste es el estilo de cosas que el procesador ejecuta, las instrucciones en el lenguaje nativo de la computadora.

Por supuesto, cada procesador particular tiene su propio conjunto de instrucciones y sus propios códigos de operación, entre otras cosas. Un programa escrito en el lenguaje de un procesador particular no es ejecutable por otro. Por poner un caso concreto, un programa en lenguaje de máquina para un procesador fabricado por una compañía no es entendible para un procesador fabricado por otra; ambas compañías fabrican procesadores, pero con conjuntos de instrucciones y códigos de operación radicalmente diferentes.

Pero a pesar de que un programa en lenguaje de máquina para un procesador no es, en principio, ejecutable por otro, sabemos que ambos procesadores no son más que un par de máquinas de Turing, como se vio en el tema de abstracción. Ambas igualmente capaces, ambas igualmente poderosas en cuanto a lo que saben hacer, ambas esencialmente la misma máquina de Turing universal: una máquina muy general, capaz de simular cualquier máquina de Turing particular, es decir, capaz de ejecutar cualquier algoritmo.


Inicio de página