Чому карету використовували для XOR замість експоненції?


32

Не те, що це справді проблема для тих, хто раніше стикався з цим синтаксичним питанням, але я бачу дику кількість плутанини, що випливає з використання каретки ( ^) як операції XOR замість широко прийнятої математичної операції експоненції.

Звичайно, є багато місць, де (неправильне) використання каретки пояснюється та виправляється, але я не стикався з жодними остаточними джерелами того, чому кареті було надано інше значення.

Це було питанням зручності? Аварія? Очевидно, міркування можуть бути різними для різних мов, тому інформація в будь-якому відношенні була б проникливою.


Відповіді:


58

Хоча були і старші попередники, впливовий французький математик Рене Декарт, як правило, приписується за введення в математичну писемність надписаних експонентів ( b ), у своїй праці " Геометрія", яка була опублікована в 1637 р. Це позначення, яке досі широко використовується в математиці.

Fortran - найдавніша мова програмування, широко використовується для чисельних обчислень, що забезпечує оператор експоненції, вона датується 1954 р. Операція експоненції позначається подвійною зірочкою **. Слід зазначити, що багато комп'ютерів у той час використовували 6-бітні кодування символів, які не надавали символу карети ^. Згодом використання **було прийнято творцями різних останніх мов програмування, які пропонують операцію експоненції, наприклад, Python.

Першим широко прийнятим набором символів, який містив карету, ^було 7-бітове кодування ASCII, яке було вперше стандартизовано в 1963 році. Найдавнішою мовою програмування, яку я знаю, що використовувала карету для позначення експоненції, це BASIC, який датується 1964 р. Приблизно той самий Час IBM прийняла кодування символів EBCDIC , що також включає карету ^.

Мова С з'явилася на світ у 1972 році. Вона не забезпечує оператора експоненції, скоріше підтримує експоненцію через функції бібліотеки, такі як pow(). Тому жодного символу не потрібно відкладати для експоненції на C та інших, пізніших, мовах у сімействі C, таких як C ++ та CUDA.

З іншого боку, і нечасто для мов програмування до цього часу, C надає символи для побітових операцій. Кількість спеціальних символів, доступних у 7-розрядному ASCII, була обмежена, а оскільки існувала "природна спорідненість" інших операцій з певними спеціальними символами, наприклад, &для AND і ~NOT, для XOR було не так багато варіантів вибору символу .

Я не знаю опублікованого обґрунтування, наданого Річі або Керніган щодо того, чому вони вирішили ^позначати XOR конкретно; Коротка історія С Рітчі про це мовчить. Подивіться на специфікації попередника С, мови B , показує , що у нього не було оператора XOR, але вже використовували всі спеціальні символи , крім ^, $, @, #.

[Оновлення] Я надіслав електронний лист Кену Томпсону, творцю компанії B та одному з співавторів C, розпитуючи про обґрунтування вибору ^оператора XOR C, і просив дозволу поділитися відповіддю тут. Його відповідь (трохи переформатована для читання):

Від: Кен Томпсон
Надіслано: четвер, 29 вересня 2016 р. 4:50
до: Норберт Юффа
Тема: Re: Обґрунтування вибору карети як оператора XOR в C?

це був випадковий вибір залишених персонажів.

якби я мав це зробити ще раз (що я і робив), я би використовував той самий оператор для xor (^) та бітового доповнення (~).

оскільки ^ тепер більш відомий оператор, ^ ходить, ^ є xor і також доповнюють.

Використання ^для експоненції в "математиці", на яку ви посилаєтесь, - це фактично використання, встановлене набагато пізнішої дати для систем набору тексту, таких як Teuth Knuth, який датується 1978 роком, інтерфейси командного рядка для систем алгебри, такі як Mathematica, який датується 1988 роком, та графіки калькулятори на початку 1990-х.

Чому ці продукти прийняли використання ^для експоненції? Що стосується калькуляторів, я підозрюю вплив BASIC. Протягом 1980-х років вона була дуже популярною мовою програмування, а також була вбудована в інші програмні продукти. Таким чином, позначення були б знайомі багатьом покупцям калькуляторів. Моя пам’ять розпливчаста, але я вважаю, що навіть існували калькулятори, які насправді мали прості перекладачі BASIC.


4
Це якийсь приємний урок історії. Отже, справжнє питання було б "Чому програмне забезпечення Tex (та інші з того періоду) вирішили використовувати символ XOR має експоненціальний характер?" ;)
AxelH

5
@AxelH Насправді це не так. TeX використовує ^для суперскрипту . І для мене є сенс використовувати символ "вгору" для суперскрипту та символ "вниз" ( _) для підписника.
svick

2
@AxelH Я погоджуюсь з svick, що ^підказує стрілка вгору, яка, в свою чергу, натякає на традиційне положення надписуваного показника, тому це трохи природно. Я впевнений, що Дональд Кнут відповів би на електронний лист із запитом про його рішення використовувати ^для експоненції в TeX, але враховуючи, що він зайнятий роботою над важливішими справами, такими як завершення TAOCP, я не хотів робити цей крок (я вважав, що це).
njuffa

7
За даними en.wikipedia.org/wiki/Caret , Алгол 60 використовував стрілку вгору для вказівки вгору, і зазначає, що спочатку ASCII також мала стрілку вгору в тій же кодовій точці, де в даний час вона має символ карети, тому обидва були чітко прирівнюються один до одного приблизно в один і той же час.
Periata Breatta

4
Дійсно приємна історична відповідь. Я просто хотів би додати ймовірну причину для C-бітових операторів замість експоненції: мета C - бути мовою низького рівня, що дозволяє програмісту легко отримати доступ до значної частини речей, які центрально підтримують процесори. А процесори завжди дають інструкції щодо маніпуляцій з бітами, але я не знаю жодного ЦП, який має спеціальні інструкції щодо експоненції. Таким чином, експоненція завжди вимагає циклу (принаймні, з цілою арифметикою), і в C немає жодної функції, яка ховає цикл за мовною конструкцією.
cmaster
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.