¿Por qué los lenguajes de programación comenzaron a usar = para la asignación?

13

En la mayoría de los primeros libros de algoritmos, se <-hace referencia a la asignación y se =hace referencia a la comparación. Pero hoy en día, los únicos idiomas que no se usan =para la asignación son Pascal ( :=) e idiomas de juguete como COOL . ¿Qué causó que los lenguajes de programación modernos cambiaran =a asignación de significado en lugar de su significado matemático de igualdad?

Siqi Lin
fuente
8
No me hagas empezar a ===...
Deer Hunter
1
sigue siendo común en algoritmos de trabajo; Es una de las tres notaciones comunes para la asignación al escribir un algoritmo (los otros son :=y =). El hecho de que todos los programadores utilicen =no significa que todos los matemáticos hayan caído .
cpast
@DeerHunter ===está bien.
Darth Egregious
1
Aullé una chica de secundaria: "¿Cómo puede x ser igual a x más uno?" en una introducción que enseñé. El es la rareza fundamental de las computadoras: las variables no existen en la naturaleza, son diferentes a cualquier otra cosa en el universo.
1
Usuario251748: Mi billetera es una variable del mundo real, que contiene un conjunto múltiple de monedas, billetes de banco y ocasionales trozos de papel.
gnasher729

Respuestas:

14

Según Wikipedia , el uso de iguales para la asignación se remonta al Superplan del lenguaje de Heinz Rutishauser, diseñado desde 1949 hasta 1951, y fue particularmente popularizado por Fortran:

Un ejemplo notorio de una mala idea fue la elección del signo igual para denotar la asignación. Se remonta a Fortran en 1957, y ha sido copiado ciegamente por ejércitos de diseñadores de idiomas. por qué es una mala idea? Porque derroca una tradición centenaria al permitir que "=" denote una comparación para la igualdad, un predicado que es verdadero o falso. Pero Fortran hizo que significara asignación, la imposición de la igualdad. En este caso, los operandos están en pie desigual: el operando izquierdo (una variable) debe hacerse igual al operando derecho (una expresión). x = y no significa lo mismo que y = x.

—Niklaus Wirth, buenas ideas, a través del espejo

Konrad Zuse también usó el signo igual para Plankalkul , que inspiró al Superplan de Rutishauser, aunque nunca se ideó un compilador para ello. ¿Por qué eligió el signo igual? Supongo que tendrías que preguntarle.

Robert Harvey
fuente
44
Bueno, ciertamente hubo peores ideas. Después de todo, los textos matemáticos usan =tanto como predicado como para definir variables, por ejemplo, en "Let x = 4. Entonces √ (x - y) es cero si y = 4". Esto funciona porque la notación matemática debe entenderse de manera declarativa en lugar de imperativa. Los lenguajes de programación funcional (p. Ej., La familia ML) tienen por defecto variables no mutables y, por lo tanto, pueden seguir utilizándose =en su doble función sin ningún problema. O más precisamente, =es tanto un operador como parte de la letsintaxis.
amon
2
@amon: No estoy de acuerdo con el doble significado en matemáticas. "Let 4 = x" es tan válido como "Let x = 4".
VENIDO del
44
@COMEFROM "Let 4 = x" es tan poco natural como la declaración INTERCAL de la que tomas tu nombre de usuario. Cuando nunca se ha mencionado "x", "Let x = {something}" o "Let x be a {widget}" introduce una variable además de especificar su valor y esto coloca a la variable primero por convención. Eso es precisamente porque, al menos en términos de intuición, esto es algo diferente de decir "el valor es igual a ...".
3
@delnan "Let x = 4" es solo una abreviatura de "Let x ∈ ℤ y x = 4". El contexto introduce la nueva variable y =luego es solo un predicado, igual que en cualquier otro lugar donde se use. Tenga en cuenta que dependiendo del contexto, "Let x = 4" también podría haber significado "Let x ∈ ℝ y x = 4".
Doval
2
@RobertHarvey Estamos hablando de escritura matemática, no de programación en C. Procede de: Admito que no es tan claro como lo dije antes, pero dado que la prosa matemática se basa en convenciones y no hay una especificación que pueda ser abogado para permitir "let 4 = x", no, dicha declaración es no tan válido como "let x = 4". Como mínimo, confunde a los lectores y, por lo tanto, no cumple el objetivo principal de la prosa .
7

Pero cuando hice matemáticas en la escuela "let x = 123"

Era una frase común. Las primeras versiones de Basic insistían en la palabra clave "let" antes de la igualdad. Por lo tanto, se entiende básicamente forúnculos hechos para "dejar".

Un controlador clave que generalmente no se considera pero que es muy importante en el momento en el que realmente escribió.

Había dos dispositivos de entrada factibles,

  • El "teletipo" por el cual puedes usar una máquina de teletipo estándar para perforar pequeños agujeros en una cinta de papel que luego puede ser leída por la computadora. Esto no fue tan malo, ya que admitía el alfabeto estándar en mayúsculas y minúsculas más la mayoría de los caracteres en la fila superior de su teclado.
  • Tarjetas perforadas: había muchas máquinas de tarjetas perforadas dando vueltas ya que el uso de clasificadores, tabuladores e impresoras era común en las grandes corporaciones. Estos admitían un conjunto de caracteres limitado ery en mayúsculas y un número limitado de caracteres "especiales".

Los teletipos solían usarse en tiendas académicas y militares, perforaciones de tarjetas en tiendas más comerciales. Por lo tanto, los lenguajes académicos como Pascal admitían identificadores en minúsculas y anotaciones "sensibles" como ": =" para la asignación. Los idiomas dirigidos a un público más comercial suponían que las tarjetas perforadas serían la forma principal de entrada, por lo tanto, los idiomas en mayúscula solo como FORTRAN y COBOL con soporte limitado para caracteres ":;> <" que no estaban disponibles en un teclado estándar.

Por cierto, no hubo ambigüedad acerca de que "=" se utilizara para la asignación en FORTRAN temprano, ya que la comparación se realizó utilizando ".LT.", ".LE.", ".EQ.", ".GE". y ".GT". sintaxis.

James Anderson
fuente
Sin embargo, me parece let x = 123más análogo a assert(x == 123)cualquier tipo de tarea.
AKHolland
1
PD: si se está volviendo pedante, entonces la sintaxis COBOL "MOVE" es la descripción más precisa de lo que la computadora está haciendo realmente. Aunque "COPIAR" sería aún más preciso.
James Anderson el
@AKHolland para valores grandes de 123.
Desde que C ++ inventó los constructores de movimiento, COBOLs "MOVE" suena mucho más extraño.
gnasher729
Siempre pensé que LET debería haber sido obligatorio en BASIC, ya que haría que la asignación se diferenciara de las pruebas de igualdad. Una especie de taquigrafía COBOL-ish. El problema es que eso tomaría otro token más en la fuente, otro byte precioso en las pequeñas PC de la época. Entonces lo dejaron caer.
Chuck Adams el