¿Por qué el operador de asignación asigna al lado izquierdo?

47

Comencé a enseñar a un amigo la programación recientemente (estamos usando Python), y cuando comenzamos a hablar sobre la creación de variables y el operador de asignación, ella preguntó por qué el valor de la derecha se asigna al nombre de la izquierda, y no viceversa.

No lo había pensado demasiado antes, porque me parecía natural, pero ella dijo que la de izquierda a derecha le parecía más natural, ya que así es como la mayoría de nosotros leemos los idiomas naturales.

Lo pensé y llegué a la conclusión de que hace que el código sea mucho más fácil de leer, ya que los nombres asignados (que el programador deberá reutilizar) son fácilmente visibles, alineados a la izquierda.

aligned = 2
on = 'foo' + 'bar' + 'foobar'
the = 5.0 / 2
left = 2 + 5

A diferencia de:

2 = aligned 
'foo' + 'bar' + 'foobar' = on
5.0 / 2 = the 
2 + 5 = right 

# What were the names again...?

Ahora me pregunto si hay otras razones también para este estándar. ¿Hay una historia detrás de esto? ¿O hay alguna razón técnica por la que esta es una buena opción (no sé mucho acerca de los compiladores)? ¿Y hay algún lenguaje de programación que se asigne al lado derecho?

    
pregunta voithos 04.08.2011 - 00:01

13 respuestas

56

Lo mismo @paxdiablo. Los primeros lenguajes de programación fueron escritos por matemáticos, en realidad todos lo fueron. En matemáticas, según su propio principio, leer de izquierda a derecha, tiene sentido en la forma en que funciona.

x = 2y - 4.

En matemáticas, dirías esto: Sea x igual a 2y -4.

También, incluso en álgebra haces esto. Cuando resuelves una ecuación para una variable, aislas la variable que estás resolviendo hacia el lado izquierdo. es decir, y = mx + b;

Además, una vez que una familia completa de idiomas, como la familia C, tiene una cierta sintaxis, es más costoso cambiarlo.

    
respondido por el Jonathan Henson 04.08.2011 - 00:27
26

BASIC , uno de los primeros lenguajes informáticos tenía la forma "adecuada" de:

10 LET AREA = HEIGHT * WIDTH

que coincide con la mentalidad matemática de especificar una variable, como "Sea H la altura del objeto".

COBOL también fue similar con su declaración COMPUTE . Al igual que con muchas formas de hacer las cosas, puede haber sido simplemente una decisión arbitraria que se llevó a cabo a través de muchos idiomas.

    
respondido por el user10776 04.08.2011 - 00:16
25

En realidad, hay un lenguaje de programación que se asigna al lado derecho: TI-BASIC . No solo eso, sino que tampoco usa '=' como operador de asignación, sino que utiliza una flecha conocida como operador "STO".

ejemplos:

5→A
(A + 3)→B
(A - B)→C

En el ejemplo anterior, se están declarando y dando valores a tres variables. A sería 5, B sería 8 y C sería -3. La primera declaración / asignación se puede leer 'almacén 5 como A'.

En cuanto a por qué TI-BASIC utiliza un sistema de asignación de este tipo, lo atribuyo a ser porque es un lenguaje de programación para una calculadora. El operador "STO" en las calculadoras TI fue el más utilizado en las operaciones normales de la calculadora después de se calculó un número. Si se tratara de un número que el usuario deseaba recordar, presionaría el botón "STO" y el indicador de acceso le pediría un nombre (activando automáticamente el bloqueo alfa para que las teclas produzcan letras en lugar de números):

Sin(7 + Cos(3))
                    -.26979276
Ans→{variable name}
                    -.26979276

y el usuario podría nombrar la variable como lo eligieran. Tener que activar el bloqueo alfa, escribir el nombre, luego presionar "STO", y presionar la tecla "Ans" hubiera sido demasiado engorroso para las operaciones normales. Dado que todas las funciones de la calculadora están disponibles en TI-BASIC, no se agregaron otros operadores de asignación ya que "STO" realizó la misma tarea, aunque al revés en comparación con la mayoría de los otros idiomas.

(Anécdota: TI-BASIC fue uno de los primeros idiomas que aprendí, así que cuando empecé a aprender Java en la universidad, sentí como si la asignación a la IZQUIERDA fuera inusual y fuera de lugar.)

    
respondido por el diceguyd30 04.08.2011 - 06:51
15

Heurística 1: Cuando se enfrenta a más de una forma posible de hacer algo mientras se diseña un idioma, elija la más común, la más intuitiva, o terminará con Perl +.

Ahora, ¿es más natural (al menos para un hablante de inglés)? Veamos cómo escribimos / decimos cosas en inglés:

Steven tiene ahora 10 años (a diferencia de 10 años, Steven ahora tiene). Pese más de 190 libras (a diferencia de más de 190 libras que pesa).

En el código:

steven = 10
i > 190

Lo siguiente también suena más natural:

"Si Mary tiene 18 años, entonces ella puede tener un caramelo". "Si tengo menos de 21 años, entonces le pediré a mi hermano que me sirva de tequila".

if (mary == 18) { ... }
if (i < 21) { ... }

que:

"Si 18 años es Mary ..." "Si 21 es mayor que mi edad ..."

Ahora el código:

if (18 == mary) { ... }
if (21 > i) { ... }

Tenga en cuenta que esto no es natural ni para los programadores ni para los hablantes de inglés. Las oraciones suenan como yoda, y el código es apodado yoda-conditions. Esto podría ser útil en C ++, pero estoy seguro de que la mayoría de la gente estaría de acuerdo: si un compilador pudiera hacer el trabajo pesado y aliviar la necesidad de las condiciones yoda, la vida sería un poco más fácil.

Por supuesto, uno podría acostumbrarse a cualquier cosa. Por ejemplo, el número 81 está escrito como:

ochenta y uno (inglés) Ochenta y uno (español) Uno y ochenta (alemán).

Finalmente, hay 4! = 24 formas válidas de decir "manzana verde se encuentra en la mesa" en ruso: el orden (casi) no importa, excepto que 'on' debe venir junto con 'table'. Por lo tanto, si usted es un hablante nativo de ruso (por ejemplo), es posible que no le importe si uno escribe a = 10 o 10 = a porque ambos parecen ser igualmente naturales.

Aunque la lingüística es un tema fascinante, nunca lo estudié formalmente y no sé tantos idiomas. Sin embargo, espero que haya proporcionado suficientes contra ejemplos.

    
respondido por el Job 04.08.2011 - 03:58
11

Comenzó con FORTRAN en la década de 1950. Donde FORTRAN era una abreviatura de FORmula TRANslation, las fórmulas en cuestión son simples ecuaciones algebraicas que por convención siempre se asignan a la izquierda.

Por otra parte, su COBOL casi contemporáneo estaba destinado a ser similar al inglés y se asignó a la derecha (¡en su mayoría!).

MOVE 1 TO COUNTER.
ADD +1 TO LINE-CNT.
MULTIPLY QTY BY PRICE GIVING ITEM-PRICE.
    
respondido por el James Anderson 04.08.2011 - 10:30
5

Bueno, como @ diceguyd30 señaló, hay dos notaciones.

  • <Identifier> = <Value> significa "dejar que Identificador sea Valor ". O para expandir eso: defina (o redefina) la variable Identificador a Valor .
  • <Value> -> <Identifier> significa "almacenar Valor a Identificador ". O para expandir eso: ponga Valor en la ubicación designada por Identificador>.

Por supuesto, en general, el Identificador puede ser cualquier valor L

.

El primer enfoque respeta el concepto abstracto de las variables, el segundo enfoque es más sobre el almacenamiento real.

Tenga en cuenta que el primer enfoque también es común en los idiomas, que no tienen asignaciones. Además, tenga en cuenta que la definición y asignación de variables son relativamente cercanas <Type> <Identifier> = <Value> frente a <Identifier> = <Value> .

    
respondido por el back2dos 04.08.2011 - 10:51
3

Como ya se ha mencionado, bastante bien todos los primeros lenguajes informáticos funcionaron de esa manera. P.ej. FORTRAN, que surgió muchos años antes del BASIC.

En realidad, tiene mucho sentido tener la variable asignada a la izquierda de la expresión de asignación. En algunos idiomas, es posible que tenga varias rutinas sobrecargadas diferentes con el MISMO NOMBRE, que devuelven diferentes tipos de resultados. Al permitir que el compilador vea primero el tipo de la variable asignada, sabe qué rutina sobrecargada llamar, o qué conversión implícita generar cuando se convierte (por ejemplo) un número entero a un flotador. Es una explicación un tanto simplista, pero espero que tengas la idea.

    
respondido por el Dave Jewell 04.08.2011 - 00:44
3

Podría ser un remanente de los primeros algoritmos de análisis. Recuerde que el análisis de LR solo se inventó en 1965, y podría ser que los analizadores de LL tuvieron problemas (dentro de las limitaciones de tiempo y espacio de las máquinas en ese momento) al revés. Considera:

identifier = function();
function();

Los dos están claramente desambiguados del segundo token. Por otro lado,

function() = identifier;
function();

No es divertido. Esto empeora cuando comienza a agrupar expresiones de asignación.

function(prev_identifier = expression) = identifier;
function(prev_identifier = expression);

Por supuesto, más fácil de desambiguar para las máquinas también significa más fácil de desambiguar para los humanos. Otro ejemplo sencillo sería buscar la inicialización de cualquier identificador dado.

identifier1 = expressionOfAnArbitraryLength;
identifier2 = expressionOfAReallyReallyReallyArbitraryLength;
identifier3 = expression;
identifier4 = AlongLineExpressionWithAFunctionCallWithAssignment(
    identifier = expr);

Fácil, solo mira el lado izquierdo. Lado derecho, por otro lado

expressionOfAnArbitraryLength = identifier1;
expressionOfAReallyReallyReallyArbitraryLength = identifier2;
expression = identifier3;
AlongLineExpressionWithAFunctionCallWithAssignment(expr = identifier
    ) = identifier4;

Especialmente cuando no puedes grep punch cards, es mucho más difícil encontrar el identificador que deseas.

    
respondido por el DeadMG 05.08.2011 - 13:47
2

Los idiomas de ensamblaje tienen el destino como parte del código de operación de la izquierda. Los idiomas de nivel superior tendían a seguir las convenciones de los idiomas anteriores.

Cuando vea = (o := para los dialectos de Pascal), podría pronunciarlos como is assigned the value , entonces la naturaleza de izquierda a derecha tendrá sentido (porque también leemos de izquierda a derecha la mayoría de los idiomas). Dado que los lenguajes de programación fueron desarrollados predominantemente por personas que leen de izquierda a derecha, las convenciones se atascaron.

Es un tipo de dependencia de ruta . Supongo que si las personas que hablaban hebreo o árabe (o algún otro lenguaje de derecha a izquierda) inventaran la programación de computadoras, entonces sospecho que pondríamos el destino a la derecha.

    
respondido por el Tangurena 04.08.2011 - 00:37
2

Para su valor, la mayoría de las declaraciones en COBOL se leen de izquierda a derecha, por lo que los dos operandos se nombraron primero y el destino final, como: multiply salary by rate giving tax .

Sin embargo, no sugeriré que su estudiante prefiera COBOL, por temor a que me marquen (con razón) por hacer un comentario tan bajo, grosero e insípido. :-)

    
respondido por el Jerry Coffin 04.08.2011 - 22:22
1
  

dijo que de izquierda a derecha le parecía más natural, ya que así es como la mayoría de nosotros leemos los idiomas naturales.

Creo que esto es un error. Por un lado, puedes decir "asignar 10 a x" o "mover 10 a x". Por otro lado, puedes decir "establecer x en 10" o "x se convierte en 10".

En otras palabras, dependiendo de su elección del verbo, la variable asignada a puede o no ser el sujeto, y puede o no estar a la izquierda. Por lo tanto, "lo que es natural" depende completamente de su elección habitual de redacción para representar la asignación.

    
respondido por el Steve314 05.08.2011 - 10:49
0

En el pseudocódigo, el operador de asignación se escribe muy a la derecha. Por ejemplo

2*sqrt(x)/(3+y) -> z

En las calculadoras de Casio, incluso las variantes no programables, la variable de asignación también se muestra a la derecha

A+2B → C

En Forth, la variable también está a la derecha

expression variable !

En x86, la sintaxis de Intel tiene el destino a la izquierda, pero la sintaxis de GAS invierte el orden, causando confusión a muchas personas, especialmente en las instrucciones sobre el orden de los parámetros, como la resta o las comparaciones. Estas instrucciones son las mismas en 2 dialectos diferentes

mov rax, rbx    ; Intel syntax
movq %rbx, %rax ; GAS syntax

Ambos mueven el valor en rbx a rax. Ningún otro lenguaje ensamblador que conozco escribe el destino a la derecha como GAS.

  

Algunas plataformas ponen la expresión a la izquierda y la variable a la derecha:

MOVE expression TO variable      COBOL
expression → variable            TI-BASIC, Casio BASIC
expression -> variable           BETA, R
put expression into variable     LiveCode

enlace

La mayoría de los idiomas asignan el valor a la izquierda, una de las razones es que sea fácil alinear a los operadores, más fácil de leer y reconocer la variable, ya que los operadores de asignación y las posiciones de las variables no variarán mucho en las líneas y es más fácil para leer como "deja que la variable tenga algún valor".

Sin embargo, algunas personas prefieren decir "mover el valor x a y" y escribir la variable a la derecha.

    
respondido por el phuclv 05.11.2015 - 16:47
-1

Creo que sigue una forma lógica de pensar.
Primero tiene que haber un cuadro (variable), luego debes poner un objeto (valor) dentro de él.
No pones el objeto en el aire y luego pones una caja alrededor.

    
respondido por el Petruza 04.08.2011 - 05:21

Lea otras preguntas en las etiquetas