Quando e onde a convenção $ para literais hexadecimais se originou?

Aug 16 2020

Achei interessante esta pergunta sobre a origem de 0xdenotar hexadecimal.

No entanto, quando comecei a programar em sistemas 65xx de 8 bits no início dos anos 80, tudo o que vi usava um $para denotar dígitos hexadecimais (montadores, monitores, livros, revistas, etc). Só quando ganhei meu primeiro Amiga 1000 e comecei a aprender C é que percebi que o 0xprefixo era uma coisa.

Se o 0xprefixo antecede claramente a revolução de 8 bits , então (1) por que foi $adotado tão amplamente? E o oposto, (2) tendo se tornado onipresente para toda uma geração de programadores de 8 bits, por que foi abandonado abruptamente? (Não que isso importe, mas eu ainda uso $ao comentar o código ou rabiscar em árvores mortas.)

Respostas

21 Raffzahn Aug 16 2020 at 12:59

Resposta curta:

A Motorola o usou em seu 6800 e o MOS (6500) o herdou da Motorola. Afinal, os 6.500 membros da equipe saíram do projeto 6.800, então eles já estavam acostumados.


Resposta longa:

Se o prefixo 0x antecede claramente a revolução de 8 bits,

Não é, realmente. A Motorola $já usava o prefixo com o 6800 de 1974. O Unix só recentemente (1973) foi reescrito em C, que adicionou a 0xconvenção naquela época, e mostrado fora da AT&T.

então (1) por que $ foi adotado tão amplamente?

Por causa da linha 6800/02/09 da Motorola, bem como da série 6500 do MOS, usada em muitos microcomputadores domésticos de baixo custo. Mais notavelmente pela Acorn, Apple, Atari e Commodore. Naturalmente, todo mundo que escreve software para essas máquinas / CPUs usaria sua notação.

Posteriormente, ganhou força com a popularidade das 68000 usadas, por exemplo, com a linha de máquinas Atari ST e Commodore Amiga.

E o oposto, (2) tendo se tornado onipresente para toda uma geração de programadores de 8 bits,

Agora, isso depende muito da sua 'bolha do processador', pois só é verdade para usuários de máquinas baseadas em 65xx / 68xx. Quem cresceu com uma máquina baseada em x80 (8080, 8085, Z80) ou x86, como Altair (S100), Tandy TRS-80 e todo o mundo MSX, vai discordar. Eles serão bastante firmes no sentido de que um Hsufixo era a única forma válida e todo o resto é bastante exótico :))

por que caiu abruptamente?

Não foi. Não existe um órgão governante mundial que o supere. Afinal, usar qualquer um dos prefixos (ou sufixos) não é inerente ao código hexadecimal, mas é definido pela linguagem usada. Os montadores Motorola / MOS querem um $prefixo, Intel um Hsufixo, C um 0xprefixo e outros novamente querem um prefixo mais matemático de 16#(Ada) ou 16r(Smalltalk).

(Não que isso importe, mas eu ainda uso $ ao comentar código ou rabiscar em árvores mortas.)

E o mesmo acontece com muitos outros (* 3).

Resumindo: a linguagem que usamos define a notação - e, como sempre, a primeira deixa a impressão mais profunda.


Vantagem do Prefixo sobre o Postfix

A matemática clássica usa uma notação pós-fixada em que a raiz segue um número. Que a Intel seguiu com sua nnnnHnotação. Para a escrita do compilador, isso traz a desvantagem de que uma palavra inteira (constante) deve ser lida primeiro, antes que se possa decidir como interpretá-la. Isso significa que é necessário um buffer contendo a string inteira, pois ela só pode ser convertida após avançar até o postfix.

Usando um prefixo, fica claro desde o início como interpretar os seguintes caracteres. Não há necessidade de buffer (* 2). Isso oferece uma vantagem no design do analisador e simplifica muito o montador. Isso foi especialmente útil para a criação rápida de ferramentas de cross assembler como o primeiro bootstrap.


Um pouco de história

  • A notação hexadecimal era bastante incomum nos primeiros anos. Em vez disso, octal era a coisa, já que a maioria das máquinas era construída para um múltiplo de 3 palavras , assim como os caracteres eram geralmente tratados como 6 bits.

  • Das poucas máquinas / sistemas que ofereciam hexadecimamente no início, muitas usavam várias letras / símbolos, como os últimos 6 do alfabeto UVWXYZ(* 2), muitas vezes até não contínuos.

  • A IBM introduziu um formato de string prefixado ( X'nnnn') com / 360 em 1965

  • O Datapoint usava octal com um prefixo Zero

  • O 4004 da Intel usou hexadecimal com um sufixo de h

  • 8008 da Intel usado todo octal em manuais e documentação, escrito como nnnO

  • Em 1973, os dois montadores passaram a usar os mesmos sufixos B / O / H.


* 1 - Cuidar de alguns bytes de buffer pode parecer estranho hoje, onde toda a fonte é normalmente carregada na memória, mas a RAM era um recurso assustador naquela época. Como resultado, foram preferidos algoritmos que pudessem ler dados, como fitas de papel, e trabalhar diretamente em cada símbolo lido sem buffer.

Um montador ideal permite ler qualquer item, um caractere por vez, e processá-lo imediatamente, sem a necessidade de olhar para frente. Usar um prefixo suporta isso.

* 2 - Uma convenção freqüentemente usada em engenharia quando precisa de símbolos.

* 3 - Aqui no RC.SE eu tento usar a notação de acordo com o tópico, então $para 65/68, Hpara Intel, e assim por diante ... e quando não houver uma relação clara, voltarei para a notação / 370 x'nn', pois foi o que mais usei, apesar de ter usado $primeiro.