Quando e onde a convenção $ para literais hexadecimais se originou?
Achei interessante esta pergunta sobre a origem de 0x
denotar 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 0x
prefixo era uma coisa.
Se o 0x
prefixo 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
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 0x
convençã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 H
sufixo 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 H
sufixo, C um 0x
prefixo 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 nnnnH
notaçã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 1965O 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, H
para 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.