¿Por dónde se casca el huevo?

El mundo moderno globalizado e interconectado en el que vivimos, funciona gracias a un elemento al que no prestamos la mínima atención hasta que su ausencia nos golpea con la delicadeza de un ladrillo: estándares.

Gracias a ellos, los tornillos entran en sus tuercas y funciona la Internet. Pero, muchas veces no logramos ponernos de acuerdo en cuál es la forma correcta de hacer las cosas, un ejemplo muy famoso fue la lucha entre Betamax y VHS, donde Sony y JVC decidieron imponer cada una su propio estándar para el vídeo casero, desencadenando una larga lucha donde el usuario final fue el más afectado. Como caso opuesto, tenemos USB (Universal Serial Bus), que logró unificar muchos tipos de conector y dispositivos, haciendo nuestra vida mucho más fácil.

Cosas tan simples como el orden para leer o enviar las palabras de datos en la memoria de las computadoras o red, pueden implementarse de forma diferente, de la misma manera en la que existen idiomas en los que se escribe de derecha a izquierda y otros de izquierda a derecha. Verdaderas batallas campales en los grupos de discusión se generan al tratar de definir estos asuntos.

El término inglés endianness (extremidad) designa el orden en que se almacenan los datos de más de un byte en la memoria de la computadora, en dependencia del lugar que ocupa el byte más significativo. La memoria de la computadora puede entenderse como una secuencia lineal de bits, que se organizan en bytes y estos en palabras.

Endianness
En el caso de endianness se refiere a bytes, pero se mantiene la idea.

Cuando el byte más significativo se almacena en la dirección más baja del espacio de almacenamiento asignado, se denomina Big-endian.

Cuando el byte menos significativo se almacena en la dirección más baja del almacenamiento asignado, se denomina Little-Endian.

Diagrama de cómo se almacena un entero de 32 bits en la memoria de la computadora, Big-endian/Little-endian
Diagrama de cómo se almacena un entero de 32 bits en la memoria de la computadora, Big-endian/Little-endian

Debería quedar claro que no es lo mismo escribir de derecha a izquierda, que de izquierda a derecha. Esta decisión de diseño afecta desde la arquitectura del procesador hasta los programas de usuario. Un programador en C++, o en cualquier otro lenguaje que permita gestionar la memoria, que no tenga en cuenta esto, pudiera perder la cabeza intentando entender el por qué su programa se comporta de forma antinatural. Elevar plegarias al Dios Máquina solo serviría para empeorar la situación.

Ejemplo: Digamos que por alguna loca razón (como hacer una demostración de este tema) estamos escribiendo un programa en C++, donde un número entero necesitamos trabajarlo byte a byte. Utilizaremos un entero sin signo de 32 bits, 4 bytes y realizaremos ciertas acciones con cada uno de esos bytes, como convertirlos en caracteres ASCII y luego mostrarlos. La utilidad real de este programa es cuestionable, pero aclara el punto.

Tomemos como entrada un número totalmente aleatorio 1094861636, obviamente, como manda nuestro idioma, lo escribimos de izquierda a derecha, si tomamos la primera letra de la línea como posición 1 y la segunda como posición i + 1, pues estamos escribiendo nuestro número en notación Big-endian.

El número escogido en notación binaria sería: 01000001010000100100001101000100.

Al separarlo en bytes y buscar su caracter equivalente en código ASCII, tenemos:

Representación binaria de caracter ASCII

Hasta el momento trabajamos con el orden natural de escritura de nuestro idioma, asumimos una notación Big-endian. Podemos dejarnos llevar y pensar que cuando trabajemos con el primer byte (b1) del espacio utilizado, estaremos refiriéndonos a: 01000001, “A” en código ASCII y elaborar nuestra lógica de programación en base a esa creencia. Aquí es donde ocurre el desastre: aviones caen del cielo, naves espaciales llegan a Marte en vez de la Luna, desaparecen millones en transacciones electrónicas, una que otra central electronuclear explota, unos pocos cientos de miles de muertos en equipamiento médico fuera de control, etc…

Consejo: Siempre realice pruebas de calidad a su código, salve vidas.

La serie de procesadores Intel x86 y AMD64 / x86-64 utilizan el formato Little-endian, por lo que en nuestro ejemplo, cuando trabajemos con el primer byte, estamos utilizando el valor 01000100, correspondiente a “D”. Si mostráramos los valores de los cuatro bytes, de menor a mayor dirección de memoria, obtendríamos: “DCBA”.

La notación Little-endian es más común en las arquitecturas de microprocesadores, mientras que Big-endian en protocolos de red. Existen otras arquitecturas de procesadores que pueden ser configuradas para trabajar en cualquiera de ellas.

A estas alturas nos puede surgir la pregunta ¿qué tiene que ver un huevo con el orden en el que se organiza la información en las computadoras?

En el año 1980, Danny Cohen, un científico de la computación especializado en redes de computadoras, acuñó el término basado en la novela “Los viajes de Gulliver”, escrita por Jonathan Swift. En el reino de Liliput existía una rivalidad terrible, por la que “…han estallado seis revoluciones por ese motivo, en las cuales un emperador perdió la vida y otro la corona…”. La razón de la rivalidad fue un edicto real que obligaba a todos los ciudadanos a cascar su huevo del desayuno por el extremo más estrecho, cuando la costumbre dictaba que era el más ancho.

La solución de Gulliver a la disputa fue permitir que cada quien casque el huevo por donde le fuera mejor. En el caso de las computadoras, aunque cada formato de escritura tiene sus méritos, realmente no tiene gran relevancia cual de ellos se utilice, al igual que en Liliput, pero debe establecerse un acuerdo, para permitir la estandarización y la portabilidad.

Cuando Cohen escribía sus argumentos (ver aquí) en el año 1980, el asunto despertaba grandes pasiones, pero con el tiempo, una especie de equilibrio se ha logrado, Little-endian para procesadores y Big-endian para redes, lo que no quiere decir que sea algo absoluto. Los diseñadores de hardware y programadores a todos los niveles deberán tener en cuenta este aspecto.

Comentarios