단순 서브프로그램과 활성 레코드
호출 한 번에 기억해 둘 것은 몇 가지일까?
단순 서브프로그램
조건을 가장 쉽게 잡습니다
가장 쉬운 경우부터 봅니다. 함수 안에 함수가 없고, 지역 변수가 모두 정적 변수이고, 재귀가 없는 서브프로그램입니다. 이것을 단순 서브프로그램(simple subprogram)이라고 합니다.
서브프로그램은 함수처럼 이름을 붙여 부르는 코드 묶음입니다. 정적 변수와 재귀는 4강에서 본 말입니다.
호출 동작
부를 때 네 단계
단순 서브프로그램의 호출은 네 단계입니다. 호출자의 실행 상태를 저장하고, 매개변수를 넘기고, 반환 주소를 넘긴 뒤, 제어를 넘깁니다.
호출자는 부른 쪽, 피호출자는 불린 쪽입니다. 실행 상태는 어디까지 했는지와 계산하던 값, 반환 주소는 돌아올 곳, 제어는 지금 실행하는 자리입니다.
반환 동작
돌아올 때도 네 단계
반환 때는 값부터 돌려줍니다. 돌려줄 매개변수의 값을 실 매개변수로 옮기고, 함수라면 반환값을 호출자가 가져갈 수 있는 곳에 둡니다. 그다음 실행 상태를 되돌리고 제어를 돌려줍니다.
실 매개변수는 호출할 때 넣은 변수입니다. ①은 값을 돌려주는 매개변수(8강)가 있을 때만 합니다.
기억해 둘 것
담아 둘 자리가 다섯
이 일을 해내려면 다섯 가지를 담아 둘 자리가 필요합니다. 상태 정보, 매개변수, 반환 주소, 함수의 반환값, 임시 변수입니다.
임시 변수는 식을 계산하는 도중의 값을 잠깐 담는 자리입니다.
두 부분
그대로인 부분, 바뀌는 부분
실행 중인 서브프로그램은 두 부분으로 나뉩니다. 실제 코드인 코드 부분과, 지역 변수처럼 실행 중에 바뀌는 데이터를 담는 비코드 부분(non-code part)입니다.
1편의 예시 코드입니다. *는 곱하기이고, r이 2일 때의 값을 따라갔습니다.
활성 레코드
형식과, 그 형식대로 만든 실제 칸
비코드 부분에 무엇을 어떤 순서로 둘지 정한 형식을 활성 레코드(activation record)라고 합니다. 호출 한 번에 대해 그 형식대로 값이 담긴 실제 칸 묶음이 활성 레코드 인스턴스(activation record instance)입니다.
값은 앞 카드의 예시를 이었습니다. 반환 주소 칸의 main은 main으로 돌아간다는 뜻입니다.
다음 편