스택 동적 지역 변수

호출마다 새로 쌓는 칸에는 무엇이 들어 있을까?

스택에 쌓는다

부르면 쌓이고, 끝나면 걷힙니다

요즘 언어는 대부분 지역 변수를 스택 동적 변수로 둡니다. 호출마다 그 호출의 칸 묶음(활성 레코드 인스턴스)을 실행 시간 스택(run-time stack)에 쌓고, 반환하면 걷습니다.

스택 동적 변수는 4강에서 본, 함수가 불리면 스택에 칸이 생기고 끝나면 사라지는 변수입니다.

활성 레코드의 모양

이번에는 네 영역

스택 동적 지역 변수를 쓰면 활성 레코드는 네 영역이 됩니다. 아래부터 반환 주소, 동적 링크(dynamic link), 매개변수, 지역 변수입니다.

이 강의가 따르는 교재의 C 예제입니다. float는 소수 타입, int는 정수 타입, list[5]는 정수 다섯 개짜리 배열입니다. 동적 링크가 필요한 까닭은 이 편 끝에서 봅니다.

형식과 크기

순서는 미리, 크기는 그때

활성 레코드의 형식, 곧 어떤 영역이 어떤 순서로 놓이는지는 실행 전에 정해집니다. 하지만 크기는 실행 중에 정해질 수 있습니다. 그래서 인스턴스의 크기는 호출마다 다를 수 있습니다.

칸 수는 예시입니다. 길이가 실행 중에 정해지는 배열이 지역 변수일 때 이렇게 됩니다.

환경 포인터

EP는 지금 실행 중인 곳을 짚습니다

인스턴스 안의 변수를 쓰려면 그 인스턴스가 스택 어디에 있는지 알아야 합니다. 그 위치를 담는 것이 환경 포인터(environment pointer), 줄여서 EP입니다.

교재 예제입니다. main이 fun1을, fun1이 fun2를 부릅니다. 포인터는 칸의 위치를 담는 값입니다.

문제

돌아갈 때 EP를 어디로 내릴까

fun2가 끝나면 EP는 fun1 인스턴스의 바닥으로 돌아가야 합니다. 그런데 인스턴스의 크기가 호출마다 다를 수 있어, 몇 칸을 내려야 하는지 미리 정해 둘 수 없습니다.

동적 링크

부를 때 적어 두면 됩니다

호출할 때 그때의 EP 값을 새 인스턴스에 적어 둡니다. 이 칸이 동적 링크입니다. 부른 쪽 인스턴스를 가리키므로, 반환할 때 이 값을 EP에 다시 넣으면 제자리로 돌아갑니다.

청록색 화살표가 동적 링크입니다. 칸에 든 것은 위치이고, 화살표는 그 위치를 그림으로 나타낸 것입니다.

다음 편

호출과 반환의 단계가 조금 늘어납니다

5편부른 쪽과 불린 쪽은 일을 어떻게 나눌까? 9강 목록