Por que as linguagens de programação começaram a usar = para atribuição?

13

Nos livros de algoritmos mais antigos, <-referia-se à atribuição e =à comparação. Hoje em dia, porém, os únicos idiomas que não usam =para atribuição são Pascal ( :=) e linguagens de brinquedos como COOL . O que fez com que as linguagens de programação modernas se transformassem =em atribuição de significado em vez de em seu significado matemático de igualdade?

Siqi Lin
fonte
8
Não me inicie ===...
Deer Hunter
1
permanece comum no trabalho de algoritmos; é uma das três notações comuns para atribuição ao escrever um algoritmo (os outros sendo :=e =). Só porque todos os programadores usam =não significa que todos os matemáticos caíram .
Cspast 17/03/2015
@DeerHunter ===está bem.
Darth Egregious
1
Eu tive uma garota do ensino médio uivar: "Como x é igual a x mais um?" em uma introdução que eu ensinei. Essa é a estranheza fundamental dos computadores: as variáveis ​​não existem na natureza, são diferentes de qualquer outra coisa no universo.
1
User251748: Minha carteira é uma variável do mundo real, contendo um conjunto múltiplo de moedas, notas de banco e pedaços ocasionais de papel.
gnasher729

Respostas:

14

De acordo com a Wikipedia , o uso de iguais para atribuição remonta ao Superplan de Heinz Rutishauser, projetado de 1949 a 1951, e foi particularmente popularizado por Fortran:

Um exemplo notório de uma má ideia foi a escolha do sinal de igual para designar atribuição. Ele remonta a Fortran em 1957 e foi cegamente copiado por exércitos de designers de idiomas. Por que é uma má ideia? Porque derruba uma tradição secular para deixar “=” denotar uma comparação para igualdade, um predicado que é verdadeiro ou falso. Mas Fortran fez com que isso significasse atribuição, a imposição da igualdade. Nesse caso, os operandos estão em pé de igualdade: O operando esquerdo (uma variável) deve ser igual ao operando direito (uma expressão). x = y não significa a mesma coisa que y = x.

- Niklaus Wirth, boas idéias, através do espelho

Konrad Zuse também usou o sinal de igual para Plankalkul , que inspirou o Superplan de Rutishauser, embora um compilador nunca tenha sido desenvolvido para ele. Por que ele escolheu o sinal de igual? Eu acho que você teria que perguntar a ele.

Robert Harvey
fonte
4
Bem, certamente havia idéias piores. Afinal, os textos de matemática usam =tanto como predicado quanto para definir variáveis, por exemplo, em “Let x = 4. Então √ (x - y) é zero se y = 4”. Isso funciona porque a notação matemática deve ser entendida declarativamente e não imperativamente. As linguagens de programação funcional (por exemplo, a família ML) são padronizadas para variáveis ​​não mutáveis ​​e, portanto, podem continuar a ser usadas =em sua função dupla sem problemas. Ou, mais precisamente, =é um operador e parte da letsintaxe.
amon
2
@ amon: Não concordo com o duplo significado em matemática. "Let 4 = x" é tão válido quanto "Let x = 4".
Vem
4
@COMEFROM "Let 4 = x" é tão antinatural quanto a instrução INTERCAL da qual você escolhe seu nome de usuário. Quando "x" nunca foi mencionado antes, "Let x = {something}" ou "Let x be a {widget}" introduz uma variável além de especificar seu valor e isso coloca a variável em primeiro lugar por convenção. Isso é precisamente porque, pelo menos em termos de intuição, isso é algo diferente de apenas afirmar "o valor é igual a ...".
3
@ delnan "Let x = 4" é apenas uma abreviação de "Let x ℤ x x = 4". O contexto introduz a nova variável e, em =seguida, é apenas um predicado, o mesmo que em qualquer outro lugar em que é usado. Observe que, dependendo do contexto, "Let x = 4" também poderia significar "Let x ∈ ℝ x = 4".
Doval
2
@RobertHarvey Estamos falando de escrita matemática, não de programação C. VÊM DE: Admito que não é tão claro como eu disse antes, mas como a prosa matemática é baseada em convenções e não há especificação que possa ser solicitada por um advogado para permitir "let 4 = x", não, a afirmação é: não é tão válido quanto "let x = 4". No mínimo, confunde os leitores e, portanto, falha no objetivo principal da prosa .
7

Mas quando eu fiz matemática na escola "deixe x = 123"

era fraseado comum. As primeiras versões do Basic insistiam na palavra-chave "let" antes da igual. Então, basicamente, o que é feito para "deixar" é entendido.

Um fator-chave geralmente não considerado, mas muito importante no momento em que você realmente digitou.

Havia dois dispositivos de entrada viáveis,

  • O "teletipo" pelo qual você pode usar uma máquina de teletipo padrão para fazer pequenos orifícios em uma fita de papel que podem ser lidos pelo computador. Isso não foi tão ruim, pois suportava o alfabeto padrão em maiúsculas e minúsculas, além da maioria dos caracteres na linha superior do teclado.
  • Cartões perfurados - havia muitas máquinas de cartões perfurados por aí, pois o uso de classificadores, tabuladores e impressoras era comum em grandes empresas. Eles suportavam um conjunto de caracteres muito limitado Alfabeto apenas em maiúsculas e um número limitado de caracteres "especiais".

Os teletipos tendiam a ser usados ​​em lojas acadêmicas e militares, os cartões perfurados em mais lojas comerciais. Portanto, linguagens acadêmicas como Pascal suportam identificadores em minúsculas e notações "sensíveis" como ": =" para atribuição. Os idiomas destinados a um público mais comercial assumiram que os cartões perfurados seriam a principal forma de entrada, portanto, somente os maiúsculos como FORTRAN e COBOL com suporte limitado a caracteres ":;> <" que não estavam disponíveis em um pressionamento de tecla padrão.

Aliás, não havia ambiguidade sobre "=" ser usado para atribuição no FORTRAN inicial, pois a comparação era feita usando ".LT.", ".LE.", ".EQ.", ".GE." e ".GT". sintaxe.

James Anderson
fonte
Acho let x = 123mais análogo a assert(x == 123)qualquer tipo de tarefa, no entanto.
21915 AKHolland
1
PS Se você está ficando pedante, a sintaxe "MOVE" do COBOL é a descrição mais precisa do que o computador está realmente fazendo. Embora "COPY" seja ainda mais preciso.
James Anderson
@AKHolland para valores grandes de 123.
Desde que o C ++ inventou os construtores de movimento, os COBOLs "MOVE" parecem muito mais estranhos.
gnasher729
Eu sempre pensei que LET deveria ter permanecido obrigatório no BASIC, uma vez que faria a atribuição se destacar dos testes de igualdade. Tipo de atalho COBOL-ish. O problema é que isso exigiria outro token na fonte, outro byte precioso nos minúsculos PCs da época. Então eles largaram.
Chuck Adams