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]
'ComputerScience > Principle of programing language' 카테고리의 다른 글
PL7. Syntax Analysis - bottom up parsing (0) | 2023.10.27 |
---|---|
PL6. Syntax Analysis - top down parsing (0) | 2023.10.06 |
PL5. Dynamic semantics : Axiomatic (0) | 2023.10.04 |
PL4. Dynamic semantics : Operational, Denotational (0) | 2023.09.27 |
PL3. Static semantic (0) | 2023.09.15 |