¿Por qué se usó el cursor para XOR en lugar de exponenciación?


32

No es que sea realmente un problema para cualquiera que haya enfrentado este problema sintáctico antes, pero veo una gran cantidad de confusión derivada del uso de caret ( ^) como la operación XOR en lugar de la operación de exponenciación matemática ampliamente aceptada.

Por supuesto, hay muchos lugares donde se explica y corrige el (mal) uso del caret, pero no he encontrado ninguna fuente definitiva de por qué se le dio un significado diferente al caret.

¿Era una cuestión de conveniencia? ¿Un accidente? Obviamente, el razonamiento podría ser diferente para los distintos idiomas, por lo que la información en cualquier aspecto sería perspicaz.


Respuestas:


58

Aunque hubo precursores más antiguos, al influyente matemático francés Rene Descartes generalmente se le atribuye la introducción de exponentes superíndices (a b ) en la escritura matemática, en su trabajo Geometrie, que se publicó en 1637. Esta es la notación que todavía se usa universalmente en matemáticas en la actualidad.

Fortran es el lenguaje de programación más antiguo ampliamente utilizado para cálculos numéricos que proporciona un operador de exponenciación, data de 1954. La operación de exponenciación se denota con un doble asterisco **. Cabe señalar que muchas computadoras en ese momento usaban codificaciones de caracteres de 6 bits que no proporcionaban un carácter de intercalación ^. El uso de **posteriormente fue adoptado por los creadores de varios lenguajes de programación más recientes que ofrecen una operación de exponenciación, como Python.

El primer conjunto de caracteres ampliamente adoptado que contenía el símbolo de intercalación ^era la codificación ASCII de 7 bits que se estandarizó por primera vez en 1963. El lenguaje de programación más antiguo que conozco que utilizaba el símbolo de intercalación para denotar la exponenciación es BASIC, que data de 1964. Aproximadamente el mismo vez que IBM adoptó la codificación de caracteres EBCDIC , que también incluye el cursor ^.

El lenguaje C entró en existencia en 1972. No proporciona un operador de exponenciación, sino que admite exponenciación a través de funciones de biblioteca como pow(). Por lo tanto, no es necesario reservar ningún símbolo para la exponenciación en C y otros lenguajes posteriores de la familia C, como C ++ y CUDA.

Por otro lado, y poco común para lenguajes de programación hasta ese momento, C proporciona símbolos para operaciones bit a bit. El número de caracteres especiales disponibles en ASCII de 7 bits era limitado, y dado que había una "afinidad natural" de otras operaciones con ciertos caracteres especiales, por ejemplo, &para AND y ~NOT, no había tantas opciones para el símbolo de XOR .

No conozco una justificación publicada proporcionada por Ritchie o Kernighan en cuanto a por qué eligieron ^denotar XOR específicamente; La corta historia de C de Ritchie no dice nada sobre este tema. Una mirada a la especificación para el precursor de C, el lenguaje B , revela que no tiene un operador XOR, pero ya se utiliza todos los caracteres especiales que no sea ^, $, @, #.

[Actualización] Envié un correo electrónico a Ken Thompson, creador de B y uno de los cocreadores de C, preguntando por la razón para elegir ^como operador XOR de C y solicitando permiso para compartir la respuesta aquí. Su respuesta (ligeramente reformateada para facilitar la lectura):

De: Ken Thompson
Enviado: jueves 29 de septiembre de 2016 4:50 a.m.
A: Norbert Juffa
Asunto: Re: ¿Justificación de la elección del operador como operador XOR en C?

fue una elección aleatoria de los personajes restantes.

si tuviera que hacerlo de nuevo (lo que hice) usaría el mismo operador para xor (^) y complemento de bits (~).

dado que ^ es ahora el operador más conocido, en go, ^ es xor y también complementario.

El uso de ^para la exponenciación en "matemáticas" al que se refiere es en realidad un uso establecido en una fecha mucho más tardía para sistemas de composición tipográfica como Knuth's TeX que data de 1978, interfaces de línea de comandos para sistemas de álgebra como Mathematica que data de 1988 y gráficos calculadoras a principios de la década de 1990.

¿Por qué estos productos adoptaron el uso de ^para exponenciación? En el caso de las calculadoras sospecho la influencia de BASIC. Durante la década de 1980 fue un primer lenguaje de programación muy popular y también se integró en otros productos de software. Por lo tanto, la notación habría sido familiar para muchos compradores de las calculadoras. Mi memoria es vaga, pero creo que incluso hubo calculadoras que realmente ejecutaban intérpretes BASIC simples.


44
Esa es una buena lección de historia. Entonces, la verdadera pregunta sería "¿Por qué el software de Tex (y otro de ese período) había decidido usar el símbolo XOR tiene exponencial?" ;)
AxelH

55
@AxelH En realidad, no lo hace. TeX utiliza ^para superíndice . Y tiene sentido para mí usar un carácter "arriba" para el superíndice y un carácter "abajo" ( _) para el subíndice.
svick

2
@AxelH Estoy de acuerdo con svick en que ^sugiere una flecha hacia arriba, que a su vez insinúa la posición tradicional de un exponente superíndice, por lo que es un poco natural. Estoy seguro de que Donald Knuth respondería a un correo electrónico preguntando sobre su decisión de usar ^para la exponenciación en TeX, pero dado que está ocupado trabajando en cosas más importantes, como completar TAOCP, no quise dar ese paso (lo consideré eso).
njuffa

77
De acuerdo con en.wikipedia.org/wiki/Caret , Algol 60 usó una flecha hacia arriba para la exponenciación, y señala que originalmente ASCII también tenía una flecha hacia arriba en el mismo punto de código donde actualmente tiene el símbolo de intercalación, por lo que los dos estaban claramente equiparados entre sí al mismo tiempo.
Periata Breatta

44
Muy buena respuesta histórica. Solo me gustaría agregar una razón probable para que C implemente operadores de bits en lugar de una exponenciación: el objetivo de C es ser un lenguaje de bajo nivel que permita al programador acceder fácilmente a una gran parte de las cosas que las CPU admiten de forma nativa. Y las CPU siempre proporcionan instrucciones de manipulación de bits, sin embargo, no conozco una sola CPU que tenga instrucciones especiales para la exponenciación. Como tal, la exponenciación siempre requiere un bucle (al menos con aritmética de enteros), y no hay una sola característica en C que oculte un bucle detrás de una construcción de lenguaje.
cmaster
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.