¿Cuándo y dónde se originó la convención $ para literales hexadecimales?

Aug 16 2020

Encontré que esta pregunta sobre el origen de 0xpara denotar hexadecimal es interesante.

Sin embargo, cuando me dediqué a programar en sistemas 65xx de 8 bits a principios de los 80, todo lo que vi usaba un $para denotar dígitos hexadecimales (ensambladores, monitores, libros, revistas, etc.). No fue hasta que obtuve mi primer Amiga 1000 y comencé a aprender C que incluso supe que el 0xprefijo era una cosa.

Si el 0xprefijo es claramente anterior a la revolución de 8 bits , entonces (1) ¿por qué fue $adoptado tan ampliamente? Y lo contrario, (2) habiéndose vuelto omnipresente para toda una generación de programadores de 8 bits, ¿por qué se abandonó abruptamente? (No es que importe, pero todavía lo uso $cuando comento código o garabateo en árboles muertos).

Respuestas

21 Raffzahn Aug 16 2020 at 12:59

Respuesta corta:

Motorola lo usó para su 6800 y MOS (6500) lo heredó de Motorola. Después de todo, los 6500 miembros del equipo salieron del proyecto 6800, por lo que ya estaban acostumbrados.


Respuesta larga:

Si el prefijo 0x es claramente anterior a la revolución de 8 bits,

Realmente no es así. Motorola ya usaba el $prefijo con el 6800 de 1974. Unix había sido reescrito en C sólo recientemente (1973), lo que agregó la 0xconvención en esa época, y se mostró fuera de AT&T.

entonces (1) ¿por qué se adoptó $ tan ampliamente?

Debido a la línea 6800/02/09 de Motorola, así como a la serie 6500 de MOS que se utilizan en muchas microcomputadoras (domésticas) de gama baja. Más notablemente por Acorn, Apple, Atari y Commodore. Naturalmente, todos los que escriban software para estas máquinas / CPU usarían su notación.

Más tarde, se vio reforzado por la popularidad del 68000 utilizado, por ejemplo, con la línea de máquinas Atari ST y Commodore Amiga.

Y lo contrario, (2) habiéndose vuelto omnipresente para toda una generación de programadores de 8 bits,

Ahora bien, esto depende en gran medida de su 'burbuja de procesador', ya que solo es cierto para los usuarios de máquinas basadas en 65xx / 68xx. Quien haya crecido con una máquina basada en x80 (8080, 8085, Z80) o x86, como Altair (S100), Tandy TRS-80 y todo el mundo MSX, no estará de acuerdo. Serán bastante firmes en el sentido de que un Hsufijo era la única forma válida y todo lo demás es bastante exótico :))

¿Por qué se cayó abruptamente?

No lo fue. No hay ningún organismo gobernante mundial que lo supere. Después de todo, el uso de un prefijo (o sufijo) no es inherente al código hexadecimal, sino que está definido por el idioma utilizado. Los ensambladores de Motorola / MOS quieren un $prefijo, Intel un Hsufijo, C un 0xprefijo y otros nuevamente quieren un prefijo más matemático de 16#(Ada) o 16r(Smalltalk).

(No es que importe, pero sigo usando $ cuando comento código o garabateo en árboles muertos).

Y también muchos otros (* 3).

En pocas palabras: el lenguaje que uno usa define la notación y, como siempre, el primero deja la impresión más profunda.


Ventaja de Prefix sobre Postfix

Las matemáticas clásicas usan una notación postfija de tener la raíz detrás de un número. Que Intel siguió con su nnnnHnotación. Para la escritura del compilador, esto trae la desventaja de que una palabra completa (constante) debe leerse primero, antes de poder decidir cómo interpretarla. Esto significa que se necesita un búfer que contenga toda la cadena, ya que solo se puede convertir después de avanzar hasta el sufijo.

Al usar un prefijo, está claro desde el principio cómo interpretar los siguientes caracteres. Esto no es necesario almacenarlo en búfer (* 2). Esto proporciona una ventaja en el diseño del analizador sintáctico y simplifica mucho el ensamblador. Esto fue especialmente útil para la creación rápida de herramientas de ensamblador cruzado tempranas como primer arranque.


Algo de historia

  • La notación hexadecimal era bastante poco común en los primeros años. En cambio, octal era la clave, ya que la mayoría de las máquinas se construían con un tamaño múltiplo de 3 palabras , y los caracteres generalmente se manejaban como 6 bits.

  • De las pocas máquinas / sistemas que ofrecían hexadecimal muy temprano, muchos usaban varias letras / símbolos, como los últimos 6 en el alfabeto UVWXYZ(* 2), a menudo incluso de forma discontinua.

  • IBM introdujo un formato de cadena con prefijo ( X'nnnn') con / 360 en 1965

  • Punto de datos utilizado octal con un prefijo cero

  • El 4004 de Intel usó hexadecimal con un sufijo de h

  • El 8008 de Intel usó todo octal en manuales y documentación, escrito como nnnO

  • En 1973, ambos ensambladores estaban hechos para usar los mismos sufijos B / O / H.


* 1 - El cuidado de unos pocos bytes de búfer puede parecer extraño hoy, donde la fuente completa generalmente se carga en la memoria, pero la RAM era un recurso escaso en ese entonces. Como resultado, se prefirieron algoritmos que pudieran leer datos, como de una cinta de papel, y trabajar directamente en cada símbolo leído sin almacenar en búfer.

Un ensamblador óptimo permite leer cualquier elemento, un carácter a la vez, y procesarlo de inmediato sin necesidad de mirar hacia adelante. El uso de un prefijo admite esto.

* 2: una convención que se utiliza a menudo en ingeniería cuando se necesitan símbolos.

* 3 - Aquí en RC.SE trato de usar la notación de acuerdo con el tema, entonces $para 65/68, Hpara Intel, y así sucesivamente ... y cuando no hay una relación clara, recurro a la notación / 370 x'nn', ya que era lo que más usaba, a pesar de haber usado $primero.