Почему каретка использовалась для XOR вместо возведения в степень?

32

Не то чтобы это действительно было проблемой для любого, кто сталкивался с этой синтаксической проблемой раньше, но я вижу дикую путаницу, возникающую из-за использования caret ( ^) в качестве операции XOR вместо широко принятой математической операции возведения в степень.

Конечно, есть много мест, где (неправильное) использование каретки объясняется и исправляется, но я не нашел каких-либо определенных источников относительно того, почему карете было придано другое значение.

Это был вопрос удобства? Происшествие? Очевидно, что рассуждения могут быть разными для разных языков, поэтому информация в любом случае будет проницательной.

Qix
источник

Ответы:

58

Несмотря на то, что существовали более ранние предшественники, влиятельный французский математик Рене Декарт, как правило, заслуживает упоминания о введении индексов с надстрочными знаками (a b ) в математическое письмо в своей работе « Геометрия», которая была опубликована в 1637 году. Это обозначение до сих пор повсеместно используется в математике сегодня.

Фортран - самый старый язык программирования, широко используемый для числовых вычислений, который предоставляет оператор возведения в степень, он датируется 1954 годом. Операция возведения в степень обозначается двойной звездочкой **. Следует отметить, что многие компьютеры в то время использовали 6-битные кодировки символов, которые не обеспечивали символ вставки ^. **Впоследствии использование было принято создателями различных более новых языков программирования, которые предлагают операцию возведения в степень, например Python.

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

Язык C появился в 1972 году. Он не предоставляет оператора возведения в степень, а поддерживает возведение в степень с помощью библиотечных функций, таких как pow(). Поэтому не нужно откладывать символы для возведения в степень в C и других, более поздних языках в семействе C, таких как C ++ и CUDA.

С другой стороны, и необычно для языков программирования до того времени, C предоставляет символы для побитовых операций. Количество специальных символов, доступных в 7-битном ASCII, было ограничено, и поскольку имелась «естественная близость» других операций к определенным специальным символам, например, &для AND и ~для NOT, было не так много вариантов для символа для XOR ,

Мне неизвестно об опубликованном обосновании, представленном Ричи или Керниганом, почему они решили специально ^обозначать XOR; Краткая история Ричи C молчит по этому вопросу. Посмотрите на спецификации предшественника С, языка B , показывает , что у него не было оператора XOR, но уже использовали все специальные символы , кроме ^, $, @, #.

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

От: Кен Томпсон
Отправлено: четверг, 29 сентября 2016 г., 4:50
Кому: Норберт Джуффа
Тема: Re: Обоснование выбора каретки в качестве оператора XOR в C?

это был случайный выбор оставшихся персонажей.

если бы у меня было это сделать снова (что я и сделал), я бы использовал тот же оператор для xor (^) и дополнения битов (~).

поскольку ^ теперь является наиболее известным оператором, в go ^ является xor, а также дополнением.

Использование ^для возведения в степень в «математике», на которую вы ссылаетесь, на самом деле является использованием, установленным гораздо позже для систем набора текста, таких как TeX Кнута, который датируется 1978 годом, интерфейсов командной строки для систем алгебры, таких как Mathematica, которые датируются 1988 годом, и для построения графиков. калькуляторы в начале 1990-х годов.

Почему эти продукты приняли использование ^для возведения в степень? В случае калькуляторов я подозреваю влияние Бейсика. В течение 1980-х годов это был очень популярный первый язык программирования, который также был встроен в другие программные продукты. Поэтому обозначение было бы знакомо многим покупателям калькуляторов. Моя память расплывчата, но я думаю, что были даже калькуляторы, которые на самом деле работали с простыми интерпретаторами языка BASIC.

njuffa
источник
4
Это хороший урок истории. Таким образом, реальный вопрос был бы: «Почему программное обеспечение Tex (и другие из того периода) решило использовать символ XOR экспоненциально?» ;)
AxelH
5
@AxelH На самом деле это не так. TeX использует ^для верхнего индекса . И для меня имеет смысл использовать символ «вверх» для верхнего индекса и символ «вниз» ( _) для нижнего индекса.
svick
2
@AxelH Я согласен с svick, что он ^предлагает стрелку вверх, которая в свою очередь намекает на традиционное положение индекса в верхнем индексе, так что это немного естественное совпадение. Я уверен, что Дональд Кнут ответит на электронное письмо с запросом о его решении использовать ^для возведения в степень в TeX, но, учитывая, что он занят работой над более важными вещами, такими как завершение TAOCP, я не хотел делать этот шаг (я подумал Это).
njuffa
7
Согласно en.wikipedia.org/wiki/Caret , Algol 60 использовал стрелку, направленную вверх для возведения в степень, и отмечает, что первоначально ASCII также имел стрелку вверх в той же кодовой точке, где он в настоящее время имеет символ каретки, так что оба были четко приравниваются друг к другу примерно в одно и то же время.
Периата Breatta
4
Действительно хороший исторический ответ. Я просто хотел бы добавить вероятную причину для реализации битовых операторов в C вместо возведения в степень: цель C состоит в том, чтобы быть языком низкого уровня, который позволяет программисту легко получить доступ к значительной части материала, который процессоры изначально поддерживают. И процессоры всегда предоставляют инструкции по обработке битов, но я не знаю ни одного процессора, у которого есть специальные инструкции для возведения в степень. Таким образом, возведение в степень всегда требует цикла (по крайней мере, с целочисленной арифметикой), и в C нет ни одного признака, который бы скрывал цикл за языковой конструкцией.
cmaster