Pourquoi le signe d'insertion a-t-il été utilisé pour XOR au lieu d'exponentiation?


32

Ce n'est pas vraiment un problème pour quiconque a déjà fait face à ce problème syntaxique, mais je vois une énorme confusion dériver de l'utilisation de caret ( ^) comme opération XOR au lieu de l'opération d'exponentiation mathématique largement acceptée.

Bien sûr, il y a beaucoup d'endroits où la (mauvaise) utilisation du curseur est expliquée et corrigée, mais je n'ai trouvé aucune source définitive pour expliquer pourquoi le curseur a reçu une signification différente.

Était-ce une question de commodité? Un accident? De toute évidence, le raisonnement pourrait être différent pour les différentes langues, de sorte que les informations à tous égards seraient pertinentes.


Réponses:


58

Bien qu'il y ait des précurseurs plus anciens, le mathématicien français influent René Descartes est généralement reconnu pour avoir introduit des exposants exposants (a b ) dans l'écriture mathématique, dans son travail Geometrie qui a été publié en 1637. C'est la notation encore universellement utilisée en mathématiques aujourd'hui.

Fortran est le plus ancien langage de programmation largement utilisé pour les calculs numériques qui fournit un opérateur d'exponentiation, il date de 1954. L'opération d'exponentiation est indiquée par un double astérisque **. Il convient de noter que de nombreux ordinateurs à l'époque utilisaient des codages de caractères 6 bits qui ne fournissaient pas de caractère caret ^. L'utilisation de **a ensuite été adoptée par les créateurs de divers langages de programmation plus récents qui offrent une opération d'exponentiation, comme Python.

Le premier jeu de caractères largement adopté qui contenait le curseur ^était le codage ASCII 7 bits qui a été normalisé pour la première fois en 1963. Le langage de programmation le plus ancien que je connaisse qui utilisait le curseur pour désigner l'exponentiation est BASIC, qui date de 1964. Autour de la même IBM a adopté le codage de caractères EBCDIC , qui inclut également le signe d'insertion ^.

Le langage C a vu le jour en 1972. Il ne fournit pas d'opérateur d'exponentiation, il prend plutôt en charge l'exponentiation via des fonctions de bibliothèque telles que pow(). Par conséquent, aucun symbole ne doit être mis de côté pour l'exponentiation en C et dans d'autres langages de la famille C, tels que C ++ et CUDA.

D'un autre côté, et peu courant pour les langages de programmation jusque-là, C fournit des symboles pour les opérations au niveau du bit. Le nombre de caractères spéciaux disponibles en ASCII 7 bits était limité, et comme il y avait une "affinité naturelle" d'autres opérations avec certains caractères spéciaux, par exemple &pour ET et ~pour NON, il n'y avait pas beaucoup de choix pour le symbole pour XOR .

Je ne suis pas au courant d'une justification publiée fournie par Ritchie ou Kernighan pour expliquer pourquoi ils ont choisi ^de désigner XOR spécifiquement; La courte histoire de C de Ritchie est muette sur cette question. Un regard sur la spécification du précurseur C, la langue B , révèle qu'il n'a pas un opérateur XOR, mais déjà utilisé tous les caractères spéciaux autres que ^, $, @, #.

[Mise à jour] J'ai envoyé un e-mail à Ken Thompson, créateur de B et l'un des co-créateurs de C, me renseignant sur la raison du choix ^de l'opérateur XOR de C et demandant la permission de partager la réponse ici. Sa réponse (légèrement reformatée pour plus de lisibilité):

De: Ken Thompson
Envoyé: jeudi 29 septembre 2016 04:50
À: Norbert Juffa
Objet: Objet: Justification du choix du curseur comme opérateur XOR en C?

c'était un choix aléatoire des caractères restants.

si je devais recommencer (ce que j'ai fait) j'utiliserais le même opérateur pour xor (^) et complément de bits (~).

puisque ^ est maintenant l'opérateur le plus connu, dans go, ^ est xor et également complémentaire.

L'utilisation de l' ^exponentiation en "mathématiques" à laquelle vous vous référez est en fait une utilisation établie à une date beaucoup plus tardive pour les systèmes de composition tels que Knuth's TeX qui date de 1978, les interfaces de ligne de commande pour les systèmes d'algèbre tels que Mathematica qui date de 1988 et la représentation graphique. calculatrices au début des années 90.

Pourquoi ces produits ont-ils adopté l'utilisation de l' ^exponentiation? Dans le cas des calculatrices, je soupçonne l'influence de BASIC. Tout au long des années 80, il a été un premier langage de programmation très populaire et a également été intégré à d'autres produits logiciels. La notation aurait donc été familière à de nombreux acheteurs de calculatrices. Ma mémoire est vague, mais je pense qu'il y avait même des calculatrices qui exécutaient en fait de simples interprètes BASIC.


4
Voilà une belle leçon d'histoire. La vraie question serait donc: "Pourquoi le logiciel de Tex (et d'autres de cette période) aurait-il décidé d'utiliser le symbole XOR a une exponentielle?" ;)
AxelH

5
@AxelH En fait, ce n'est pas le cas. TeX utilise ^pour l' exposant . Et il est logique pour moi d'utiliser un caractère "haut" pour l'exposant et un caractère "bas" ( _) pour l'indice.
svick

2
@AxelH Je suis d'accord avec svick que le ^suggère une flèche vers le haut, qui à son tour fait allusion à la position traditionnelle d'un exposant en exposant, c'est donc un peu un ajustement naturel. Je suis sûr que Donald Knuth répondrait à un e-mail demandant sa décision d'utiliser ^pour l'exponentiation dans TeX, mais étant donné qu'il est occupé à travailler sur des choses plus importantes, telles que l'achèvement du TAOCP, je ne voulais pas prendre cette mesure (j'ai envisagé il).
njuffa

7
Selon en.wikipedia.org/wiki/Caret , Algol 60 a utilisé une flèche pointant vers le haut pour l'exponentiation, et note qu'à l'origine ASCII avait également une flèche vers le haut au même point de code où il a actuellement le symbole caret, donc les deux étaient clairement assimilés les uns aux autres à la même époque.
Periata Breatta

4
Réponse historique vraiment sympa. Je voudrais juste ajouter une raison probable pour l'implémentation d'opérateurs de bits C au lieu d'une exponentiation: le but de C est d'être un langage de bas niveau qui permet au programmeur d'accéder facilement à une grande partie des choses que les CPU supportent nativement. Et les CPU fournissent toujours des instructions de manipulation de bits, mais je ne connais pas de CPU unique qui ait des instructions spéciales pour l'exponentiation. En tant que telle, l'exponentiation nécessite toujours une boucle (au moins avec l'arithmétique entière), et il n'y a pas une seule fonctionnalité en C qui cache une boucle derrière une construction de langage.
cmaster
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.