본문 바로가기

ComputerScience/Principle of programing language

PL8. Names, Bindings and Scopes

728x90

dynamic binding : local variable이 runtime(execution)에 메모리와 binding되고 언제든 할당된 주소가 바뀔 수 있다.

static binding : static variable이 load time(before runtime)에 binding되고 프로그램 실행 중에 할당 주소가 바뀌지 않는다.

 

explicit declaration : int a 처럼 명시적으로 타입과 변수를 선언하는 것

implicit declaration : explicit declaration 없이 변수를 사용

 

dynamic type binding : my_list = [1,2,3], 명시적인 타입 선언 없이 컴파일러/인터프리터가 value를 보고 알아서 추론

stack-dynamic : 메모리 stack영역에 declaration statement가 elaborated될 때마다 할당된다. recursion이 가능. int a라고 하면 4byte의 메모리 공간을 잡아준다.

explicit heap-dynamic : 메모리 heap영역에 명시적으로 할당/해제 한다. new/delete

implicit heap-dynamic : 메모리 heap영역에 알아서 할당/해제된다.

void function1() {
	void function2() {
    	int x = 3
    	function3()
    }
    void function3() {
    	int y = x
    }
    int x = 5
    
    // function3() -> y = 5
    // function2() -> y = 3
}

가장 가까운 곳에서 변수를 찾음, 그 상위의 변수는 hidden

while 밖에 count는 while 안으로 들어오면 hidden된다.


 

- file.c : int b = 1

- file2.c : extern int b 

c에서는 이렇게 서로 다른 파일에 있는 전역 변수를 선언해서 쓸 수 있다.

 

- python 에서는 함수안에서 global a라고 다시 선언해줘야지만 사용할 수 있다.


- static scoping의 경우 

sub2()가 big()안에서 호출되었다고 해보자.

sub2: x가 local에 없음 -> static parent인 big()에서 x를 찾음 -> y=3

(즉 local 변수 + 해당 statement한테 visible한 변수들)이 referencing environment이다.

 

- dynamic scoping의 경우

호출 sequence에 따라서 scoping이 달라진다.

big -> sub1 -> sub2 순서대로 호출되었다고 해보자.

sub2는 x의 위치를 찾는다. -> sub1에서 찾아본다 x=7임 그럼 sub2의 y는 7이다.

이런 방식의 스코핑의 경우 big의 모든 변수가 하위 호출 함수들에게는 전역변수인 셈이된다.

(즉 local변수 + 모든 active subprogram에 있는 visible한 변수들)이 referencing environment이다.

 

- static scope 분석

point2 : a,b from sub1 ,c,g

point3 : c from sub2, a, b, g

- dynamic scope 분석 (main -> sub2 -> sub1) 순으로 호출

 

scope와 lifetime은 비슷해보이지만 약간의 차이가 있다.

 

 

 

named constant 

const int len = 10

int* p = new int[len]  // or int arr[len]

728x90
반응형