5. Activation Records
Memory Layout
Text : 프로그램의 코드를 저장하는 부분이다.
Data : global 변수를 저장하는 부분이다.
Stack : 파라미터, local 변수가 저장된다.
Heap : 동적으로 할당되는 부분이 저장된다.
여기서 stack영역에 저장되는 함수의 정보를 stack frame이라고 하고 마지막 위치를 SP(stack pointer)로 표시해준다.
SP아래의 부분은 garbege로 간주되고 stack에서 push를 하게 되면 sp에 1을 빼고 pop을 하면 1을 더해주는 방식으로 동작한다.
Stack Frame Organization
모든 컴파일러가 사용하는 표준 레이아웃 체계를 지정한다.
어떻게 구성하고 배치할지는 규칙을 통해서 정한다.
Registers
레지스터는 메모리보다 빠르기 때문에 가능하면 레지스터에 값을 저장하도록 해야한다.
- calling convention
▪ Caller-saveregisters: 호출한 함수가 저장하는 레지스터로 호출 후에도 필요하면 저장한다.
callee는 저장 없이 사용이 가능하다.
▪ Callee-saveregisters: 호출 된 함수가 저장하는 레지스터로 원래 값 복원을 위해 callee의 현재값을 스택에 저장한다.
Nested Functions with Returned Function
ml과 같은 언어는 nested된 함수를 사용할 수 있다.
위의 예시를 보면 함수f에서 x가 local variable이기 때문에 내부 함수g에서 연산한 결과를 stack에 저장하게 되면 return을 할 때 사라지게 된다. 따라서 이러한 경우는 g값을 heap에 저장하여 return을 해도 값이 보존되게 해야한다.
Static Links
어떤 언어는 neated function이 가능하고 함수는 밖에 있는 함수의 stack frame에 접근이 가능하다.
이때 dynamic link는 caller의 stack frame이고 복원에 사용하고, static link는 parent의 stack frame으로 변수 접근시 사용한다.