Perché il cursore è stato usato per XOR invece di esponenziazione?


32

Non che sia davvero un problema per chiunque abbia affrontato questo problema sintattico prima, ma vedo una grande quantità di confusione derivante dall'uso del caret ( ^) come l'operazione XOR al posto dell'operazione di esponenziazione matematica ampiamente accettata.

Ovviamente ci sono molti posti in cui viene spiegato e corretto l'uso (improprio) del punto di inserimento, ma non ho trovato alcuna fonte definitiva sul perché al punto di inserimento sia stato assegnato un significato diverso.

È stata una questione di convenienza? Un incidente? Ovviamente il ragionamento potrebbe essere diverso per le varie lingue, quindi le informazioni sotto ogni aspetto sarebbero perspicaci.


Risposte:


58

Sebbene esistessero precursori più anziani, all'influente matematico francese René Descartes viene generalmente attribuita l' introduzione di esponenti supercritti (a b ) nella scrittura matematica, nel suo lavoro Geometrie, pubblicato nel 1637. Questa è la notazione ancora oggi universalmente usata in matematica.

Fortran è il più antico linguaggio di programmazione ampiamente utilizzato per i calcoli numerici che fornisce un operatore di esponenziazione, risale al 1954. L'operazione di esponenziazione è indicata da un doppio asterisco **. Va notato che molti computer in quel momento utilizzavano codifiche di caratteri a 6 bit che non fornivano un carattere di inserimento ^. L'uso di è **stato successivamente adottato dai creatori di vari linguaggi di programmazione più recenti che offrono un'operazione di esponenziazione, come Python.

Il primo set di caratteri ampiamente adottato che conteneva il punto di inserimento ^era la codifica ASCII a 7 bit che fu standardizzata per la prima volta nel 1963. Il linguaggio di programmazione più antico di cui sono a conoscenza che utilizzava il punto di inserimento per indicare l'espiazione è BASIC, che risale al 1964. Circa lo stesso quando IBM ha adottato la codifica dei caratteri EBCDIC , che include anche il punto di inserimento ^.

Il linguaggio C è nato nel 1972. Non fornisce un operatore di esponenziazione, ma supporta l'espiazione tramite funzioni di libreria come pow(). Pertanto, nessun simbolo deve essere messo da parte per l'espiazione in C e in altre lingue successive della famiglia C, come C ++ e CUDA.

D'altra parte, e non comune per i linguaggi di programmazione fino a quel momento, C fornisce simboli per operazioni bit a bit. Il numero di caratteri speciali disponibili in ASCII a 7 bit era limitato e, poiché vi era una "affinità naturale" di altre operazioni con determinati caratteri speciali, ad esempio &per AND e ~per NOT, non c'erano così tante scelte per il simbolo per XOR .

Non sono a conoscenza di una logica pubblicata fornita da Ritchie o Kernighan sul motivo per cui hanno scelto ^di indicare specificamente XOR; La breve storia di C di Ritchie tace su questo tema. Uno sguardo al disciplinare della precursore di C, il linguaggio B , rivela che non aveva un operatore XOR, ma già utilizzato tutti i caratteri speciali diversi da quelli ^, $, @, #.

[Aggiornamento] Ho inviato un'e-mail a Ken Thompson, creatore di B e uno dei co-creatori di C, chiedendo la logica per la scelta ^come operatore XOR di C e chiedendo il permesso di condividere la risposta qui. La sua risposta (leggermente riformattata per leggibilità):

Da: Ken Thompson
Inviato: giovedì 29 settembre 2016 4:50
A: Norbert Juffa
Oggetto: Re: Ragioni alla base della scelta del personale come operatore XOR in C?

è stata una scelta casuale dei personaggi rimasti.

se dovessi farlo di nuovo (cosa che ho fatto) avrei usato lo stesso operatore per xor (^) e il complemento di bit (~).

poiché ^ è ora l'operatore più noto, in go ^ è xor e anche complemento.

L'uso di ^esponenziazione in "matematica" a cui si fa riferimento è in realtà un uso stabilito in un momento molto più tardi per sistemi di composizione come TeX di Knuth che risale al 1978, interfacce a riga di comando per sistemi algebrici come Mathematica che risale al 1988 e grafica calcolatrici nei primi anni '90.

Perché questi prodotti hanno adottato l'uso di ^esponenziazione? Nel caso dei calcolatori sospetto l'influenza di BASIC. Durante gli anni '80 è stato un primo linguaggio di programmazione molto popolare ed è stato incorporato anche in altri prodotti software. La notazione quindi sarebbe stata familiare a molti acquirenti dei calcolatori. La mia memoria è vaga, ma credo che ci fossero persino calcolatori che eseguivano in realtà semplici interpreti BASIC.


4
Questa è una bella lezione di storia. Quindi la vera domanda sarebbe: "Perché il software Tex (e altri di quel periodo) avrebbe deciso di usare il simbolo XOR ha esponenziale?" ;)
AxelH,

5
@AxelH In realtà, non lo è. TeX utilizza ^per apice . E per me ha senso usare un carattere "su" per apice e un carattere "giù" ( _) per pedice.
svick,

2
@AxelH Sono d'accordo con svick che ^suggerisce una freccia in su, che a sua volta suggerisce la posizione tradizionale di un esponente superscriptato, quindi è un po 'naturale. Sono sicuro che Donald Knuth avrebbe risposto a un'e-mail in cui chiedeva informazioni sulla sua decisione di utilizzare ^per l'espiazione in TeX, ma dato che è impegnato a lavorare su cose più importanti, come il completamento di TAOCP, non volevo fare questo passo (ho considerato esso).
njuffa,

7
Secondo en.wikipedia.org/wiki/Caret , Algol 60 ha usato una freccia rivolta verso l'alto per esponenziazione, e osserva che in origine ASCII aveva anche una freccia su nello stesso punto di codice in cui al momento ha il simbolo del cursore, quindi i due erano chiaramente equiparati tra loro nello stesso momento.
Periata Breatta,

4
Risposta storica davvero bella. Vorrei solo aggiungere una probabile ragione per l'implementazione di bit operatori C invece di una esponenziazione: l'obiettivo di C è quello di essere un linguaggio di basso livello che consenta al programmatore un facile accesso a gran parte delle cose che le CPU supportano in modo nativo. E le CPU forniscono sempre istruzioni di manipolazione dei bit, ma non conosco una singola CPU che abbia istruzioni speciali per l'espiazione. Come tale, l'esponenziazione richiede sempre un ciclo (almeno con l'aritmetica dei numeri interi) e non esiste una singola caratteristica in C che nasconda un ciclo dietro un costrutto di linguaggio.
cmaster
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.