Por que o acento circunflexo foi usado para XOR em vez de exponenciação?

32

Não que isso seja realmente um problema para quem já enfrentou esse problema sintático antes, mas vejo uma grande quantidade de confusão decorrente do uso do sinal de intercalação ( ^) como a operação XOR em vez da operação de exponenciação matemática amplamente aceita.

É claro que existem muitos lugares em que o uso incorreto do cursor é explicado e corrigido, mas não encontrei nenhuma fonte definitiva sobre o motivo pelo qual o cursor recebeu um significado diferente.

Era uma questão de conveniência? Um acidente? Obviamente, o raciocínio poderia ser diferente para os vários idiomas; portanto, as informações, sob qualquer aspecto, seriam esclarecedoras.

Qix
fonte

Respostas:

58

Embora houvesse precursores mais antigos, o influente matemático francês Rene Descartes é geralmente creditado por introduzir expoentes sobrescritos (a b ) na escrita matemática, em seu trabalho Geometrie, publicado em 1637. Essa é a notação ainda hoje usada universalmente na matemática.

O Fortran é a linguagem de programação mais antiga amplamente usada para cálculos numéricos que fornece um operador de exponenciação, datada de 1954. A operação de exponenciação é indicada por um asterisco duplo **. Deve-se observar que muitos computadores da época usavam codificações de caracteres de 6 bits que não forneciam um caractere de interpolação ^. O uso de **foi posteriormente adotado pelos criadores de várias linguagens de programação mais recentes que oferecem uma operação de exponenciação, como o Python.

O primeiro conjunto de caracteres amplamente adotado que continha o sinal de intercalação ^foi a codificação ASCII de 7 bits, padronizada pela primeira vez em 1963. A linguagem de programação mais antiga que eu conheço que usou o sinal de intercalação para indicar exponenciação é BASIC, que data de 1964. Em torno da mesma vez que a IBM adotou a codificação de caracteres EBCDIC , que também inclui o sinal de intercalação ^.

A linguagem C surgiu em 1972. Ela não fornece um operador de exponenciação, mas suporta a exponenciação por meio de funções de biblioteca como pow(). Portanto, nenhum símbolo precisa ser reservado para exponenciação em C e em outros idiomas posteriores da família C, como C ++ e CUDA.

Por outro lado, e incomum para linguagens de programação até aquele momento, C fornece símbolos para operações bit a bit. O número de caracteres especiais disponíveis no ASCII de 7 bits era limitado e, como havia uma "afinidade natural" de outras operações com certos caracteres especiais, por exemplo, &para AND e ~para NOT, não havia muitas opções para o símbolo para XOR .

Não conheço uma justificativa publicada fornecida por Ritchie ou Kernighan sobre o motivo pelo qual eles escolheram ^denotar XOR especificamente; O breve histórico de C de Ritchie é silencioso sobre esse assunto. Um olhar sobre a especificação para o precursor C, a linguagem B , revela que ele não tinha um operador XOR, mas já usou todos os caracteres especiais que não ^, $, @, #.

[Atualização] Enviei email para Ken Thompson, criador de B e um dos co-criadores de C, perguntando sobre a justificativa para a escolha ^como operador XOR de C e pedindo permissão para compartilhar a resposta aqui. Sua resposta (ligeiramente reformatada para facilitar a leitura):

De: Ken Thompson
Enviado: quinta-feira, 29 de setembro de 2016
04:50 Para: Norbert Juffa
Assunto: Re: Fundamentação da escolha do sinal de intercalação como operador de XOR em C?

foi uma escolha aleatória dos caracteres restantes.

se eu tivesse que fazer novamente (o que fiz), usaria o mesmo operador para xor (^) e complemento de bits (~).

como ^ agora é o operador mais conhecido, ^ é xor e também complementa.

O uso de ^exponenciação em "matemática" a que você se refere é, na verdade, o uso estabelecido em uma data muito posterior para sistemas de tipografia como o TeX de Knuth, que data de 1978, interfaces de linha de comando para sistemas de álgebra como Mathematica, que data de 1988, e gráficos calculadoras no início dos anos 90.

Por que esses produtos adotaram o uso de ^exponenciação? No caso de calculadoras, suspeito da influência do BASIC. Ao longo dos anos 80, foi uma primeira linguagem de programação muito popular e também foi incorporada a outros produtos de software. A notação, portanto, teria sido familiar para muitos compradores das calculadoras. Minha memória é vaga, mas acredito que havia até calculadoras que realmente executavam intérpretes BASIC simples.

njuffa
fonte
4
Essa é uma boa lição de história. Portanto, a verdadeira pergunta seria "Por que o software de Tex (e outro daquele período) decidiu usar o símbolo XOR tem exponencial?" ;)
AxelH 19/09/16
5
@AxelH Na verdade, não. TeX usa ^para sobrescrito . E faz sentido para mim usar um caractere "para cima" para sobrescrito e um caractere "para baixo" ( _) para subscrito.
svick
2
@AxelH Eu concordo com svick que o ^sugere uma seta para cima, que por sua vez sugere a posição tradicional de um expoente sobrescrito, por isso é um pouco natural. Tenho certeza de que Donald Knuth responderia a um e-mail perguntando sobre sua decisão de usar ^para exponenciação no TeX, mas, como ele está ocupado trabalhando em coisas mais importantes, como a conclusão do TAOCP, não quis dar esse passo (considerei isto).
Njuffa
7
De acordo com en.wikipedia.org/wiki/Caret , o Algol 60 usou uma seta apontando para cima para exponenciação, e observa que originalmente o ASCII também tinha uma seta para cima no mesmo ponto de código em que atualmente possui o símbolo de sinal de intercalação, então os dois estavam claramente igualaram-se ao mesmo tempo.
Periata Breatta
4
Resposta histórica realmente agradável. Gostaria apenas de acrescentar um motivo provável para a implementação de operadores de bits por C em vez de uma exponenciação: O objetivo de C é ser uma linguagem de baixo nível que permita ao programador acesso fácil a grande parte das coisas que as CPUs suportam nativamente. E as CPUs sempre fornecem instruções de manipulação de bits, mas não conheço uma única CPU que tenha instruções especiais para exponenciação. Como tal, a exponenciação sempre exige um loop (pelo menos com aritmética inteira), e não há um único recurso em C que oculte um loop atrás de uma construção de linguagem.
precisa saber é