정적 체인의 유지와 평가

새 인스턴스의 정적 링크는 누가, 어디로 이어 줄까?

호출 때

링크 두 개를 채워야 합니다

중첩 서브프로그램을 부를 때는 링크 두 개를 이어야 합니다. 동적 링크는 바로 아래의 부른 쪽을 가리키면 됩니다. 정적 링크는 정적 부모의 가장 최근 인스턴스를 찾아야 합니다.

정적 부모는 코드에서 자기를 바로 둘러싼 함수입니다. 인스턴스는 호출 한 번의 칸 묶음입니다.

방법 하나

동적 체인을 뒤져서 찾습니다

첫째 방법은 동적 체인을 따라 내려가며 정적 부모의 인스턴스가 나올 때까지 찾는 것입니다. sub1의 정적 부모는 bigsub이므로, sub3과 sub2를 지나 bigsub에서 멈춥니다.

동적 체인은 6편에서 본, 동적 링크를 이은 사슬입니다. 실행 중에 찾아야 하므로 시간이 듭니다.

방법 둘

호출도 변수처럼 다룹니다

sub3(깊이 3)이 sub1을 부릅니다. sub1은 bigsub(깊이 1) 안에 선언됐습니다. 3 − 1 = 2, 정적 링크를 두 번 건너가면 bigsub의 인스턴스에 닿고, 그곳을 새 인스턴스의 정적 링크로 잇습니다.

정적 깊이: 몇 겹 안쪽에 선언됐는지(7편). 건너갈 횟수는 코드만 보고 실행 전에 구할 수 있습니다.

평가 ①

깊이 들어갈수록 느려집니다

정적 체인에는 약점이 둘 있습니다. 첫째, 바깥 변수는 체인 오프셋만큼 정적 링크를 건너가야 닿습니다. 중첩이 깊고 변수가 멀리 있을수록 느립니다.

체인 오프셋은 7편에서 본, 정적 링크를 건너갈 횟수입니다. 세 경우는 예시입니다.

평가 ②

코드를 고치면 비용도 바뀝니다

둘째, 걸리는 시간을 미리 어림하기 어렵습니다. 코드를 고쳐 중첩 깊이가 바뀌면 같은 변수를 읽는 비용도 달라집니다. 정해진 시간 안에 끝나야 하는 시간 제약 코드(time-critical code)에서는 곤란합니다.

함수 이름 outer, f, g는 예시입니다.

정리

두 체인은 하는 일이 다릅니다

동적 체인은 누가 불렀는지를, 정적 체인은 코드에서 누가 둘러싸고 있는지를 따라갑니다. 정적 스코프 언어에서 바깥 변수를 찾는 길은 정적 체인입니다.

정적 스코프는 4강에서 본, 코드에 적힌 구조로 변수를 찾는 규칙입니다.

다음 편

남은 것은 블록과 동적 스코프입니다

9편중괄호 안의 변수는 어디에 둘까? 9강 목록