-
function(subprogram)의 linkage
-
function 호출하고 return 할 때
main() {
int x, y ,z;
z=30000;
x=100;
y=200;
a();
b();
..
}
a() {
c();
return;
}
- 함수 호출될때 필요한 것
- method로 pass될 parameter
- local 변수의 stack dynamic 할당
- 호출 프로그램 실행 상태 저장 → control flow 돌아와도 변수값이 살아있어야함
- control 이전, 리턴 처리
- subprogram이 nesting 지원하면 non local 변수에 접근하는 방법이 필요함
- 함수 리턴될 때 필요한 것
- EP: 현재 실행되고 있는 메모리의 시작값 (environment pointer)
- SP: 메모리의 최대 값 (stack pointer)

Implementing “simple” sub program
모든 함수는 main이 호출하고 main으로 돌아온다, stack 변수는 없다. (이미 공간 할당된 static 변수만 있다.)

- 구성요소
| Local Variable |
|---|
| Parameter |
| Return address |
Implementing Subprograms with Stack-Dynamic Local Variables
- static보다 stack dynamic일때 장점 2가지
- recursion 지원
- compiler가 암묵적으로 메모리 할당,해제 → 메모리 사용의 효율성
- 구성요소
| Local variables |
|---|
| Parameter |
| Dynamic Link |
| Return address |
- static scoping인 경우는 Static Link 필요
Nested Subprograms
- 함수 안에 함수 들어가거나, 블록 안에 변수 선언되는 경우 ⇒ stack 변수는 신경 써야함 (동적으로 base address가 결정되기 때문에, offset은 컴파일러가 미리 알려줌 하지만 어디서부터 offset을 더할지는 runtime에 결정됨)
- stack 변수 중 local 변수는 offset에 동적으로 EP 값을 더한 주소에 있음
- stack 중 non local 변수만 신경 쓰면 됨
- python처럼 함수안에 함수 있는 경우 함수는 모두 stack에 존재, inner function은 outer function의 변수에 접근 못함 → 그 변수가 사용되어있는 함수의 ARI 시작 주소를 알아야 함.
- 변수의 참조(reference) 결정하는 방법
- static scope
- dynamic scope
Dynamic Link
- 나를 호출하는 function의 base address(EP) 가리킨다.
- dynamic depth: 나를 호출하는 함수의 개수
- dynamic chain: dynamic link를 모아둔 것
Static Link
-
나를 포함하고 있는 function의 base address(EP) 가리킨다
-
static depth: 나를 둘러싸는 함수의 개수
-
static chain: static link를 모아둔 것
(N, offset): N은 나의 ARI base주소로부터 떨어진 값, link타고 N만큼 간 곳에 접근하면 있다는 뜻.
implementing blocks
- ARI에 static link, local variable만 있으면 됨
Dynamic scope 언어는 변수에 대한 주소 공간 관리를 어떻게 하는가?
- Deep Access: non local 변수 접근 방법, dynamic depth 사용, dynamic link 를 사용
- Shallow Access: 모든 변수에게 주소 공간 할당해 주는 것
Binding
- static → runtime 전, compile 시 결정
- dynamic → runtime에 결정