-
초기화
지정문이 변수에 값을 넣는 방법을 제공하기 때문에 명령형 언어에서 꼭 변수를
선언할 때 초기값을 넣을 방법을 제공해야 하는 것은 아니다. 그러나 적어도 두
가지 이유에서 초기값은 매우 유용하다.- 정적으로 할당되는 변수의 경우 선언에서 지정된 초기값은 컴파일러에 의해 메모리에 의해 바로 기록될 수 있다.
지정문에 의해 초기값이 설정되면 그 수행(로드, 스토어)을 위한 비용 발생
- 초기화 되지 않은 변수의 값 사용 오류를 막아준다.
배열 인덱스 값이 잘못되는 문제가 C에서 종종 일어난다.
변수가 쓰레기값을 가지는 경우 테스트에서 검출되지 않는다.초기화를 하면 변수의 메모리가 할당될 때 초기화 하기 때문에 지정에 의한 값보다 성능상 유리하다.
스택객체는 초기화 되지 않는다. 함수 호출과 리턴시 메모리 상태를 그대로 유지한다.
함수호출시 SP만 올리는것으로 비용이 줄어드는데, 끊임 없는 함수 호출이 이루어 지면 할당된 지역변수들을 매변 지우고 올렸다가 하고, 0으로 초기화 시키기 때문에 성능상 손해이다.
대부분의 기계에서는 대부분의 타입에 대해 초기화되지 않은
값을 잡아내는 실행 시간의 비용이 상대적으로 높다. 변수가 차지한 메모리의 모든 가능한 비트 패턴이 다 유효한 값이라면 별도의 비트를 할당하여 초기화 여부를 표시해야 할 것이다. 이 플래그는 실현 시점에 "초기화 안됨"으로 표시하고
지정할 때마다 “초기화됨”으로 표시되어야 한다.또한 모든 사용부에서 초기화되어 있는가 여부를 검사를 해야 할 것이다.
이러한 동적 의미 검사는 인터프리터에는 제공되고 있다. 인터프리터언어는 이미 모든 변수의 접근마다 상당한 계산을 수행해야 하기 때문에 문제가 되지 않지만, 컴파일언어는 이러한 비용문제가 발생하기 때문에 수행되지 않는다.
계산순서
피연산자가 계산되는 순서는 정해져 있지 않다. 우선순위와 결합규칙은 연산자간 순서만 결정한다.
가련 a - f(b) - c * d 수식이 있다고 하자.
우리는 a - f(b)와 c * d중 어느것이 먼저 수행되는지 알 수 없다.
서브루틴에서 여러개의 아규먼트가 있는 경우에도 이는 동일하다.순서는 여러가지 면에서 중요하다.
부수효과를 가지는 경우가 있기때문이다.
f(a, g(b), c)가 있다고 하자. 첫 식에서 f(b)가 d를 수정한다면 전체 수식의 결과는 앞쪽의
빼기를 먼저 해서 f(b) 호출 후에 c * d를 계산하느냐 아니면 그 반대이냐에
따라 달라질 것이다. 마찬가지로 두 번째 식에서 g(b)가 a나 c를 수정한다면 f(a, g(b), c)에서 f에게 넘어가는 값이 아규먼트의 계산 순서에 따라 달라지게 된다.또한 코드개선 측면에서 중요하다. 부분 수식의 계산 순서는 레지스터 할당과 명령문 스케쥴링에
영향을 미친다. 수식 a * b + f(c)에서 a * b를 계산하기 전에 f를 호출하는
것이 더 나을 수 있다. 왜냐하면 a * b의 곱을 나중에 쓰기 위해 레지스터에
저장해 두려고 하는데 f가 생각보다 많은 레지스터를 필요로 해서 모든 레지스터를 다 사용해야 한다면 우리는 a * b의 값을 가진 레지스터를 어딘가(메모리)에 백업한 후 호출이 끝나면 다시 복구해야 한다.728x90'프로그래밍언어론' 카테고리의 다른 글
제어흐름- 반복과 재귀 (0) 2023.05.31 제어흐름 - 구조적 흐름과 선택 (0) 2023.05.30 서브루틴과 제어 추상화 (1) 2023.05.22 제어흐름-수식1 (0) 2023.04.15 현대의 컴파일 (0) 2023.04.15