프로그래밍언어론 14강 - 활성 레코드와 비지역변수 참조 구현
서브프로그램 호출과 복귀에 필요한 자료·제어 흐름을 활성 레코드로 구현하는 원리를 학습한다. 정적 체인과 동적 체인을 이용한 비지역변수 참조, 디스플레이·변수 스택·중앙 테이블을 이용한 개선 방법을 비교하고, 과거 민감 서브프로그램과 코루틴의 실행 상태 유지 방식까지 살펴본다.
제1장 서브프로그램 연결과 활성 레코드
1. 서브프로그램 연결의 처리 순서
서브프로그램 연결은 서브프로그램의 호출과 복귀를 합쳐 부르는 말이다. 호출자는 자신이 수행하던 작업을 잠시 멈추고 피호출자에게 제어를 넘겼다가, 피호출자의 수행이 끝나면 원래 위치와 상태로 돌아와야 한다. 따라서 단순한 분기만으로는 충분하지 않고 제어 흐름과 자료 흐름을 함께 관리해야 한다.
호출 단계에서는 먼저 호출자의 상태를 저장하고, 피호출자가 사용할 인수를 전달하며, 호출 뒤 돌아올 복귀 주소를 저장한다. 그 다음 피호출자의 코드로 분기한다. 피호출자가 수행을 마치면 출력 모드나 입출력 모드의 형식인수 값을 호출자 쪽으로 복사하고, 함수라면 반환값을 전달한다. 마지막으로 저장했던 호출자의 상태를 복구하고 복귀 주소를 사용해 호출자로 돌아간다.
| 구분 | 주요 처리 |
|---|---|
| 호출 준비 | 호출자 상태 저장, 인수 전달, 복귀 주소 저장 |
| 제어 이전 | 피호출자의 코드로 분기 |
| 결과 전달 | 출력·입출력 형식인수 값 복사, 함수 반환값 전달 |
| 복귀 | 호출자 상태 복구, 복귀 주소로 제어 이동 |
2. 활성 레코드와 활성 레코드 인스턴스
활성 레코드는 수행 중인 서브프로그램의 데이터 부분이 저장되는 형태이다. 지역변수와 매개변수뿐 아니라 호출자의 상태 정보, 함수 반환값, 복귀 주소, 링크와 같은 관리 정보도 담는다. 활성 레코드는 서브프로그램 한 번의 실행을 지원하기 위한 데이터 틀이라고 이해할 수 있다.
활성 레코드 틀에는 어떤 종류의 필드가 어떤 위치에 놓일지가 정해져 있으며, 이 틀 자체는 정적으로 결정된다. 활성 레코드 인스턴스는 실제 호출이 일어났을 때 이 틀에 구체적인 인수, 지역변수 값, 주소 등이 들어간 상태이다. 호출 시점과 실행 상태에 따라 저장되는 구체적인 내용은 동적으로 결정된다.
핵심 구분: 활성 레코드는 저장 정보의 구조를 나타내는 정적인 틀이고, 활성 레코드 인스턴스는 특정 호출에 대응하여 실제 값이 채워진 동적인 실행 자료이다.
3. Fortran 77의 정적 할당
Fortran 77에서는 서브프로그램의 활성 레코드를 정적으로 할당한다. 각 서브프로그램의 코드와 데이터 영역을 고정된 위치에 마련할 수 있으므로 코드 부분과 데이터 부분을 스택처럼 따로 관리할 필요가 적다. 같은 서브프로그램의 실행 자료가 매번 같은 영역을 사용한다.
이 방식은 재귀 호출을 허용하기 어렵다. 재귀 호출이 일어나면 같은 서브프로그램의 새 호출이 이전 호출과 동일한 활성 레코드 영역을 사용하여 기존 지역변수, 매개변수, 복귀 주소를 덮어쓴다. 그러면 이전 호출로 돌아갈 정보가 사라지기 때문이다.
4. Algol 형태 언어의 동적 할당
Algol 형태 언어는 활성 레코드를 호출할 때마다 스택에 동적으로 생성한다. 활성 레코드가 갖는 필드의 종류는 비슷하지만 지역변수와 매개변수의 수가 다르므로 전체 크기는 서브프로그램마다 달라질 수 있다. 호출이 중첩되면 각 호출에 대응하는 인스턴스가 스택에 차례로 쌓이므로 재귀 호출도 지원할 수 있다.
활성 레코드의 각 필드는 프레임 포인터와 변위의 조합으로 참조한다. 프레임 포인터는 현재 활성 레코드의 기준 지점을 가리키고, 변위는 그 기준으로부터 원하는 필드까지 떨어진 정도이다. 활성 레코드에는 일반적으로 지역변수, 매개변수, 동적 링크, 정적 링크, 복귀 주소, 함수 반환값 등이 놓인다.
정적 링크는 피호출자의 정적 부모에 해당하는 가장 최근 활성 레코드의 프레임 포인터를 가리킨다. 동적 링크는 실제 호출자의 프레임 포인터를 가리킨다. 두 링크는 호출 경로와 소스 코드의 중첩 구조가 다를 때 서로 다른 활성 레코드를 가리킬 수 있다.
5. C 언어의 활성 레코드
C 언어는 표준적으로 함수 안에 다른 함수를 선언하는 서브프로그램 중첩을 허용하지 않는다. 따라서 정적 부모의 활성 레코드를 따라가 비지역변수를 찾기 위한 정적 링크가 필요하지 않다. C의 서브프로그램은 함수이므로 반환값을 위한 위치가 필요하고, 재귀 호출을 지원하기 위해 활성 레코드를 스택에 동적으로 생성한다.
팩토리얼 함수 fac가 자신을 재귀 호출하면 각 호출마다 매개변수 n, 동적 링크, 복귀 주소, 반환값 등을 가진 별도 활성 레코드 인스턴스가 만들어진다. 가장 안쪽 호출이 끝나면 스택에서 역순으로 복귀하면서 반환값을 전달한다.
| 구현 방식 | 할당 | 특징 |
|---|---|---|
| Fortran 77 | 정적 할당 | 고정된 실행 자료 영역을 사용하며 재귀 호출을 허용하지 않음 |
| Algol 형태 언어 | 스택에 동적 할당 | 중첩 서브프로그램과 재귀 호출을 지원하며 정적·동적 링크 사용 |
| C | 스택에 동적 할당 | 함수 중첩이 없어 정적 링크가 필요 없고 반환값 필드가 필요함 |
제2장 정적 체인과 동적 체인
1. 체인과 지역변위
동적 체인은 활성 레코드 스택에서 인접한 동적 링크들을 연결한 것이다. 각 동적 링크가 실제 호출자를 가리키므로 호출 순서를 나타내는 리스트 형태가 된다. 정적 체인은 정적 링크들을 연결한 것으로, 프로그램 원문에 나타난 정적 중첩 관계를 반영하며 전체적으로 트리 형태의 구조를 이룬다.
지역변위는 프레임 포인터에서 스택 동적변수의 위치까지 떨어진 정도이다. 참조할 변수가 들어 있는 올바른 활성 레코드만 찾으면, 그 레코드의 프레임 포인터에 지역변위를 적용하여 실제 변수 위치를 찾을 수 있다.
2. 비지역변수 참조와 영역 규칙
비지역변수는 현재 수행 중인 서브프로그램의 지역 활성 레코드가 아니라 다른 활성 레코드에 존재한다. 정적 영역 규칙에서는 소스 코드의 정적 중첩 관계에 따라 변수의 선언을 결정하므로 정적 체인을 활용한다. 동적 영역 규칙에서는 실제 호출 순서에 따라 가장 가까운 선언을 찾으므로 동적 체인을 활용한다.
정적 영역에서는 컴파일할 때 어떤 정적 영역의 변수를 참조하는지 결정할 수 있다. 반면 동적 영역에서는 실제 호출 경로가 달라지면 같은 이름이 다른 활성 레코드에서 선택될 수 있으므로, 참조할 비지역변수를 컴파일 시간에 하나로 확정하기 어렵다.
3. 정적 깊이와 체인변위
정적 깊이는 자신을 감싸는 정적 영역의 개수, 즉 정적 영역의 중첩 깊이이다. 최외곽 Main의 정적 깊이가 0이고, Main 안에 선언된 Sub1과 Sub3의 정적 깊이는 1이다. Sub1 안의 Sub2와 Sub3 안의 Sub4는 정적 깊이 2이다.
체인변위는 비지역변수를 참조하는 영역의 정적 깊이에서 그 변수가 선언된 영역의 정적 깊이를 뺀 값이다. 정적 체인을 몇 번 따라 올라가야 하는지를 나타낸다. 변수 참조는 (체인변위, 지역변위)의 쌍으로 표현할 수 있다. 체인변위가 0이면 현재 활성 레코드의 지역변수이고, 1이면 정적 링크를 한 번 따라간 정적 부모의 변수이다.
예를 들어 정적 깊이 2인 Sub2에서 정적 깊이 1인 Sub1의 변수 A를 참조하면 체인변위는 1이다. 정적 깊이 0인 Main의 변수 B를 참조하면 체인변위는 2이다. Sub3에서 D를 참조하려 해도 D는 형제 영역인 Sub1 안에 선언되었으므로 정적 체인상 조상에서 찾을 수 없어 오류가 된다.
정적 체인 주소: 비지역변수의 위치는 `(참조 영역의 정적 깊이 - 선언 영역의 정적 깊이, 선언 레코드 안의 지역변위)`로 표현한다. 체인변위가 클수록 정적 링크를 더 많이 따라가므로 참조 비용도 커진다.
4. 정적 링크의 설정
서브프로그램을 호출할 때 피호출자의 정적 링크는 피호출자의 정적 부모에 해당하는 가장 최근 활성 레코드를 가리키도록 설정한다. 정적 부모는 소스 코드에서 피호출자를 직접 감싸고 있는 영역이다. 재귀나 여러 호출이 있을 수 있으므로 정적 부모의 여러 인스턴스 중 현재 활성 상태인 가장 최근 레코드를 선택해야 한다.
정적 부모의 최근 활성 레코드를 찾는 한 방법은 동적 링크를 계속 거슬러 올라가면서 적합한 레코드를 찾는 것이지만 비효율적이다. 더 나은 방법은 호출자와 피호출자의 정적 깊이 차이를 이용해 정적 체인을 필요한 만큼 따라가는 것이다.
5. 정적 체인 방법의 장단점
정적 체인은 각 활성 레코드에 정적 링크 하나만 추가하면 되므로 구현이 쉽고 공간 낭비가 적다. 지역변수나 가까운 정적 부모의 변수는 적은 링크 이동으로 찾을 수 있다.
반면 체인변위가 큰 비지역변수는 여러 정적 링크를 순서대로 따라가야 하므로 시간 부담이 커진다. 변수마다 선언 영역까지의 거리가 다르므로 비지역변수 참조 시간도 일정하지 않다.
6. 동적 체인과 깊은 참조
동적 영역 규칙에서는 찾는 이름의 변수가 나올 때까지 동적 링크를 거슬러 올라간다. 이 방식을 깊은 참조라고 한다. 같은 이름이라도 실제 호출 순서에 따라 먼저 만나는 활성 레코드가 달라질 수 있으므로 참조하는 비지역변수도 달라질 수 있다.
예를 들어 sub1이 sub2를, sub2가 sub3을 호출했다면 sub3에서 c를 찾을 때 동적 체인을 따라 바로 호출자인 sub2의 c를 만난다. a는 sub3과 sub2에 없으므로 더 올라가 sub1의 a를 찾는다.
동적 체인을 따라 이름을 비교해야 하므로 활성 레코드에 변수의 이름 정보도 저장해야 한다. 링크를 여러 번 이동하고 이름을 검색하는 비용이 발생하므로 단순한 깊은 참조는 비효율적일 수 있다.
| 구분 | 연결 기준 | 용도 | 형태 |
|---|---|---|---|
| 정적 체인 | 소스 코드의 정적 부모 | 정적 영역 규칙의 비지역변수 참조 | 전체적으로 트리 |
| 동적 체인 | 실제 호출자 | 동적 영역 규칙의 비지역변수 참조 | 호출 스택상의 리스트 |
제3장 디스플레이를 이용한 정적 영역 구현
1. 디스플레이의 구조
디스플레이는 정적 체인을 대체하여 비지역변수 참조 부담을 줄이는 방법이다. 현재 수행 중인 블록과 그 블록의 모든 정적 조상에 대한 활성 레코드 포인터를 별도의 스택에 관리한다. 정적 링크를 하나씩 따라가지 않고 정적 깊이를 색인으로 사용하여 원하는 조상의 활성 레코드에 곧바로 접근한다.
현재 수행 중인 서브프로그램의 정적 깊이가 p라면 디스플레이에는 깊이 0부터 p까지 총 p+1개의 항목이 존재한다. 각 항목은 해당 정적 깊이에서 현재 접근 가능한 가장 최근 활성 레코드를 가리킨다.
2. 디스플레이를 이용한 변수 참조
디스플레이 방식의 변수 위치는 (디스플레이변위, 지역변위)로 표현한다. 디스플레이변위는 원하는 활성 레코드 포인터가 디스플레이에 저장된 위치를 나타내는 색인값이며, 찾는 변수가 선언된 서브프로그램의 정적 깊이와 같다.
먼저 디스플레이변위를 색인으로 사용해 변수를 포함한 활성 레코드를 선택하고, 그 레코드의 프레임 포인터에 지역변위를 적용해 변수의 위치를 선택한다. 정적 체인처럼 선언 영역까지의 모든 링크를 순차적으로 방문하지 않으므로 먼 정적 조상의 변수도 일정한 수의 접근으로 찾을 수 있다.
3. 호출과 복귀 시 디스플레이 관리
피호출자의 정적 깊이가 q라면 호출 시 기존 디스플레이 항목 D[q]를 피호출자의 새 활성 레코드 안에 백업한다. 그 다음 새 활성 레코드의 포인터를 D[q]에 저장한다. 이렇게 하면 그 깊이에서 가장 최근에 활성화된 레코드를 디스플레이가 가리킨다.
피호출자가 복귀할 때는 현재 활성 레코드에 백업해 둔 이전 D[q] 값을 디스플레이에 복원한다. 호출 때 갱신하고 복귀 때 복원해야 이전 정적 환경으로 정확히 돌아갈 수 있다.
4. 정적 체인과 디스플레이 비교
| 작업 | 정적 체인 | 디스플레이 |
|---|---|---|
| 지역변수 참조 | 비슷한 비용 | 비슷한 비용 |
| 가까운 비지역변수 참조 | 한 단계라면 디스플레이와 비슷함 | 색인으로 직접 접근 |
| 먼 비지역변수 참조 | 여러 링크를 따라가야 함 | 멀리 떨어진 경우 유리함 |
| 서브프로그램 호출 | 정적 깊이 차이가 작으면 유리함 | 정적 깊이 차이가 크면 유리함 |
| 서브프로그램 복귀 | 상수 시간이며 약간 빠름 | 상수 시간이지만 백업 복구 필요 |
디스플레이는 비지역변수 참조 시간을 정적 거리에 덜 민감하게 만들지만, 호출과 복귀 때 항목을 백업하고 복원해야 한다. 따라서 항상 한 방식이 절대적으로 우수한 것이 아니라 호출 빈도, 정적 깊이 차이, 비지역변수 참조 패턴을 함께 고려해야 한다.
정적 체인의 체인변위는 “정적 링크를 몇 번 따라갈지”를 뜻하지만, 디스플레이변위는 “디스플레이의 어느 색인에 접근할지”를 뜻한다. 이름은 비슷해도 탐색 방식이 다르다.
제4장 동적 영역의 얕은 참조 구현
1. 얕은 참조의 개념
동적 체인을 이용한 깊은 참조는 비지역변수를 찾을 때까지 링크와 변수 이름을 계속 검사해야 한다. 이를 개선하는 얕은 참조는 지역변수와 비지역변수를 별개의 방식으로 찾지 않고, 참조 가능한 모든 변수 정보를 하나의 직접 접근용 자료구조 안에서 관리한다.
얕은 참조의 대표 구현에는 변수 스택 방법과 중앙 테이블 방법이 있다. 두 방식 모두 현재 동적 호출 환경에서 같은 이름으로 실제 사용할 수 있는 가장 최근 변수를 빠르게 찾는 것을 목표로 한다.
2. 변수 스택 방법
변수 스택 방법은 변수 이름마다 별도의 스택을 둔다. 각 스택에는 그 이름의 변수를 선언한 현재 활성 레코드의 포인터가 저장된다. 새 서브프로그램이 호출되어 같은 이름의 변수를 선언하면 해당 이름의 스택에 새 활성 레코드 포인터를 넣고, 복귀할 때 꺼낸다.
변수를 참조할 때는 그 이름의 스택 꼭대기만 확인하면 현재 동적 환경에서 가장 가까운 선언을 바로 찾을 수 있다. 예를 들어 sub1과 sub2가 모두 c를 선언하고 sub2가 활성 상태라면 c 스택의 꼭대기는 sub2의 활성 레코드를 가리킨다.
3. 중앙 테이블 방법
중앙 테이블 방법은 각 변수 이름에 대해 현재 사용할 수 있는지 나타내는 활성 플래그와 실제 값을 하나의 표에 저장한다. 참조 시 이름으로 중앙 테이블의 항목을 찾으면 현재 값에 직접 접근할 수 있다.
새 서브프로그램이 이미 활성화된 이름의 변수를 다시 선언하면 기존 활성 플래그와 값을 은닉 스택에 백업하고 새 값을 중앙 테이블에 놓는다. 서브프로그램이 복귀하면 은닉 스택에서 이전 정보를 꺼내 중앙 테이블을 복원한다. 이렇게 하면 동적 영역의 이름 은폐와 복원을 구현할 수 있다.
| 방법 | 핵심 구조 | 변수 참조 | 호출·복귀 관리 |
|---|---|---|---|
| 동적 체인 깊은 참조 | 활성 레코드와 동적 링크 | 이름을 찾을 때까지 링크를 순회 | 일반 호출 스택 관리 |
| 변수 스택 | 변수 이름별 활성 레코드 포인터 스택 | 해당 이름 스택의 꼭대기 확인 | 선언 시 push, 복귀 시 pop |
| 중앙 테이블 | 이름·활성 플래그·값을 담은 하나의 표 | 중앙 항목에 직접 접근 | 기존 활성 값을 은닉 스택에 백업·복원 |
제5장 상태를 유지하는 서브프로그램
1. 과거 민감 서브프로그램
과거 민감 서브프로그램은 이전 호출의 내용을 기억하는 서브프로그램이다. 일반적인 지역변수는 호출이 끝나 활성 레코드가 제거되면 값도 사라지지만, 과거 민감 서브프로그램에서는 상태 정보의 일부가 종료 뒤에도 유지되어 다음 호출에 영향을 준다.
전역변수에 상태를 저장하면 쉽게 구현할 수 있지만 다른 코드도 그 값에 접근할 수 있어 정보 은닉이 보장되지 않는다. 정적 지역변수를 사용하면 서브프로그램 내부에서만 접근하게 하면서 호출 사이에 값을 유지할 수 있어 정보 은닉을 보장한다.
2. 코루틴
코루틴은 여러 개의 진입 위치를 스스로 관리하는 서브프로그램이다. 수행을 중단할 때 현재 위치를 기억해 두었다가 다음에 재개(resume)되면 과거 중단 위치부터 계속 수행한다. 이를 위해 코루틴의 활성 레코드는 중단 중에도 삭제되지 않고 유지되어야 한다.
일반적인 호출자와 피호출자 관계는 호출자가 피호출자에게 제어를 넘기고 피호출자가 호출자에게 복귀하는 비대칭 관계이다. 코루틴들은 서로 대등하게 제어를 주고받는 대칭적 제어 모델을 사용한다. 여러 코루틴이 번갈아 수행되므로 실제 병렬 실행이 아니더라도 유사병행성을 표현할 수 있다.
강의에서는 Simula 67, BLISS, InterLISP, Modula-2, Python을 코루틴 지원 언어의 예로 제시한다. 코루틴은 생산자-소비자 시뮬레이션, 카드 게임 시뮬레이션처럼 여러 주체가 자신의 진행 상태를 유지하며 번갈아 동작하는 분야에 유용하다.
구분 포인트: 과거 민감 서브프로그램은 호출이 끝난 뒤에도 일부 상태를 기억하는 특성에 초점을 둔다. 코루틴은 활성 레코드와 중단 위치를 유지하고 대등한 상대와 제어를 주고받으며 재개되는 실행 방식이다.
핵심 개념 정리
서브프로그램 연결은 호출자 상태 저장, 인수와 복귀 주소 전달, 피호출자 수행, 결과 전달, 상태 복구와 복귀의 전 과정이다. 활성 레코드는 이 과정에 필요한 지역변수·매개변수·반환값·복귀 주소·링크 등을 저장하는 틀이고, 실제 값이 채워진 것은 활성 레코드 인스턴스이다.
정적 링크는 정적 부모의 최근 활성 레코드를, 동적 링크는 실제 호출자의 활성 레코드를 가리킨다. 정적 체인은 정적 영역 규칙에, 동적 체인은 동적 영역 규칙에 사용된다. 정적 체인의 변수 참조는 체인변위와 지역변위로 표현하고, 동적 체인의 깊은 참조는 이름을 찾을 때까지 호출자 방향으로 이동한다.
디스플레이는 현재 블록과 모든 정적 조상의 활성 레코드 포인터를 정적 깊이별로 저장하여 먼 비지역변수에 직접 접근한다. 호출할 때 해당 깊이의 항목을 백업하고 새 레코드 포인터로 바꾸며, 복귀할 때 백업 값을 복원한다.
동적 영역의 얕은 참조에는 이름별 활성 레코드 포인터를 쌓는 변수 스택과, 이름·활성 플래그·값을 한 표에서 관리하고 은닉 스택으로 이전 값을 보존하는 중앙 테이블이 있다.
과거 민감 서브프로그램은 이전 호출의 일부 상태를 기억한다. 코루틴은 여러 진입 위치와 중단 상태를 유지하고 대칭적으로 제어를 주고받으며, 번갈아 실행되는 유사병행성을 제공한다.
비지역변수 구현 문제는 “어떤 활성 레코드를 선택할 것인가”와 “그 레코드 안에서 어느 위치를 찾을 것인가”로 나누어 생각할 수 있다. 정적 체인·디스플레이는 정적 중첩 관계를, 동적 체인·변수 스택·중앙 테이블은 동적 호출 관계를 구현하며, 선택한 방법에 따라 참조 속도와 호출·복귀 관리 비용이 달라진다.
예상문제 20선
1. 서브프로그램 연결에 포함되지 않는 처리는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
서브프로그램 연결은 호출과 복귀에 필요한 제어·자료 흐름 관리이다. 모든 변수를 전역화하는 처리는 이에 포함되지 않는다.
2. 활성 레코드 인스턴스에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
활성 레코드 틀은 정적으로 결정되지만, 실제 호출의 인수·지역값·주소가 들어간 인스턴스는 실행 중 동적으로 생긴다.
3. Fortran 77의 정적 활성 레코드 할당이 재귀 호출을 허용하기 어려운 이유는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
고정된 활성 레코드를 재사용하면 재귀의 새 호출이 이전 호출의 지역값과 복귀 정보를 덮어써 정상적으로 돌아갈 수 없다.
4. Algol 형태 언어에서 활성 레코드 필드의 위치를 참조하는 조합은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
프레임 포인터가 활성 레코드의 기준 지점을 가리키고, 변위가 그 기준에서 필드까지의 거리를 나타낸다.
5. 정적 링크와 동적 링크를 바르게 설명한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
정적 링크는 소스 코드의 중첩 관계를, 동적 링크는 실행 중 실제 호출 관계를 연결한다.
6. C 언어의 활성 레코드에 정적 링크가 필요하지 않은 주된 이유는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
표준 C에서는 함수 안에 다른 함수를 중첩 선언하지 않으므로 정적 부모의 활성 레코드를 찾는 정적 링크가 필요하지 않다.
7. 동적 체인의 연결 기준은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
동적 링크는 실제 호출자를 가리키므로 동적 체인은 현재 호출 스택의 호출 관계를 리스트처럼 연결한다.
8. 정적 깊이에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
정적 깊이는 소스 코드에서 한 영역을 둘러싼 정적 영역의 수이며 최외곽 영역은 보통 0이다.
9. 정적 깊이 2인 영역에서 정적 깊이 0인 영역의 변수를 참조할 때 체인변위는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
체인변위는 참조 영역의 정적 깊이 2에서 선언 영역의 깊이 0을 뺀 값이므로 2이다.
10. 정적 체인 방법의 장점은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
정적 링크 하나로 정적 조상을 연결하므로 구현이 단순하고 공간 부담이 작다. 다만 먼 변수는 여러 링크를 따라야 한다.
11. 동적 체인을 따라 변수 이름을 찾을 때까지 거슬러 올라가는 방법은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
깊은 참조는 동적 링크를 순차적으로 따라가며 현재 호출 환경에서 가장 가까운 같은 이름의 변수를 찾는다.
12. 현재 수행 중인 서브프로그램의 정적 깊이가 p일 때 디스플레이 항목 수는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
깊이 0의 최외곽부터 현재 깊이 p까지의 정적 조상 포인터가 필요하므로 총 p+1개이다.
13. 디스플레이변위가 나타내는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
디스플레이변위는 변수가 선언된 정적 깊이와 같으며, 그 깊이의 활성 레코드 포인터를 선택하는 색인이다.
14. 정적 깊이가 q인 피호출자를 호출할 때 디스플레이 관리 순서는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
호출 때 해당 깊이의 이전 포인터를 보존하고 새 활성 레코드를 가리키게 한다. 복귀 때 보존한 값을 다시 복원한다.
15. 정적 체인과 비교할 때 디스플레이가 특히 유리한 경우는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
디스플레이는 정적 깊이를 색인으로 사용해 먼 조상의 레코드에도 직접 접근하므로 체인변위가 큰 참조에 유리하다.
16. 얕은 참조의 특징으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
얕은 참조는 지역·비지역을 구분해 체인을 검색하지 않고, 변수 스택이나 중앙 테이블에서 현재 사용할 변수를 바로 찾는다.
17. 변수 스택 방법에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
각 이름의 스택 꼭대기가 현재 동적 환경에서 사용할 가장 가까운 선언의 활성 레코드를 가리킨다.
18. 중앙 테이블에서 이미 활성화된 이름의 변수가 다시 선언될 때 필요한 처리는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
새 변수가 기존 이름을 가리는 동안 이전 값을 은닉 스택에 보존하고, 서브프로그램 복귀 때 다시 중앙 테이블로 복원한다.
19. 과거 민감 서브프로그램을 정보 은닉까지 보장하며 구현하는 방법은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
정적 지역변수는 호출 사이에 값을 유지하면서도 해당 서브프로그램 내부에서만 접근하게 하므로 정보 은닉을 보장한다.
20. 코루틴의 특징으로 옳지 않은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
코루틴은 일반 함수의 비대칭 호출 모델과 달리 대등한 코루틴 사이에서 제어를 주고받는 대칭적 제어 모델을 사용한다.
댓글
댓글 쓰기