Dlaczego kursor został użyty do XOR zamiast potęgowania?

32

Nie znaczy to, że tak naprawdę jest to problem dla każdego, kto zmagał się z tym problemem składniowym, ale widzę ogromną dozę zamieszania wynikającą z użycia funkcji caret ( ^) jako operacji XOR zamiast powszechnie akceptowanej operacji matematycznego potęgowania.

Oczywiście istnieje wiele miejsc, w których (niewłaściwe) użycie karetki jest wyjaśnione i poprawione, ale nie natknąłem się na żadne ostateczne źródła wyjaśniające, dlaczego karetka ma inne znaczenie.

Czy to była kwestia wygody? Wypadek? Oczywiście uzasadnienie może być różne dla różnych języków, więc informacje pod każdym względem byłyby wnikliwe.

Qix
źródło

Odpowiedzi:

58

Chociaż byli starsi prekursorzy, wpływowy francuski matematyk Rene Descartes zwykle przypisuje się wprowadzenie do pisma matematycznego wykładników ( b ) w swojej pracy Geometrie, która została opublikowana w 1637 roku. Jest to notacja powszechnie stosowana obecnie w matematyce.

Fortran jest najstarszym językiem programowania szeroko stosowanym do obliczeń numerycznych, który zapewnia operator potęgowania, pochodzi z 1954 r. Operacja potęgowania jest oznaczona podwójną gwiazdką **. Należy zauważyć, że wiele komputerów w tym czasie stosowało 6-bitowe kodowanie znaków, które nie zapewniało znaku karetki ^. Użycie **zostało następnie przyjęte przez twórców różnych nowszych języków programowania, które oferują operację potęgowania, takich jak Python.

Pierwszym szeroko przyjętym zestawem znaków, który zawierał kursor, ^było 7-bitowe kodowanie ASCII, które zostało po raz pierwszy znormalizowane w 1963 roku. Najstarszy znany mi język programowania, który używał karetki do oznaczania potęgowania, to BASIC, który pochodzi z 1964 roku. czas IBM przyjął kodowanie znaków EBCDIC , które obejmuje również znak karetki ^.

Język C powstał w 1972 roku. Nie zapewnia on operatora potęgowania, a raczej obsługuje potęgowanie za pomocą funkcji bibliotecznych, takich jak pow(). Dlatego nie trzeba odkładać symbolu na potęgowanie w C i innych późniejszych językach z rodziny C, takich jak C ++ i CUDA.

Z drugiej strony, co do tej pory było rzadkie w przypadku języków programowania, C udostępnia symbole operacji bitowych. Liczba znaków specjalnych dostępnych w 7-bitowym ASCII była ograniczona, a ponieważ istniało „naturalne powinowactwo” innych operacji do niektórych znaków specjalnych, np. &Dla AND i ~NOT, nie było zbyt wielu wyborów dla symbolu XOR .

Nie jestem świadomy opublikowanego uzasadnienia przedstawionego przez Ritchie lub Kernighana, dlaczego zdecydowali się ^na oznaczenie XOR; Krótka historia C autorstwa Ritchie milczy na ten temat. Spojrzenie na specyfikacji prekursorem C, język B , pokazuje, że nie ma operatora XOR, ale już wykorzystane wszystkie znaki specjalne inne niż ^, $, @, #.

[Aktualizacja] Wysłałem e-mail do Kena Thompsona, twórcy B i jednego ze współtwórców C, z pytaniem o uzasadnienie wyboru ^jako operatora XOR C i prosząc o zgodę na udostępnienie tutaj odpowiedzi. Jego odpowiedź (nieco przeformatowana pod kątem czytelności):

Od: Ken Thompson
Wysłano: czwartek, 29 września 2016
04:50 Do: Norbert Juffa
Temat: Re: Uzasadnienie wyboru karetki jako operatora XOR w C?

był to losowy wybór pozostawionych postaci.

gdybym miał to zrobić jeszcze raz (co zrobiłem), użyłbym tego samego operatora dla xor (^) i bitowego uzupełnienia (~).

ponieważ ^ jest teraz bardziej znanym operatorem, w go ^ oznacza xor i również uzupełnia.

Zastosowanie ^do potęgowania w „matematyce”, o której mówisz, jest w rzeczywistości ustalone w znacznie późniejszym terminie dla systemów składu, takich jak Teuth Knutha z 1978 r., Interfejsy wiersza poleceń dla systemów algebry, takich jak Mathematica z 1988 r., Oraz wykresy kalkulatory na początku lat 90.

Dlaczego te produkty przyjęły użycie ^do potęgowania? W przypadku kalkulatorów podejrzewam wpływ BASIC. W latach 80. był to bardzo popularny pierwszy język programowania, a także był wbudowany w inne oprogramowanie. Zapis ten byłby zatem znany wielu nabywcom kalkulatorów. Moja pamięć jest niejasna, ale wierzę, że istniały nawet kalkulatory, które faktycznie obsługiwały proste interpretatory BASIC.

njuffa
źródło
4
To dobra lekcja historii. Tak więc prawdziwe pytanie brzmiałoby: „Dlaczego oprogramowanie Tex (i inne z tamtego okresu) zdecydowało się użyć symbolu XOR ma wykładniczy charakter?” ;)
AxelH
5
@AxelH W rzeczywistości tak nie jest. TeX używa ^dla indeksu górnego . I ma dla mnie sens użycie znaku „góra” dla indeksu górnego i znaku „down” ( _) dla indeksu dolnego.
svick,
2
@AxelH Zgadzam się z Svickiem, że ^sugeruje strzałkę w górę, która z kolei wskazuje na tradycyjną pozycję wykładnika z indeksu górnego, więc jest to trochę naturalne dopasowanie. Jestem pewien, że Donald Knuth odpowiedziałby na wiadomość e-mail z pytaniem o jego decyzję o zastosowaniu ^do potęgowania w TeXie, ale biorąc pod uwagę, że jest zajęty pracą nad ważniejszymi rzeczami, takimi jak ukończenie TAOCP, nie chciałem robić tego kroku (rozważałem to).
njuffa,
7
Według en.wikipedia.org/wiki/Caret Algol 60 użył strzałki skierowanej w górę do potęgowania i zauważa, że ​​pierwotnie ASCII również miała strzałkę w górę w tym samym punkcie kodu, w którym obecnie ma symbol karetki, więc oba były wyraźnie zrównane ze sobą w tym samym czasie.
Periata Breatta
4
Naprawdę miła historyczna odpowiedź. Chciałbym tylko dodać prawdopodobny powód implementacji operatorów bitowych C zamiast potęgowania: celem C jest język niskiego poziomu, który umożliwia programistom łatwy dostęp do dużej części rzeczy, które procesory natywnie obsługują. A procesory zawsze dostarczają instrukcje manipulacji bitami, ale nie znam jednego procesora, który ma specjalne instrukcje potęgowania. Jako takie, potęgowanie zawsze wymaga pętli (przynajmniej z arytmetyką liczb całkowitych), aw C nie ma żadnej cechy, która ukrywałaby pętlę za konstrukcją języka.
cmaster