CS/Programming Language

Stack Memory

WakaraNai 2022. 11. 20. 01:03
728x90
반응형

Static Binding: 객체의 타입이 컴파일 시에 결정될 때

Dynamic Binding: 런타임 시에 결정될 때

 

 

Imperative Lanuages: 메모리 위치를 그대로 노출 시킨다

"변수의 메모리 위치에 그 값을 저장하는 식" store

- int a = 0

 

Functional Lanuage: 메모리 위치를 숨긴다

"변수를 그 값에 연결하는 식" bind

- a = 0;

그래서 파이썬은 Dynamic하게 처리할 수 있다.

숫자를 담은 변수에 문자열을 담을 수 있다는 것

이로 인해 정리가 잘 안 되면 상대적으로 느릴 수 있다

 

 

Activation records

function activation : 함수가 한 번 호출되어서 return 문이 나오기 전까지 메모리에 남음 (activation of the function)

activation-specific variable: (dynamic & automatic)그 동안만 잠깐 생겼다가 사라지는 변수들

 

stack 상에 생겼다가 사라지는 건 static 변수이지만

default가 dynamic==auto

 

아래 예시에서 dynamic 변수인 i는 1을 유지하지만

static 변수 j는 계속 증가한다.

왜 그럴까?

!! scope와 lifetime은 다르다 !!

 

text segment, static segment는 코드만 보고 바로 올라감

heap segment와 stack segment가 함수가 호출되면서 생김

일반 지역 변수는 stack에 저장된다

 

static 변수는 붙박이 마냥 static segment(data 영역)에 위치함

data 영역은프로그램 시작할 때 할당되며 프로그램 종료 시까지 소멸되지 않음

 

int i, dynamic 변수는 stack에 생긴다고 하자 (클래스 변수라면 heap에 생긴다)

 

그래서 static은 붙박이처럼 원래 있던 값에서 계속 살아남고 덧셈이 이뤄지지만

stack에 올라간 dynamic 변수는 지워지고 새롭게 다시 초기화 되기 때문에 0에서 +1 되는 연산이 반복되는 것이다

(push pop을 반복한 연산)

 

그래서 static 변수는 객체가 사라져도 계속 메모리에 남아있다

그래서 클래스 변수라고 부른다.

 

 

 

 

 

 

 

Stacks of activation records

activation records: 한 함수를 호출하면 그것이 activation record로 올라가는데, 그 안에서 생성된 정보들이 담겨 있음

return 주소, 함수 내에서 생성된 변수들의 주소와 값들이 stack 영역에 들어간다는 것

재귀가 아니라면 이 내용은 static(data영역)으로 들어가도 됨. push pop할 필요가 없음

 

static allocation: stack 메모리 영역에 

 

 

 

단점은, 재귀함수 시에서 함수가 끝나지 않아서 리턴되지 못하면 계속 쌓이게 됨

그리고 multithredading도 못함

그래서 stack segment가 필요없다는 걸 사람들이 깨닫게 됨

 

 

재귀를 지원하기 위해 activation records를 쌓을 수 있는 곳을 만들어씀

dynamic allocation이라고 activation record가 함수 호출 시 할당되는 방식

리턴을 만나면 삭제됨

 

 

그래서 stack of activation records란 stack frame에 호출되어 push하고 반환되어 pop하는 것

func(int x, int y) {
	int a;
    int b[3];
    // no other auto variables 
   }
  
  
...

func(72, 73);

 

strck frame management

 

pushing
popping

 

 

 

ML 재귀함수로 예시를 들면...

 

 

 

 

Nesting Function definition

함수 안에 정의한 작은 함수를 의미함

c, python 모두 지원함

 

그럼 이런 함수들은 스택에 어떻게 올라갈까?

 

nesting link가 들어감. 그러나 복잡해지기에 좋지 않음... 이를 더 중첩한다면 윽

(free variable이 생겨나게 됨)

 

 

 

quick sort

pivot 기준으로 작은 건 왼쪽 큰 건 오른쪽으로 split

그래서 양 옆으로 quicksort로 재귀함수 호출

 

'

 

 

multiple levels of nesting

multiple levels of nesting에 대한 3가지의 해결책

1. nesting link in activation records

2. display: nesting links not in activation records, but collected in a single static array

3. Lambda lifting (closure conversion): Problme references replaced by refernces to new, hidden prameter

    - 즉 free vairables를 local function definition으로부터 제거하는 과정

(코드를 밖으로 끄집어내는 식으로 사람이 새로 작성하는 것...)

 

함수를 parameter로 넣었을 때의 문제점

link가 끊길 수 있다!!

 

 

728x90
반응형

'CS > Programming Language' 카테고리의 다른 글

ㄴㄹㄴㄹ  (0) 2022.11.22
Expression  (0) 2022.11.21
Semantic Analyzer: Polymorphism  (0) 2022.11.15
Semantics Analyzer : Type  (0) 2022.11.11
ML: Higher-order Functions  (0) 2022.11.11