Algo que el público menos aficionado a 'Star Wars' no conocerá es que en dicho universo de ficción no existe el alfabeto latino (ya sabes, 'A, B, C...')... ni ningún otro alfabeto humano real, en realidad. La mayor parte de las letras que veremos en sus películas, series y cómics corresponden al ficticio alfabeto aurebesh, en el que se escribe el 'idioma básico galáctico'.
Bueno, en realidad eso no es del todo así: ese dato sólo se convirtió en canon con el estreno de 'El Imperio contraataca', de tal forma que se pueden ver textos en alfabeto latino (o directamente en idioma inglés) a lo largo de toda la primera película (o cuarta, dependiendo de cómo las cuentes). Lo que resulta inesperado es comprobar que, al menos en uno de los casos en que esto ha ocurrido, ha sido para colar brevemente en pantalla código de programación.
Subestimas el poder del lado oscuro (del desarrollo de software)
Si observas la película en torno al minuto 1:10:00, en una escena que transcurre a bordo de la Estrella de la Muerte durante el rescate de Leia, hay un momento en el que puedes ver (con esfuerzo) que, en una pantalla situada en la pared trás C3PO y R2D2, aparece un gráfico con una serie de letras y números debajo:
En la primera columna, vemos en primer lugar "THX 1138" (que no tiene nada que ver con la programación, sino que es una referencia al primer largometraje de George Lucas, también adscrito al género de ciencia ficción), seguido de instrucciones como "JMP", "BNE" repetido dos veces, y "LDA".
En la segunda columna, se listan otras instrucciones igualmente breves: "BPL", "BMI", "BVC", "BCC" y "BCS".
Si no tienes claro qué tienen que ver esas aparentes siglas con un lenguaje de programación, no te preocupes: se trata de un lenguaje cuyo código no suele verse por Internet tan a menudo como el de C++, Python, Java o JavaScript. Hablamos de ensamblador, concretamente del 'dialecto' de ensamblador para los ordenadores Commodore 64 (C64), que utilizaba un chipset MOS Technology 6510.
¿Pero qué significa ese código? ¿Por qué no hay ningún print("Hello world")?
Las instrucciones que muestra la pantalla son de uso común en este lenguaje:
- JMP (Jump): Esta instrucción cambia el flujo del programa a otra dirección de memoria especificada.
- BNE (Branch if Not Equal): Se usa para cambiar el flujo del programa si la última operación no resultó en igualdad (es decir, si los valores comparados no son iguales).
- LDA (Load Accumulator A): Carga un valor en el registro acumulador A, que es una operación común para preparar el procesador para realizar cálculos o tomar decisiones basadas en ese valor.
- BPL (Branch if Plus): Cambia el flujo del programa si el resultado de la última operación fue positivo (el bit de signo es 0).
- BMI (Branch if Minus): Se utiliza para cambiar el flujo si el resultado de la última operación fue negativo (el bit de signo es 1).
- BVC (Branch if Overflow Clear) y BCC (Branch if Carry Clear): Estas instrucciones controlan el flujo basándose en la ausencia de un desbordamiento y un acarreo, respectivamente.
- BCS (Branch if Carry Set): Cambia el flujo si se estableció un acarreo, lo que puede ocurrir después de operaciones aritméticas que exceden el rango del registro.
Todas estas son operaciones básicas de la programación en ensamblador para controlar el flujo del software, y para realizar bucles, condicionales y manejo de errores o eventos específicos. De hecho, en sistemas limitados como el C64, estas instrucciones podrían estar involucradas en todo tipo de operaciones, desde manejar la lógica de un juego hasta realizar operaciones de entrada/salida o manipular datos en memoria.
Eso sí, sin conocer el contexto completo del código (como los valores con los que trabaja, las direcciones de memoria a las que saltan estas instrucciones, y cómo se modifican o usan los registros), es complicado determinar exactamente cuál es el propósito de este código dentro del programa (en el caso de que haya un propósito, claro).
¿Qué es el lenguaje ensamblador? ¿Qué tiene de especial?
El lenguaje ensamblador es un tipo de lenguaje de programación que, a diferencia de los lenguajes como Python, Java o C++ (los llamados de 'alto nivel', diseñados para ser fáciles de leer y escribir por los humanos), se basa en instrucciones mnemotécnicas: representaciones textuales cortas de las operaciones fundamentales que la CPU puede realizar, casi directamente traducibles a 'código máquina'.
Como cada tipo de procesador tiene su propio conjunto de instrucciones, también tiene, por lo tanto, su propio dialecto de lenguaje ensamblador.
A pesar de su complejidad y de la prevalencia de los lenguajes de programación de alto nivel, el lenguaje ensamblador sigue teniendo presencia por varias razones:
- Eficiencia: Permite a los programadores escribir código que opera directamente sobre el hardware, ofreciendo un control total sobre los recursos del sistema y la posibilidad de optimizar el rendimiento hasta el último ciclo de CPU.
- Programación de hardware: Es esencial para el desarrollo de firmware, controladores de dispositivos y sistemas operativos, donde se requiere una interacción directa y precisa con el hardware.
- Enseñanza del hardware: Aprender ensamblador proporciona una comprensión profunda de cómo funciona el hardware a nivel de bajo nivel, lo cual es invaluable para los estudiantes de informática y profesionales que buscan profundizar en los fundamentos de la computación.
- Análisis de malware: El ensamblador es una herramienta clave en el análisis de software malicioso mediante ingeniería inversa, permitiendo a los expertos en seguridad descomponer y entender el comportamiento de los programas a nivel de código máquina.
Vía | YouTube