프로그래밍 언어론 6-1-2강(4). Assignments(할당) - 할당 연산자의 조합

[프로그래밍 언어론]

2019. 11. 11. 14:33

 

[단순 side effects의 문제점]

: 명령형 언어들은 side effects에 의존도가 높아 변수를 자주 update 한다.

a = a + 1;                   // 이와 같은 statements를 자주 볼수 있다.

b.c[3].d = b.c[3].d * e;

: 이러한 statement들은 쓰고 읽기 성가실뿐만 아니라, 중복된 주소 계산이 일어날수도 있다.

 

 

 

[중복 주소 계산(Redundant address calculation)]

: 만약 주소 계산이 side effect를 가지고 있다면(위와 같을떄), statement의 쌍을 대신 사용해야 한다.

A[index_fn(i)] = A[index_fn(i)] + 1   // 대신에 아래처럼 사용해야 한다.

j = index_fn(i);

A[j] = A[j] + 1

: 왜냐하면 index_fn 함수가 블랙박스일때 그 내부에서 side effect 하는지 모르므로 임시 변수 j를 사용해야한다.

 

# index_fn 함수내에서 side effect해서 원하던 결과 안나오는 예시

int index_fn(int i){

  static int n = 3;

  n++;

  return i + n;         // 이러면 이 함수 호출할때마다 return 값이 달라지게되서 문제 발생

 

 

 

[Assignment operator(할당 연산자)]

: 위와 같은 문제(clutter / 컴파일 or 실행 시점의 중복 주소 계산 / 반복 side effect 등)들을 제거하기 위해,

많은 언어들(Algol68부터 , C기반 언어들등)은 변수값을 update 하기위해 Assignment operator를 제공한다.

 

# 변수값 update를 위한 assignment operator 예시

a += 1;

b.c[3].d *= e;

A[index_fn(i)] += 1;

: 이와 같이 사용하면, 주소 계산이나 어떤 side effect들이 오직 한번만 일어나도록 보장해준다.

 

 

 

[C에서의 할당 연산자]

: C는 10가지의 할당 연산자를 제공하며, 후위 및 전위 증감 연산자를 제공한다.

 

# 간단한 후위 증감 연산자 예시

A[index_fn(i)]++;

++A[index_fn(i)];

 

# 증감 연산자 응용 예시(하지만 권장하지 않는 방법)

A[--i] = b;

*p++ = *q++;     //포인터 증감

 

# '+=' 과 '-=' 할당 연산자

 : 전위 표기법 '++'과 '--'를 더욱 쉽게 표현한 문법이다.

i-=1;      // '--i'와 동일한 의미

 

 

 

[Multiway assignment(동시 할당)]

: 특정 언어(Clu, Ml, Perl, Python, Ruby등)들에서 사용 가능한 방법이다.

a, b = c, d;                 // 동시할당. 동시에 여러 변수에 할당 가능

a, b = b, a                 // 이와같은 방식으로 swap 가능하게끔도 함

a, b, c = foo(d, e, f);    // 함수의 여러 tuple 값 return 하는것도 허용