Ordenadores

Una comparación entre un programa en lenguaje C y su compilación en código máquina, instrucción a instrucción

En el siempre didáctico canal de Ben Eater, dedicado a la programación en lenguajes de bajo nivel, la electrónica de los procesadores y cosas así encontré este vídeo que muestra cómo es el código máquina resultante de compilar un sencillo programa en C. Y, aunque quienes programan pueden imaginar cómo funciona, me pareció una excelente narrativa sobre lo que sucede «tras las bambalinas».

Hay cierto debate filosófico en los comentarios sobre si lo que se muestra como código máquina es tal y es más bien ensamblador, algo muy similar pero en cierto modo diferente. Si bien es cierto que en mi opinión parece más ensamblador –porque hay instrucciones con nombres, pseudovariables y otras referencias– eso no le quita mérito al asunto. Ver el código máquina sería básicamente lo mismo, pero más aburrido: un chorro de bytes en hexadecimal, situados en las posiciones de memoria que indica la columna izquierda.

(Por cierto que lo de bajo nivel de estos lenguajes se refiere a «estar más cerca del hardware de la máquina», no a que sean más toscos o simples, aunque también; el código máquina solo tiene unas pocas decenas o cientos de instrucciones. El caso es que el código máquina está mucho más cerca de los unos y ceros de los chips que las referencias y códigos del ensamblador o el código mucho más «humano» y lleno de funciones y opciones del lenguaje C. Más bajo que el código máquina solo estaría ponerse a soldar cables seguramente.)

En cualquier caso, Eater va recorriendo línea a línea un sencillo programa que imprime la conocida secuencia de Fibonnaci (0, 1, 1, 2, 3, 5, 8, 13…) y su equivalente compilado. Va explicando a qué equivalen los bucles, asignaciones de variables, comparaciones y otras operaciones del C, vistas en ensamblador. Es todo bastante directo y óptimo, diría que altamente satisfactorio. Tan sólo hay unas pocas instrucciones que no están muy claro lo que hacen: algunas al inicio del programa (para preparar el stack por si se devuelve un valor o algo así) y otra tras la función printf que imprime los valores, que tampoco está muy claro qué hacen, aunque parece que es algo como guardar la longitud del valor impreso por si hubiera que usarlo o devolverlo como función o algo así.

Es una gran lección que en 10 minutos permite apreciar cómo unos lenguajes que los humanos podemos «leer» se convierten en algo que los procesadores de los ordenadores pueden entender y ejecutar. Tremendamente didáctico, obligatorio para clase de informática, como quien dice.

Relacionado:

# Enlace Permanente

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button