Onde e quando a convenção `0x` para literais hexadecimais se originou?

Aug 16 2020

No início dos anos 1980, C estava usando 0xcomo prefixo para indicar literais inteiros expressos em hexadecimal, por exemplo 0xCAFE,. Isso não existia em B em 1972, embora B oferecesse suporte a literais inteiros octais por meio de um 0prefixo.

Onde e quando esse 0xprefixo foi usado pela primeira vez?

Respostas

36 Raffzahn Aug 16 2020 at 13:28

Isso não existia em B em 1972, embora B oferecesse suporte a literais inteiros octais por meio de um prefixo 0.

É verdade, mas o predecessor de B, BCPL, tinha uma notação de #para octal e #xpara hexadecimal. Portanto, a ideia 'saltou' uma geração.


A história do C é a de remover recursos a serem adicionados novamente mais tarde ... para melhor ou pior.

  • CPL (Combined Programming Language) foi desenvolvido em Cambridge e Londres como um Algol simplificado para programação de sistema (* 1). Foi implementado em 1965/66 para o EDSAC 2, Atlas e IBM 7094.

  • BCPL (Basic CPL) foi, como o nome sugere, uma versão simplificada da CPL, implementada pela primeira vez em 1967 em um IBM 7094 (* 2).

  • B era novamente um BCPL simplificado (* 3, * 4), feito para caber no PDP-7 em 1969.

  • C foi desenvolvido via NB (New B) para o PDP-11 em 1972ff, adicionando recursos (de volta).

CPL usado #para denotar constantes octais. Não havia necessidade real de hexadecimal, pois todas as máquinas para as quais foi implementado tinham tamanhos de palavras divisíveis por 3 e usavam caracteres de 6 bits para a saída.

O BCPL evoluiu ao longo de um tempo (bastante curto). Embora desde o início tenha #sido usado para marcar um número octal, logo foi suplementado por #bbinário #xpara hexadecimal e até mesmo #opara octal. Essas adições eram específicas de tempo e implementação, mas pelo menos #xse tornaram um padrão rápido.

B caiu #xnovamente com a #notação inteira (* 5) em favor de um zero precedente, simplificando o analisador. Como o PDP-7 era uma máquina de múltiplos de 3 palavras, octal era a única notação específica da máquina necessária (* 6,7).

C, por sua vez, foi desenvolvido para o PDP-11, para o qual, como máquina de 16 bits, muitas constantes dependentes de máquina vêm naturalmente em hexadecimal - sem mencionar o byte de 8 bits e a segmentação ASCII em grupos de 32. Agora, foi considerada a reintrodução de uma notação hexadecimal útil - apenas desta vez mantendo a ideia de um zero precedente.


* 1 - Vale muito a pena dar uma olhada no CPL. Embora já tenha muitos dos fundamentos de C, como ponteiros para palavras como elemento básico, também contém vários recursos que parecem pouco convencionais a partir de hoje. Por exemplo a = bc, não atribui a variável bc a a, mas o produto de b vezes c. Os identificadores de vários caracteres devem começar com letras maiúsculas. Esta pode muito bem ser a origem do caso do camelo muito apreciado.

* 2 - E um TTY modelo 35, que, na época, não possuía colchetes ou chaves, portanto foram acrescentados dígrafos. Semelhante, sem barra invertida, *foi usado para caracteres especiais em strings.

* 3 - Mais algumas opções engraçadas. Algol tinha +:=como atribuição aumentada, então usei CPL e BCPL =+, enquanto B voltou para +=.

* 4 - Talvez algum PL / I adicionado.

* 5 - Também caiu #como parte dos operadores de comparação

* 6 - É sempre bom ter em mente que o byte de 8 bits e a notação hexadecimal correspondente só foram introduzidos um pouco antes com o IBM / 360.

* 7 - Uma observação interessante pode ser que o CTC usou também um zero precedente para constantes octais em seu Assembler para o Datapoint 2200 1970 . Portanto, embora eu não conheça nenhuma relação direta, é bastante interessante que eles tenham surgido com a mesma solução ao mesmo tempo que Thompson.