Memory Organization (Stack)
Run-Time Stack
run-time stack이란 call stack이라고도 불리며, 한 함수를 call 할 때마다 생성되는 프레임이나 activation record이 구성하는 스택을 말한다.
Activation record
함수를 수행하기 위한 execution environment으로 스택의 한 칸을 의미한다.
Activation record에는 로컬 변수와 인자, 리턴값, 기타 임시 저장소(3-addr code에서 사용)를 의미하고, 재귀문일 때에도 각 call마다 하나씩 스택에 Activation record를 넣는다.
run-time stack의 연산은 아래와 같다.
- f 가 호출되면 f의 frame을 stack에 push (호출)
- f가 return되면 f에 대한 frame을 pop-up (리턴, 반환)
이때 스택의 Top frame은 현재 수행중인 함수의 frame이다.
Stack Pointers
스택이 아래로 자란다고 했을 때 stack에 push하는 경우 top 주소가 수행 중 증가한다.
이때, 프로그램 별로 크기가 다르기 때문에, 어디서부터 어디까지가 스택의 top인지를 표기하기 위해 시작과 끝지점을 타나내는 두 개의 포인터를 사용한다.
- Stack pointer (SP): frame top을 가리킨다.
- Frame pointer (FP): frame base를 가리킨다. base pointer라고도 불린다.
이때 두 개의 포인터를 사용하는 이유는, 보통 변수에 접근할 때 사용하는 주소가 절대 주소가 아닌 일정한 위치로부터 offset 만큼 떨어져 있는 주소, 즉 상대주소로 찾아간다. 따라서 두 개의 포인터를 사용하는 경우 둘 중 가까운 포인터를 기준으로 offset를 구할 수 있어 offset의 크기가 최대 절반까지로 줄어든다.
그러나 임시변수의 생성과 free가 많아 SP는 가변적이기 때문에 보통은 FP를 기준으로 접근한다.
위 사진에서 연두색으로 칠해진 부분이 디스크에서 존재하는 프로그램이다.
이때 데이터 부분에서 색칠되지 않은 글로벌 변수가 존재하는데, 이는 초기화 되지 않은 전역 변수이기 때문이다.
위의 스택의 회색 부분에서 enviroment를 미리 넣어주며, 이 부분에서 main() 함수를 호출할 수 있다.
'Computer Science > 컴파일러개론(Compiler)' 카테고리의 다른 글
[컴개/CI] IR Translation: Storage Management (0) | 2023.12.14 |
---|---|
[컴개/CI] IR Translation to 3-addr Code(Statement/Nested Expressions) (0) | 2023.12.14 |
[컴개/CI] IR Translation to 3-addr Code (Statement) (0) | 2023.12.14 |
[컴개/CI] IR Translation to 3-addr code (0) | 2023.12.14 |
[컴개/CI] 3-address code: 예제 2 (0) | 2023.12.14 |