Pourquoi tant de langues traitent-elles les nombres commençant par 0 comme octaux?

22

J'ai lu Où sont les octales utiles? et il semble que les octales soient quelque chose qui étaient autrefois utiles.

De nombreux langages traitent les nombres précédés d'un 0 comme octaux, donc le littéral 010est en fait 8. Quelques-uns d'entre eux sont JavaScript, Python (2.7) et Ruby.

Mais je ne vois pas vraiment pourquoi ces langues ont besoin d'octal, surtout lorsque l'utilisation la plus probable de la notation est de désigner un nombre décimal avec un 0 superflu.

JavaScript est un langage côté client, octal semble assez inutile. Tous les trois sont assez modernes dans un autre sens, et je ne pense pas qu'il y aurait beaucoup de code utilisant la notation octale qui serait rompu en supprimant cette "fonctionnalité".

Donc, mes questions sont:

  • Est-il utile que ces langages prennent en charge les littéraux octaux?
  • Si des littéraux octaux sont nécessaires, pourquoi ne pas utiliser quelque chose comme 0o10? Pourquoi copier une ancienne notation qui remplace un cas d'utilisation plus utile?
Manishearth
la source
24
Accepterez-vous "de confondre les jeunes lors d'un entretien" comme réponse?
yannis
11
conforme à la syntaxe C + copie aveugle
ratchet freak
1
@Manishearth C l'a hérité de ses ancêtres. Java l'a, parce que C l'a. La plupart des autres l'ont, car C et Java l'ont.
Ingo
2
On voit encore des changements de fichiers octaux Unix à droite: chmodavec 0666 ou 0777 pour des groupes de 3 bits pour l'utilisateur, le groupe et autres: lecture, écriture, exécutable.
Joop Eggen
3
@Llepwryd Dans les navigateurs plus anciens, parseInt('010')a en effet renvoyé 8, d'où tous les conseils à toujours utiliser parseInt(foo, 10)(et c'est toujours une habitude pour moi)
Izkata

Réponses:

34

Copie aveugle de C, comme l'a dit un monstre à cliquet dans son commentaire

La grande majorité des "concepteurs de langage" de nos jours n'ont jamais rien vu d'autre que C et ses copies (C ++, Java, Javascript, PHP, et probablement quelques dizaines d'autres dont je n'ai jamais entendu parler). Ils n'ont jamais touché FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL, pour n'en nommer que quelques-uns.

Il était une fois, l'exposition à plusieurs langages de programmation était OBLIGATOIRE dans le programme d'informatique, et cela n'incluait pas le comptage de C, C ++ et Java comme trois langages distincts.

Octal était utilisé dans les premiers jours car il facilitait la lecture des valeurs des instructions binaires. Le PDP-11, par exemple, BASICALLY avait un opcode 4 bits, 2 numéros de registre 3 bits et 2 champs de mécanisme d'accès 3 bits. Exprimer le mot en octal rendait tout évident.

En raison de l'association précoce de C avec le PDP-11, la notation octale a été incluse, car elle était très courante sur les PDP-11 à l'époque.

D'autres machines avaient des jeux d'instructions qui ne correspondaient pas bien à l'hex. Le CDC 6600 avait un mot de 60 bits, chaque mot contenant généralement 2 à 4 instructions. Chaque instruction était de 15 ou 30 bits.

Quant à la lecture et à l'écriture de valeurs, il s'agit d'un problème résolu, avec une bonne pratique bien connue de l'industrie, du moins dans l'industrie de la défense. Vous DOCUMENTER vos formats de fichiers. Il n'y a aucune ambiguïté lorsque le format est documenté, car le document VOUS INDIQUE si vous regardez un nombre décimal, un nombre hexadécimal ou un nombre octal.

Notez également: si votre système d'E / S par défaut est à 0, ce qui signifie octal, vous devez utiliser une autre convention sur votre sortie pour indiquer les valeurs hexadécimales. Ce n'est pas nécessairement une victoire.

À mon avis, Ada a fait mieux: 2 # 10010010 #, 8 # 222 #, 16 # 92 # et 146 représentent tous la même valeur. (Cela me donnera probablement au moins trois votes négatifs, juste pour mentionner Ada.)

John R. Strohm
la source
11
Vous a voté contre pour avoir mentionné Ada ... je plaisante
kufi
12
Je suis curieux de savoir comment vous êtes arrivé au chiffre selon lequel plus de 50% des "concepteurs linguistiques" - pourquoi les citations effrayantes? - n'ont aucune expérience avec quoi que ce soit, sauf les descendants C. J'ai passé seize bonnes années de ma vie à parler avec des concepteurs de langues professionnels tous les jours et aucun d'entre eux ne correspond à votre description.
Eric Lippert
Javascript a été décrit comme "nous voulons faire du lisp dans le navigateur" pour intéresser son concepteur, si je me souviens bien de cette interview ...
Izkata
2
@Izkata: En effet, Waldemar Horwat m'a dit une fois qu'il considérait JavaScript comme essentiellement du Common Lisp avec une syntaxe de type C. En fait, Waldemar a défini un métalangage, a écrit un interprète pour son métalangage en Common Lisp, puis a écrit la spécification JavaScript dans son métalangage, lui permettant ainsi d' exécuter la spécification. C'était une technique intelligente.
Eric Lippert
Pourquoi 0 a-t-il été utilisé? Ne serait-il pas logique d'utiliser un caractère non numérique? La norme ANSI n'avait-elle tout simplement pas la prévoyance des bogues provoqués par des nombres destinés à être de base dix?
Old Badman Gray
6

Ils l'obtiennent de C. Pourquoi copier? Parce que l'implémentation de base des 3 est en C. L'implémentation par défaut de Python est CPython . Ruby a été construit en C ainsi. Javascript est le cas le plus intéressant ici. Il est exécuté dans le navigateur. Vous voulez deviner dans quoi le premier navigateur Web a été écrit?

Alors pourquoi ces trois langages seraient-ils implémentés en C? Parce qu'ils proviennent tous de systèmes UNIX. C'est donc un cas de convention dictée par l'écosystème. Perl le fait aussi. Lua le ferait probablement si Lua utilisait des entiers plutôt que des doubles .

Il est donc une question de l'environnement de ces langues étant écrit en C afin qu'ils prennent leurs conventions de C. Un bon corollaire est le soutien Visual Basic qui utilisations et O au lieu. En ce qui concerne le besoin, il semble être plus une convention transformée par abstraction qui fuit qu'autre chose.

Ingénieur du monde
la source
Mosaic a-t-il pris en charge JavaScript? Sinon, comment le mentionner est-il pertinent?
svick
2
@svick C'est la base de référence de Netscape Navigator qui l'a fait.
World Engineer
2

La cohérence a une valeur. Si vous ne pouvez pas déterminer de manière fiable comment un nombre va être traduit, vous aurez de réels problèmes à utiliser une valeur dans différents contextes.

Cela signifie également que vous n'avez pas à écrire votre propre analyseur. Il est très utile d'utiliser des routines de bibliothèque bien testées.

De plus, si vous ne supportez pas la syntaxe 0 principale, vous n'avez pas un moyen simple d'écrire des valeurs octales.

Bien que nous ne dépendions pas autant des nombres octaux que par le passé, ils ont toujours de la valeur. Alors que les mêmes résultats peuvent être obtenus avec des nombres hexadécimaux, dans certains contextes, l'octal est plus facile à comprendre.

Jusqu'à présent, je n'ai vu qu'une seule utilisation pour les zéros de tête en nombres décimaux. C'est dans l'affichage et la saisie de champs décimaux de longueur fixe comme les numéros d'identification. Cela fait des années que je n'ai pas vu de tels champs avec un zéro en tête. Bien que cela réduise les valeurs disponibles de 10%, cela élimine le problème que les utilisateurs oublient souvent les zéros de tête lorsqu'ils les saisissent.

BillThor
la source
3
Les champs avec des zéros en tête sont des chaînes, des représentations visuelles avec leur propre signification, pas des nombres.
Pieter B
1
+1 considère chmod 438 ./myfileTerrible!
Ingo
2
Pourquoi ne pas autoriser une 0o10syntaxe? Je pense que Python le supporte. Vous pouvez toujours créer un moyen simple d'écrire des valeurs octales qui ne fait plus du nombre un nombre normal. J'ai vu des gens essayer d'utiliser des zéros de fin dans le code pour l'alignement et la manipulation facile, et se faire mordre dans le pied par la notation octale
Manishearth
Je peux comprendre le désir d'avoir un moyen d'écrire des valeurs octales, en plus du binaire et de l'hex. Je peux également comprendre qu'avoir un compilateur interprète 031comme Halloween (31 octobre) plutôt que Noël (25 décembre) pourrait poser certains risques si les programmeurs copient dans du code écrit dans un langage qui utilise cette dernière implémentation. Cependant, je ne vois aucune raison pour laquelle un langage ne pourrait pas atteindre le meilleur des deux mondes en prenant en charge 0q31la notation lorsqu'un octal est souhaité, ou 0t025pour la base-dix pour permettre le macro-collage de valeurs avec des zéros de tête, et tout simplement interdire les zéros de tête sans spécificateurs de base .
supercat
@supercat L'utilisation du 0 de tête pour représenter les dates octales remonte au moins à votre jeunesse. Les cas où il est fréquemment utilisé sont des cas où les bits ont une signification, et l'interprétation du nombre comme un nombre décimal n'est correcte que pour les valeurs inférieures à 8. L'ajout de caractères supplémentaires (y compris les zéros au début des nombres décimaux) peut être plus déroutant qu'utile. . Je me demanderais certainement pourquoi une date a été écrite 012 031, 010 031 ou 012 025.
BillThor