Comecei a ensinar a um amigo programação recentemente (estamos usando Python) e, quando começamos a discutir a criação de variáveis e o operador de atribuição, ela perguntou por que o valor à direita é atribuído ao nome à esquerda e não vice-versa .
Eu não tinha pensado muito nisso antes, porque parecia natural para mim, mas ela disse que da esquerda para a direita parecia mais natural para ela, já que é assim que a maioria de nós lê línguas naturais.
Pensei sobre isso e concluí que torna o código muito mais fácil de ler, pois os nomes atribuídos (aos quais o programador precisará reutilizar) são facilmente visíveis, alinhados à esquerda.
aligned = 2
on = 'foo' + 'bar' + 'foobar'
the = 5.0 / 2
left = 2 + 5
Ao contrário de:
2 = aligned
'foo' + 'bar' + 'foobar' = on
5.0 / 2 = the
2 + 5 = right
# What were the names again...?
Agora, eu me pergunto se há outras razões também para esse padrão. Existe uma história por trás disso? Ou há alguma razão técnica para que essa seja uma boa opção (não sei muito sobre compiladores)? E há alguma linguagem de programação atribuída ao lado direito?
fonte
value -> variable
).Respostas:
O mesmo vale para @paxdiablo. As primeiras linguagens de programação foram escritas por matemáticos - na verdade todas elas foram. Em matemática, por seu próprio princípio - ler da esquerda para a direita - faz sentido na maneira como funciona.
x = 2y - 4.
Em matemática, você diria o seguinte: Seja x igual a 2y -4.
Além disso, mesmo em álgebra, você faz isso. Ao resolver uma equação para uma variável, você isola a variável que está resolvendo no lado esquerdo. ie y = mx + b;
Além disso, quando uma família inteira de idiomas - como a família C - tem uma certa sintaxe, é mais caro mudar.
fonte
let a be...
não houvesse tempo, os dois lados da tarefa também são iguais; portanto, a tarefa é de fato uma igualdade, não é à toa que os dois usam o mesmo sinal:=
x = 1
no capítulo um, mas afirmox = 2
no capítulo dois, isso não é uma terrível contradição - cada afirmação se aplica apenas dentro de um determinado contexto. A diferença na programação imperativa é em parte a remoção de uma barreira (não precisamos de uma mudança de contexto) e em parte a implementação e a utilidade.BASIC
, uma das linguagens de computador mais antigas tinha a forma "adequada" de:que corresponde à mentalidade matemática de especificar uma variável, como "Seja H a altura do objeto".
COBOL
também foi semelhante com suaCOMPUTE
afirmação. Como em muitas maneiras de fazer as coisas, pode ter sido simplesmente uma decisão arbitrária que foi levada adiante por vários idiomas.fonte
I declare that X must equal THIS
, em vez do mais linearEvaluate THIS and store it in X
MULTIPLY HEIGHT BY WIDTH GIVING AREA
, portanto, a variável que obtém o resultado fica no lado direito da instrução.Na verdade, existe uma linguagem de programação que atribui ao lado direito: TI-BASIC ! Não apenas isso, mas também não usa '=' como operador de atribuição, mas usa uma seta conhecida como operador "STO".
exemplos:
No exemplo acima, três variáveis estão sendo declaradas e recebem valores. A seria 5, B seria 8 e C seria -3. A primeira declaração / atribuição pode ser lida 'loja 5 como A'.
Quanto ao motivo pelo qual o TI-BASIC usa esse sistema para atribuição, atribuo-o a ser porque é uma linguagem de programação para uma calculadora. O operador "STO" nas calculadoras de TI era usado com mais frequência nas operações normais da calculadora depois que um número era calculado. Se fosse um número que o usuário desejasse lembrar, eles pressionariam o botão "STO" e o caclulator solicitaria um nome (ativando automaticamente o bloqueio alfa para que as teclas digitassem letras em vez de números):
e o usuário poderia nomear a variável como quisesse. Tendo que ativar a trava alfa, digite o nome e pressione "STO", e pressionar a tecla "Ans" teria sido muito complicado para operações normais. Como todas as funções da calculadora estão disponíveis no TI-BASIC, nenhum outro operador de atribuição foi adicionado, pois o "STO" executou a mesma tarefa, embora ao contrário, quando comparado à maioria dos outros idiomas.
(Anedota: TI-BASIC foi uma das primeiras linguagens que aprendi, então, quando aprendi Java na faculdade, senti como se atribuir à ESQUERDA fosse incomum e 'invertido'!)
fonte
Heurística 1: Quando você se deparar com mais de uma maneira possível de fazer algo enquanto cria uma linguagem, escolha a mais comum e mais intuitiva, ou então você terminará com o Perl +.
Agora, como é mais natural (pelo menos para um falante de inglês)? Vejamos como escrevemos / dizemos coisas em inglês:
Steven agora tem 10 anos (em oposição a 10 anos, Steven agora tem). Eu peso mais de 190 libras (em oposição a mais de 190 libras eu peso).
Em código:
O seguinte também parece mais natural:
"Se Mary tem 18 anos, ela pode comer um doce". "Se eu tenho menos de 21 anos, pedirei a meu irmão por tequila".
do que:
"Se 18 anos Maria é ..." "Se 21 é maior que minha idade ..."
Agora o código:
Observe que isso não é natural para programadores nem falantes de inglês. As frases soam como yoda-speak, e o código é apelidado de yoda-conditions. Isso pode ser útil em C ++, mas tenho certeza de que a maioria das pessoas concorda: se um compilador pudesse fazer o trabalho pesado e aliviar a necessidade de condições de yoda, a vida seria um pouco mais fácil.
Claro, alguém poderia se acostumar com qualquer coisa. Por exemplo, o número 81 é escrito como:
Oitenta e um (inglês) Oitenta e um (espanhol) Um e oitenta (alemão).
Finalmente, existem 4! = 24 maneiras válidas de dizer "maçã verde está na mesa" em russo - a ordem (quase) não importa, exceto que 'on' deve vir junto com 'table'. Portanto, se você é um falante nativo de russo (por exemplo), pode não se importar se alguém escreve
a = 10
ou10 = a
porque ambos parecem igualmente naturais.Embora a lingüística seja um assunto fascinante, nunca a estudei formalmente e não conheço muitas línguas. Espero ter fornecido contra-exemplos suficientes.
fonte
(four times twenty) one
Tudo começou com a FORTRAN nos anos 50. Onde FORTRAN era uma abreviação de FORmula TRANslation - as fórmulas em questão eram simples equações algébricas que por convenção sempre atribuem à esquerda.
Seu COBOL quase contemporâneo, por outro lado, deveria ser semelhante ao inglês e atribuído à direita (principalmente!).
fonte
Bem, como @ diceguyd30 apontou, existem duas notações.
<Identifier> = <Value>
significa "permitir que o identificador seja valor ". Ou para expandir: Defina (ou redefina) a variável Identifier para Value .<Value> -> <Identifier>
significa "armazenar valor para o identificador ". Ou para expandir: Coloque Valor no local designado pelo Identificador .Obviamente, de um modo geral, o Identificador pode ser de fato qualquer valor de L.
A primeira abordagem respeita o conceito abstrato de variáveis, a segunda abordagem é mais sobre armazenamento real.
Observe que a primeira abordagem também é comum em idiomas que não possuem atribuições. Além disso, observe que a definição variável e atribuição estão relativamente perto
<Type> <Identifier> = <Value>
vs.<Identifier> = <Value>
.fonte
Como já foi mencionado, muito bem todas as primeiras linguagens de computador funcionavam dessa maneira. Por exemplo, FORTRAN, que surgiu muitos anos antes do BASIC.
Na verdade, faz muito sentido ter a variável atribuída à esquerda da expressão de atribuição. Em alguns idiomas, você pode ter várias rotinas sobrecarregadas diferentes com o SAME NAME, retornando diferentes tipos de resultado. Ao permitir que o compilador veja primeiro o tipo da variável atribuída, ele sabe qual rotina sobrecarregada chamar ou que conversão implícita gerar ao converter de (por exemplo) um número inteiro para um float. Essa é uma explicação simplista, mas espero que você entenda.
fonte
Pode ser um remanescente de algoritmos de análise antecipada. Lembre-se de que a análise de LR foi inventada apenas em 1965, e pode ser que os analisadores de LL tenham problemas (dentro das limitações de tempo e espaço das máquinas da época) ao contrário. Considerar:
Os dois estão claramente desambiguados do segundo token. Por outro lado,
Não tem graça. Isso piora quando você começa a aninhar expressões de atribuição.
Obviamente, mais fácil desambiguar para máquinas também significa mais desambiguar para humanos. Outro exemplo fácil seria procurar a inicialização de qualquer identificador.
Fácil, basta olhar para o lado esquerdo. Lado direito, por outro lado
Especialmente quando você não pode
grep
perfurar cartões, é muito mais difícil encontrar o identificador desejado.fonte
Os idiomas de montagem têm o destino como parte do código de operação esquerdo. Os idiomas de nível superior tendem a seguir as convenções dos idiomas anteriores.
Quando vir
=
(ou:=
para dialetos pascales), você poderá pronunciá-los comois assigned the value
, então a natureza da esquerda para a direita fará sentido (porque também lemos da esquerda para a direita na maioria dos idiomas). Como as linguagens de programação foram predominantemente desenvolvidas por pessoas que leem da esquerda para a direita, as convenções continuaram.É um tipo de dependência de caminho . Suponho que se a programação de computadores foi inventada por pessoas que falavam hebraico ou árabe (ou algum outro idioma da direita para a esquerda), então suspeito que estaríamos colocando o destino à direita.
fonte
mov.b #255, d0
, por exemplo, onded0
está o registro ao qual atribuir. Montadores mais antigos têm apenas um único argumento por instrução. No 6502LDA #255
(Acumulador de Carga), você pode argumentar queA
está à esquerda, mas também à esquerda emSTA wherever
(Acumulador de Loja).Por que vale a pena, a maioria das declarações em COBOL lido da esquerda para a direita, de modo que os dois operandos foram nomeados em primeiro lugar, e o destino último, como:
multiply salary by rate giving tax
.No entanto, não vou sugerir que seu aluno prefira COBOL, por medo de que eu seja (com toda a razão) sinalizado por fazer um comentário tão baixo, rude e sem gosto! :-)
fonte
Eu acho que isso é um erro. Por um lado, você pode dizer "atribuir 10 para x" ou "mover 10 para x". Por outro lado, você pode dizer "defina x como 10" ou "x se torna 10".
Em outras palavras, dependendo da sua escolha de verbo, a variável atribuída pode ou não ser o assunto e pode ou não estar à esquerda. Portanto, "o que é natural" depende inteiramente de sua escolha habitual de redação para representar a tarefa.
fonte
No pseudocódigo, o operador de atribuição é muito comumente escrito à direita. Por exemplo
Nas calculadoras Casio, mesmo variantes não programáveis, a variável de atribuição também é exibida à direita
Em quarto lugar a variável também está à direita
No x86, a sintaxe da Intel tem o destino à esquerda, mas a sintaxe do GAS inverte a ordem, causando confusão para muitas pessoas, especialmente nas instruções sobre a ordem dos parâmetros, como subtração ou comparação. Estas instruções são iguais em 2 dialetos diferentes
Ambos movem o valor em rbx para rax. Nenhuma outra linguagem assembly que conheço escreve o destino à direita como GAS.
https://en.wikipedia.org/wiki/Assignment_%28computer_science%29#Notation
A maioria dos idiomas atribui o valor à esquerda, sendo um dos motivos fáceis de alinhar os operadores, mais fáceis de ler e reconhecer a variável, pois as posições dos operadores e das variáveis de atribuição não variam muito nas linhas, e é mais fácil ler como "deixe a variável ter algum valor".
No entanto, algumas pessoas preferem dizer "mova o valor x para y" e escreva a variável à direita.
fonte
Eu acho que segue uma maneira lógica de pensar.
Tem que haver uma caixa (variável) primeiro, então você coloca um objeto (valor) dentro dela.
Você não coloca o objeto no ar e depois coloca uma caixa em torno dele.
fonte