스택 동적 지역 변수
호출마다 새로 쌓는 칸에는 무엇이 들어 있을까?
스택에 쌓는다
부르면 쌓이고, 끝나면 걷힙니다
요즘 언어는 대부분 지역 변수를 스택 동적 변수로 둡니다. 호출마다 그 호출의 칸 묶음(활성 레코드 인스턴스)을 실행 시간 스택(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에 다시 넣으면 제자리로 돌아갑니다.
청록색 화살표가 동적 링크입니다. 칸에 든 것은 위치이고, 화살표는 그 위치를 그림으로 나타낸 것입니다.
다음 편