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?
javascript
python
ruby
octal
Manishearth
fonte
fonte
chmod
com 0666 ou 0777 para grupos de 3 bits para usuário, grupo e outros: leitura, gravação, executável.parseInt('010')
realmente retornou 8, portanto, todos os conselhos para sempre usarparseInt(foo, 10)
(e ainda é um hábito para mim)Respostas:
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.)
fonte
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.
fonte
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.
fonte
chmod 438 ./myfile
Terrível!0o10
sintaxe? 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 octal031
como 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, suportando0q31
como notação quando octal é desejado ou0t025
para a base dez permitir valores de colagem macro com zeros à esquerda e simplesmente proibir zeros à esquerda sem especificadores de base .