Por que tantos idiomas tratam números começando com 0 como octal?


21

Eu li Onde os octais são úteis? e parece que octais são algo que era uma vez útil.

Muitas linguagens tratam números anteriores com um 0 como octal, então o literal 010é realmente 8. Algumas delas são JavaScript, Python (2.7) e Ruby.

Mas realmente não vejo por que esses idiomas precisam de octal, especialmente quando o uso mais provável da notação é denotar um número decimal com um 0 supérfluo.

JavaScript é uma linguagem do lado do cliente, octal parece bastante inútil. Todos os três são bastante modernos em outro sentido, e eu não acho que haveria muito código usando a notação octal que seria quebrada pela remoção desse "recurso".

Então, minhas perguntas são:

  • Existe algum ponto dessas linguagens suportando literais octais?
  • Se literais octais são necessários, por que não usar algo como 0o10? Por que copiar uma notação antiga que substitui um caso de uso mais útil?

24
Você aceita "confundir os jovens durante uma entrevista" como resposta?
yannis

11
em conformidade com a sintaxe C + cego cópia
catraca aberração

1
O @Manishearth C o herdou de seus ancestrais. Java possui, porque C possui. A maioria dos outros possui, porque C e Java possuem.
Ingo

2
Ainda se vê mudanças corretas nos arquivos Unix octais: chmodcom 0666 ou 0777 para grupos de 3 bits para usuário, grupo e outros: leitura, gravação, executável.
Joop Eggen

3
@Llepwryd Em navegadores antigos, parseInt('010')realmente retornou 8, portanto, todos os conselhos para sempre usarparseInt(foo, 10) (e ainda é um hábito para mim)
Izkata

Respostas:


34

Cópia cega de C, como a catraca disse em seu comentário

A grande maioria dos "designers de linguagem" hoje em dia nunca viu nada além de C e suas cópias (C ++, Java, Javascript, PHP e provavelmente algumas dezenas de outras que eu nunca ouvi falar). Eles nunca tocaram em FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL, para citar alguns.

Uma vez, a exposição a várias linguagens de programação era OBRIGATÓRIA no currículo de ciências da computação, e isso não incluía a contagem de C, C ++ e Java como três linguagens separadas.

O Octal foi usado nos dias anteriores porque facilitava a leitura dos valores das instruções binárias. O PDP-11, por exemplo, BASICAMENTE tinha um código de operação de 4 bits, 2 números de registro de 3 bits e 2 campos de mecanismo de acesso de 3 bits. Expressar a palavra em octal tornou tudo óbvio.

Devido à associação precoce de C com o PDP-11, a notação octal foi incluída, uma vez que era muito comum nos PDP-11 na época.

Outras máquinas tinham conjuntos de instruções que não eram bem mapeados para o hex. O CDC 6600 tinha uma palavra de 60 bits, com cada palavra contendo tipicamente 2 a 4 instruções. Cada instrução foi de 15 ou 30 bits.

Quanto aos valores de leitura e gravação, esse é um problema resolvido, com uma prática recomendada do setor, pelo menos no setor de defesa. Você DOCUMENTA seus formatos de arquivo. Não há ambiguidade quando o formato é documentado, porque o documento informa se você está procurando um número decimal, um número hexadecimal ou um número octal.

Observe também: Se o seu sistema de E / S usar como padrão 0 octal, você precisará usar alguma outra convenção em sua saída para indicar valores hexadecimais. Isso não é necessariamente uma vitória.

Na minha opinião pessoal, Ada fez o melhor: 2 # 10010010 #, 8 # 222 #, 16 # 92 # e 146 todos representam o mesmo valor. (Isso provavelmente me dará pelo menos três votos negativos, apenas por mencionar Ada.)


11
Downvoted por mencionar Ada ... apenas brincadeira
kufi

12
Estou curioso para saber como você chegou à cifra de que mais de 50% dos "designers de linguagem" - por que o susto cita? - não tem experiência com nada, exceto C descendentes. Passei dezesseis anos da minha vida conversando com designers profissionais de idiomas todos os dias e nenhum deles corresponde à sua descrição.
Eric Lippert

Javascript foi descrito como "nós queremos fazer lisp no browser" para se ver seu criador interessado, se bem me lembro que a entrevista corretamente ...
Izkata

2
@ Izkata: De fato, Waldemar Horwat me disse uma vez que ele via JavaScript como essencialmente Common Lisp com uma sintaxe do tipo C. De fato, Waldemar definiu uma metalinguagem, escreveu um interpretador para sua metalinguagem no Common Lisp e, em seguida, escreveu as especificações JavaScript em sua metalinguagem, permitindo assim que ele executasse a especificação. Foi uma técnica inteligente.
Eric Lippert

Por que 0 foi usado? Não faria sentido usar um caractere não numérico? O padrão ANSI simplesmente não tinha a previsão de erros causados ​​por números que pretendiam ser a base dez?
Old Badman Gray

6

Eles obtêm do C. Por que copiar? Como a implementação básica de todos os 3 está na C. A implementação padrão do Python é CPython . Ruby foi originalmente construído em C também. Javascript é o caso mais interessante aqui. É executado no navegador. Gostaria de adivinhar em que o primeiro navegador foi escrito?

Então, por que esses três idiomas seriam implementados em C? Porque todos eles se originam em sistemas UNIX. Portanto, é um caso de convenção conduzida pelo ecossistema. O Perl também faz isso. Lua provavelmente faria se Lua usasse números inteiros em vez de duplos .

Portanto, é uma questão do meio ambiente de línguas sendo escrito em C para que elas tomem suas convenções de C. Um bom corolário de apoio é Visual quais usos básicos & O em vez. Na medida do necessário, parece mais uma abstração com vazamento que virou convenção do que qualquer outra coisa.


O Mosaic suporta JavaScript? Caso contrário, como é relevante mencioná-lo?
svick

2
@svick É a linha de base do Netscape Navigator.
World Engineer

2

Há um valor para a consistência. Se você não puder determinar com segurança como um número será traduzido, terá problemas reais usando um valor em diferentes contextos.

Isso também significa que você não precisa escrever seu próprio analisador. Há um grande valor no uso de rotinas de biblioteca bem testadas.

Além disso, se você não suporta a sintaxe 0 inicial, não tem uma maneira simples de escrever valores octais.

Embora não dependamos tanto dos números octais quanto antes, eles ainda são valiosos. Embora os mesmos resultados possam ser obtidos com números hexadecimais, em alguns contextos o octal é mais fácil de entender.

Até agora, só vi um uso para zeros à esquerda em números decimais. Isso está na exibição e entrada de campos decimais de comprimento fixo, como números de identificação. Faz anos que não vejo campos como esse com um zero à esquerda. Embora isso reduz os valores disponíveis em 10%, elimina o problema de os usuários frequentemente deixarem de lado os zeros à esquerda ao inseri-los.


3
Os campos com zeros à esquerda são cadeias de caracteres, representações visuais com significado próprio, não números.
Pieter B

1
+1 considera chmod 438 ./myfileTerrível!
Ingo

2
Por que não permitir uma 0o10sintaxe? Eu acredito que o Python suporta isso. Você sempre pode criar uma maneira simples de escrever valores octais que não tornem o número um número normal. Eu vi pessoas tentam usar zeros em código para alinhamento e manipulação fácil, e ser mordido no pé por notação octal
Manishearth

Eu posso entender o desejo de ter um meio de escrever valores octais, além de binários e hexadecimais. Também posso entender que ter um compilador interpretado 031como Halloween (31 de outubro) em vez de Natal (25 de dezembro) pode representar alguns riscos se os programadores copiarem o código escrito em uma linguagem que usa a última implementação. Não vejo nenhuma razão, no entanto, por que uma linguagem não possa alcançar o melhor dos dois mundos, suportando 0q31como notação quando octal é desejado ou 0t025para a base dez permitir valores de colagem macro com zeros à esquerda e simplesmente proibir zeros à esquerda sem especificadores de base .
supercat

@supercat O uso do 0 principal para representar a data octal remonta pelo menos à sua juventude. Os casos em que é freqüentemente usado são casos em que os bits têm significado e a interpretação do número como um número decimal está correta apenas para valores menores que 8. Adicionar caracteres adicionais (incluindo zeros à esquerda em números decimais) pode ser mais confuso do que útil . Eu certamente consultar por uma data foi escrito 012 031, 010 031, ou 012 025.
BillThor
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.