할당 연산자는 왜 왼쪽에 할당합니까?


47

최근에 친구 프로그래밍을 가르치기 시작했습니다 (파이썬을 사용하고 있습니다). 변수 생성과 대입 연산자에 대해 논의하기 시작했을 때, 그녀는 오른쪽의 값이 왜 왼쪽이 아닌 왼쪽의 이름에 할당되는지 물었습니다. .

나는 그것이 자연스럽게 보였기 때문에 그것에 대해 너무 많이 생각하지 않았지만, 그녀는 왼쪽에서 오른쪽이 그녀에게 더 자연스럽게 보인다고 말했습니다. 그것이 대부분의 사람들이 자연 언어를 읽는 방식이기 때문입니다.

나는 그것에 대해 생각하고 (프로그래머가 재사용해야 할) 할당 된 이름이 왼쪽에 정렬되어 쉽게 표시되므로 코드를 훨씬 쉽게 읽을 수 있다고 결론지었습니다.

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

반대로 :

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

# What were the names again...?

이제이 표준에 대한 다른 이유가 있는지 궁금합니다. 그 뒤에 역사가 있습니까? 아니면 이것이 좋은 옵션 인 기술적 인 이유가 있습니까 (컴파일러에 대해 많이 알지 못함)? 그리고 오른쪽에 할당 된 프로그래밍 언어가 있습니까?


15
R 은 오른쪽 ( value -> variable)에 할당 할 수 있습니다 .
당신은

아마도 이것은 변수 이름이 잘못 되었기 때문일까요? 'numAligned는 2'이고 'chickensLeft는 2 + 5'는 어떻습니까?
Job

18
친구의 이름이 ... 요다입니까?
Adrian

1
그녀가 이것에 대해 고민하기 시작하면 C ++ & co를 볼 때 그녀가 어떻게 할 것인지 궁금합니다.
BlackBear

3
참고 사항 : Khan Academy에는 초보자 프로그래머를위한 Python 관련 강의가 있습니다 : khanacademy.org/#computer-science , Google에는 고급 기술이 있습니다. code.google.com/edu/languages/google-python-class/set- up.html
lindon 여우

답변:


56

Dipa @paxdiablo. 초기 프로그래밍 언어는 수학자에 의해 작성되었습니다. 실제로는 모두 언어였습니다. 수학에서, 그녀의 독자적인 원칙에 의해 왼쪽에서 오른쪽으로 읽는 것은 그것이 작동하는 방식에 의미가 있습니다.

x = 2y-4.

수학에서는 다음과 같이 말합니다. x를 2y -4와 같게하십시오.

또한 대수 에서도이 작업을 수행합니다. 변수의 방정식을 풀면 풀고 자하는 변수를 왼쪽으로 분리합니다. 즉, y = mx + b;

또한 C 계열과 같은 전체 언어 계열에 특정 구문이 있으면 변경하는 데 비용이 많이 듭니다.


19
@FarmBoy : 수학에서, 대입과 평등은 컴퓨터에있는 것처럼 수식에 시퀀스가 ​​없기 때문에 같은 것입니다. (a는 b와 동시에 b는 a와 동일)
Petruza

1
Erlang과 같은 단일 할당 기능 언어를 제외한 @FB. 할당과 평등 보장은 수학과 동일합니다
Peer Stritzinger

18
수학 할당과 평등에서 @Petruza No는 같은 것이 아닙니다. 'Let x = 2y-3'이라고 말하면 'Thus x = 2y-3'과 다릅니다. 수학은 일반적으로 상황에 따라 다릅니다. 저를 반박하는 의견은 보편적으로 호평을 받았기 때문에 박사 학위를 가지고 있다고 언급하겠습니다. 수학에서는 이것에 대해 확신합니다.
Eric Wilson

2
나는 박사 학위 근처의 어느 곳에서나 수학을 모른다. 내가 말하는 것은 과제의 양쪽이 될 수있는 프로그래밍과 달리 과제가 같거나 평등이 모두 수학에서 실행 순서가 없다는 것입니다 어떤 시점에서는 달라지고 결국 다른 시점에서는 동등하게됩니다. 그러나 수학에서는 let a be...시간이없는 것과 같은 과제에서 과제의 양쪽이 동일하기 때문에 과제는 실제로 평등입니다. 왜 두 사람이 같은 부호를 사용하는지 궁금하지 않습니다.=
Petruza

5
@Petruzza - 그러나이 있다 순차성. 수학 문서는 다른 문서와 마찬가지로 처음부터 끝까지 작성됩니다. x = 11 장에서 주장 하지만 x = 22 장에서 주장한다면 , 그것은 끔찍한 모순이 아닙니다. 각 주장은 특정 맥락 내에서만 적용됩니다. 명령형 프로그래밍의 차이점은 부분적으로 장벽을 제거하고 (컨텍스트를 변경할 필요가 없음) 부분적으로 구현 및 유용성에 관한 것입니다.
Steve314

26

BASIC가장 초기의 컴퓨터 언어 중 하나는 다음과 같은 "적절한"형식이었습니다.

10 LET AREA = HEIGHT * WIDTH

"H를 객체 높이로 설정"과 같이 변수를 지정하는 수학적 사고 방식과 일치합니다.

COBOL또한 그 COMPUTE진술 과 비슷했습니다 . 여러 가지 일을하는 것처럼 여러 언어를 통해 이루어진 결정은 단순히 임의의 결정일 수 있습니다.


7
프로그램 라인이 "작업"이 아닌 "문"으로 간주 될 때이 형식이 더 자연 스럽다고 생각합니다. 마찬가지로, I declare that X must equal THIS대신 더 선형의Evaluate THIS and store it in X
voithos

잠깐, 기본은 '초기'컴퓨터 언어였습니까?
Alex Feinman 18

2
@Alex 1960 년대부터 시작된 것을 고려할 때, 그것은 꽤 이른 것이라고 말할 것입니다.
벤 리차드

1
반면에 COBOL에서는을 쓸 수 MULTIPLY HEIGHT BY WIDTH GIVING AREA있으므로 결과를 얻는 변수는 명령문의 오른쪽에 있습니다.
user281377

25

실제로, 오른쪽에 할당되는 프로그래밍 언어가 있습니다 : TI-BASIC ! 뿐만 아니라 할당 연산자로 '='를 사용하지 않고 "STO"연산자로 알려진 화살표를 사용합니다.

예 :

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

위의 예에서 세 개의 변수가 선언되고 값이 지정되었습니다. A는 5, B는 8, C는 -3입니다. 첫 번째 선언 / 할당은 'store 5 as A'로 읽을 수 있습니다.

TI-BASIC이 이러한 시스템을 할당에 사용하는 이유는 그것이 계산기의 프로그래밍 언어이기 때문이라고 생각합니다. TI 계산기의 "STO"연산자 는 숫자를 계산 한 후 일반 계산기 작업에 가장 많이 사용되었습니다 . 만약 사용자가 기억하고 싶은 숫자라면, "STO"버튼을 눌렀을 것이고, 계산기는 그들에게 이름을 물어볼 것입니다.

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

사용자는 원하는대로 변수 이름을 지정할 수 있습니다. 알파 잠금을 켜고 이름을 입력 한 다음 "STO"를 누르면 "Ans"키를 누르는 것이 정상적인 작업에는 너무 번거 롭습니다. TI-BASIC에서 모든 계산기 기능을 사용할 수 있으므로 다른 작업을 "STO"로 추가하여 동일한 작업을 수행 할 수는 없었지만 대부분의 다른 언어와 비교할 때 역전되었습니다.

(일화 : TI-BASIC은 내가 배운 첫 번째 언어 중 하나이므로 대학에서 Java를 처음 배울 때 LEFT에 배정하는 것이 독특하고 '뒤로'인 것처럼 느꼈습니다!)


+1 나는 그것을 완전히 잊었다! TI Basic도 제 첫 언어 였지만이 세부 사항은 기억 나지 않습니다.
barjak

실제로 STO 운영자는 기계 작동 방식과 언어 작동 방식에 더 가깝습니다. 값이 먼저 계산 된 다음 메모리에 저장됩니다.
Kratz

15

휴리스틱 스 1 : 언어를 디자인 할 때 어떤 일을하는 두 가지 이상의 가능한 방법에 직면 할 때 가장 일반적이고 가장 직관적 인 언어를 선택하십시오. 그렇지 않으면 Perl +로 끝납니다.

자, 그것은 어떻게 더 자연 스럽습니까 (적어도 영어 사용자에게는)? 우리가 영어로 글을 쓰거나 말하는 방법을 봅시다 :

Steven은 이제 10 살입니다 (10 살의 Steven과는 반대로). 나는 190 파운드 이상 무게를 (다 (190 파운드가 넘는 무게와 달리).

코드에서 :

steven = 10
i > 190

다음은 또한보다 자연스럽게 들립니다.

"메리가 18 세라면 사탕을 먹을 수 있습니다." "만약 21 세 미만이라면 형제에게 데킬라를 부탁 할 것입니다."

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

보다:

"만약 18 세 메리라면 ..." "21 세가 내 나이보다 크면 ..."

이제 코드 :

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

이것은 프로그래머 나 영어 사용자 모두에게 자연스럽지 않습니다. 문장은 yoda-speak처럼 들리며 코드는 yoda-conditions입니다. 이것들은 C ++에서 도움이 될 수 있지만 대부분의 사람들이 동의 할 것이라고 확신합니다. 컴파일러가 무거운 작업을 수행하고 요다 조건의 필요성을 완화시킬 수 있다면 인생은 조금 더 쉬울 것입니다.

물론 어떤 것에도 익숙해 질 수 있습니다. 예를 들어, 숫자 81은 다음과 같이 작성됩니다.

Eighty One (영어) Eighty and One (스페인어) One and Eighty (독일어).

마지막으로 4가 있습니다! = "그린 사과가 테이블에 놓여있다"는 러시아어의 24 가지 유효한 방법- 'on'이 'table'과 함께 있어야한다는 점을 제외하고 순서 (거의)는 중요하지 않습니다. 예를 들어, 러시아어를 모국어로 사용하는 사람이라면 글을 쓰는지 a = 10또는 10 = a둘 다 똑같이 자연스러워 보이 더라도 신경 쓰지 않아도 됩니다.

언어학은 매혹적인 주제이지만, 저는 공식적으로 그것을 연구 한 적이 없으며 많은 언어를 모릅니다. 잘만되면 나는 충분한 반례를 제공했다.


4
... 그리고 프랑스어로 81은 "네 번 스물 하나"라고합니다 ... :)
Martin Sojka

1
@Martin, 나는 덴마크어가 매우 유사하다고 생각합니다.
CVn

7
네 번 이십일이 84이기 때문에 @Martin 즉, 정말 이상 해요
피터 올슨

6
@ 피터 : 당신은 당신의 괄호를 잘못 가지고있어, 그것은(four times twenty) one
SingleNegationElimination

4
@Job : "18 세 Mary가 ...이라면"이라는 문구를 읽으면서 필자는 요다가 "100 세가되면 도달하지 않을 것 같지 않습니까?" 제다이의 귀환 :-)
joriki

11

그것은 1950 년대에 FORTRAN으로 시작되었습니다. FORTRAN이 FORmula TRANslation의 약어 인 경우, 문제의 공식은 규칙에 따라 항상 왼쪽에 할당되는 간단한 대수 방정식입니다.

반면에 현대 COBOL은 영어와 비슷하고 오른쪽에 할당되었습니다 (주로!).

MOVE 1 TO COUNTER.
ADD +1 TO LINE-CNT.
MULTIPLY QTY BY PRICE GIVING ITEM-PRICE.

나는 이것이 일반적인 영어 사용자가 읽을 수 있지만 올바른 할당이있는 언어의 컨텍스트를 완벽하게 설명하기 때문에 여기에서 가장 좋은 예라고 생각합니다. 나는 영어로 말하는 많은 사람들이 과제를 이해하기 위해 왼쪽에서 오른쪽으로 만 읽을 것이기 때문에 이것이 중요하다는 것을 말하고 있습니다.
여호수아 헤지스

5

@ diceguyd30이 지적했듯이 두 가지 표기법이 있습니다.

  • <Identifier> = <Value>" 식별자값이 되도록 함"을 의미합니다 . 또는 변수를 확장하려면 : 변수 식별자Value로 정의 (또는 재정의)하십시오 .
  • <Value> -> <Identifier>" 식별자에 저장"을 의미합니다 . 또는이를 확장하려면 : Identifier로 지정된 위치에 Value 를 입력하십시오 .

물론, 일반적으로 식별자를 말하면 실제로 L 값이 될 수 있습니다.

첫 번째 방법은 변수의 추상 개념을 따르고, 두 번째 방법은 실제 스토리지에 관한 것입니다.

첫 번째 방법은 할당이없는 언어에서도 일반적입니다. 또한 변수 정의 및 할당이 상대적으로 가까운 것을주의 <Type> <Identifier> = <Value><Identifier> = <Value>.


3

이미 언급했듯이 모든 초기 컴퓨터 언어는 그렇게 잘 작동했습니다. 예를 들어 FORTRAN은 BASIC보다 몇 년 전에 나왔습니다.

대입 식의 왼쪽에 대입 된 변수를 갖는 것은 실제로 의미가 있습니다. 일부 언어의 경우 SAME NAME에 여러 가지 다른 오버로드 된 루틴이있을 수 있으며 다른 유형의 결과를 리턴합니다. 컴파일러가 할당 된 변수의 유형을 먼저 볼 수있게하여 어떤 오버로드 된 루틴을 호출할지 또는 정수에서 부동 소수점으로 변환 할 때 생성 할 암시 적 캐스트를 파악합니다. 약간 간단한 설명이지만 아이디어를 얻길 바랍니다.


2
나는 당신의 설명을 이해하지만 컴파일러가 진술이 끝날 때까지 미리 볼 수 없었습니까?
voithos

그것은 오늘날의 언어에서 어휘 분석기를 더 단순하게 만들 수 있지만, 이런 종류의 구문이 새로워 졌을 때 메소드 오버로드는 물론, 명명 된 메소드를 지원하는 프로그래밍 언어는 몇 개입니까?
CVn

2
안녕하세요 @voithos. 예-컴파일러는 미리 볼 수 있지만 컴파일러 작성 초기에는 수용 할 수없는 수준의 복잡성이 있었을 것입니다. 종종 수작업으로 코딩 된 어셈블러였습니다! 할당 된 변수를 왼쪽에 두는 것이 실용적인 선택이라고 생각합니다. 사람과 기계 모두 파싱하기가 더 쉽습니다.
Dave Jewell

과제를 오른쪽에 할당하는 것은 사소한 일이라고 생각합니다. 3 + 4 == 6 + 7과 같은 표현식의 경우 언어가 재귀 적으로 정의되므로 연산자가 있기 전에 양쪽이 모두 평가됩니다. 'variable = expression'언어 요소를 'expression = variable'로 쉽게 변경할 수 있습니다. 모호한 상황을 유발하는지 여부는 나머지 언어에 따라 다릅니다.
Kratz

@Kratz-그것은 지금 컴파일러에게는 사실이지만 토큰 화 된 소스로 작동하는 매우 오래된 해석 언어에는 약간의 문제가있을 수 있습니다. OTOH, 그것은 왼쪽에 변수가 아닌 오른쪽에 변수를 선호했을 것입니다.
Steve314

3

초기 파싱 알고리즘의 남은 부분 일 수 있습니다. LR 파싱은 1965 년에 발명 된 것임을 기억하십시오. LL 파서는 그 당시 기계의 시간 및 공간 제한 내에서 문제를 겪었을 수도 있습니다. 치다:

identifier = function();
function();

두 개는 두 번째 토큰과 명확하게 구분됩니다. 반면에

function() = identifier;
function();

재미 없어. 할당 표현식을 중첩 할 때 상황이 악화됩니다.

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

물론, 기계를 명확하게 이해하기 쉽다는 것은 사람이 명확하게 이해하기 쉽다는 것을 의미합니다. 또 다른 쉬운 예는 주어진 식별자의 초기화를 검색하는 것입니다.

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

쉬워요, 그냥 왼쪽을보세요. 반면에 오른쪽

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

특히 grep카드를 펀칭 할 수없는 경우 원하는 식별자를 찾기가 훨씬 어렵습니다.


정확히 내가 생각했던 요점입니다.
voithos

2

어셈블리 언어 는 목적지를 왼쪽 opcode의 일부로 갖습니다. 고급 언어는 이전 언어의 규칙을 따르는 경향이있었습니다.

=(또는 :=Pascalish dialects) 를 볼 때 ,로 발음 is assigned the value하면 왼쪽에서 오른쪽으로 이해할 수 있습니다 (대부분의 언어에서 왼쪽에서 오른쪽으로 읽기 때문에). 프로그래밍 언어는 주로 왼쪽에서 오른쪽으로 읽는 사람들에 의해 개발 되었기 때문에 관습이 고착되었습니다.

경로 의존성 유형입니다 . 컴퓨터 프로그래밍이 히브리어 나 아랍어 (또는 다른 오른쪽에서 왼쪽으로 쓰는 언어)를 사용하는 사람들이 발명 한 경우, 목적지를 오른쪽에 놓을 것으로 의심됩니다.


그렇습니다.하지만 편집자의 글도 잘
맞을

8
어셈블리 언어에 대해서는 그렇게 일반화 할 수 없습니다. 대상 피연산자가있는 위치에 따라 다릅니다.
quick_now

2
@quickly_now : 맞습니다; 사실, 대부분의 원시 기계 언어 (오늘날 표준에 따라 어셈블러조차 포함하지 않음)에는 일반적으로 하나 또는 두 개의 범용 어큐뮬레이터가 있기 때문에 대상이 없었습니다. 대부분의 작업은 소스 (누산기)가 아닌 메모리 주소 만 지정한 'store'opcode를 제외하고 누산기를 대상으로 암시했습니다. ALGOL과 같은 언어의 할당 구문에 영향을 미친다고 생각하지 않습니다.
Javier

3
@Tangurena- 일부 어셈블러 언어는 왼쪽에 대상이 있습니다. 아니 , 오피 코드 (즉, 조립 된 오브젝트 코드입니다)하지만, 명령 니모닉에 대한 인수 목록의 왼쪽의. 그러나 다른 사람들은 오른쪽에 목적지가 있습니다. 68000 어셈블러에서는 mov.b #255, d0예를 들어 어디에 d0레지스터를 할당 할 것인지를 쓴다 . 오래된 어셈블러는 명령 당 하나의 인수 만 갖습니다. 6502 LDA #255(Load Accumulator)에서는 A왼쪽에 있지만 STA wherever(Store Accumulator) 에는 왼쪽에 있다고 주장 할 수 있습니다.
Steve314

2
또한 인텔 4004 (8086과 8080 사이의 8086 제품군의 4 비트 최종 조상)도 고급 언어로 할당 된 후에 개발 되었습니다 . 8086 시리즈가 50 대 및 그 이전에 어셈블러가 한 일을 대표한다고 가정한다면, 그것이 사실인지 의심 할 여지가 많습니다.
Steve314

2

가치있는 것을 위해 COBOL의 대부분의 문장은 왼쪽에서 오른쪽으로 읽으므로 두 피연산자가 먼저 이름이 지정되고 목적지는 다음과 같이 마지막으로 지정 multiply salary by rate giving tax됩니다.

그러나 나는 당신의 학생이 COBOL을 선호 할 것이라고 제안하지 않을 것입니다. 왜냐하면 내가 그렇게 낮고, 부끄럽지 않고, 맛이없는 의견을 낸 것에 대해 (정말로) 기뻐할 것입니다! :-)


1

그녀는 왼쪽에서 오른쪽이 그녀에게 더 자연스러워 보인다고 말했다.

나는 이것이 실수라고 생각합니다. 한편으로, "10을 x에 할당"또는 "10을 x에 이동"이라고 말할 수 있습니다. 한편, "x를 10으로 설정"또는 "x는 10이된다"라고 말할 수 있습니다.

즉, 동사의 선택에 따라 할당 대상 변수가 주제 일 수도 있고 아닐 수도 있고 왼쪽에있을 수도 있고 아닐 수도 있습니다. 따라서 "자연스러운 것"은 전적으로 과제를 표현하기 위해 습관적으로 선택하는 문구에 달려 있습니다.


0

의사 코드에서 할당 연산자는 일반적으로 오른쪽에 작성됩니다. 예를 들어

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

Casio 계산기에서 프로그래밍 할 수없는 변형도 할당 변수가 오른쪽에 표시됩니다

A+2B → C

Forth에서 변수도 오른쪽에 있습니다.

expression variable !

x86에서 인텔 구문은 왼쪽에 대상이 있지만 GAS 구문은 순서를 반대로하여 많은 사람들에게 혼동을줍니다. 이 지침은 두 가지 방언에서 동일합니다.

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

둘 다 rbx의 값을 rax로 이동합니다. 다른 어셈블리 언어는 GAS처럼 오른쪽에 목적지를 작성하는 것으로 알고 있습니다.

일부 플랫폼은 왼쪽에 표현식을, 오른쪽에 변수를 배치합니다.

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

https://en.wikipedia.org/wiki/Assignment_%28computer_science%29#Notation

대부분의 언어는 값을 왼쪽에 할당합니다. 할당 연산자와 변수의 위치가 줄에 따라 크게 다르지 않기 때문에 연산자를 정렬하기 쉽고 변수를 쉽게 읽고 인식 할 수있는 이유 중 하나입니다. "변수를 어떤 가치로 삼으십시오".

그러나 어떤 사람들은 "가치 x를 y로 이동"이라고 말하고 오른쪽에 변수를 쓰는 것을 선호합니다.


-1

나는 그것이 논리적 사고 방식을 따른다고 생각합니다.
먼저 상자 (변수)가 있어야하고 그 안에 개체 (값)를 넣습니다.
공중에 물건을 넣지 말고 상자를 넣으십시오.


2
네 그렇습니다. 대부분의 언어에서 오른쪽은 왼쪽보다 먼저 평가됩니다.
Javier

3
그것은 "길의 오른쪽에 운전"유형의 것입니다. 그것은 논리적이지만 보이지만 항상 당신이했던 방식 때문입니다. 모든 우월한 나라는 좌파로 운전합니다.
James Anderson

1
@JamesAnderson 우수 국가? : o
nawfal

당신이 옳습니다, 그것은 왼쪽에서 오른쪽으로 쓰는 시스템이 로마 알파벳으로 논리적 일뿐입니다.
Petruza
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.