[단순 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 하는것도 허용 |
'[프로그래밍 언어론]' 카테고리의 다른 글
프로그래밍 언어론 6-1-3강(2). 초기화 동적 확인(Dynamic Checks) (0) | 2019.11.15 |
---|---|
프로그래밍 언어론 6-1-3강. 초기화(Initialization) (0) | 2019.11.15 |
프로그래밍 언어론 6-1-2강(3). Assignments(할당) - Orthogonality(직교성) (0) | 2019.11.10 |
프로그래밍 언어론 6-1-2강(2). Assignments(할당) - Boxing (0) | 2019.11.08 |
프로그래밍 언어론 6-1-2강(1). Assignments(할당) - 참조와 변수 (0) | 2019.11.08 |