PL

[PL] Names, Binding, Scope

서노리 2022. 4. 17. 23:04
반응형

변수(Variables)

변수는 컴퓨터 내의 메모리 조각(cell) 혹은 조각들의 모음이라고 생각하면 된다.

변수는 다음과 같은 속성들에 의해서 특징지어진다.

  • Name(이름)
  • Address(주소)
  • Value(값)
  • Type(타입)
  • Lifetime(생명주기)
  • Scope(유효범위)


Name(이름)

※ Design Issues

- 변수 명의 최대 길이는 얼마나 길게 할 것인가

- 대소문자를 구분할 것인가?

- 키워드(keyword)나 예약어(reserved word)를 변수명으로서 허용할 것인가?

 

※ Special words

- 키워드(keyword) : 프로그래밍 언어의 특정 상황에서 특별하게 동작하는 단어 ex) int, float, if ...

- 예약어(reserved word) : 변수 이름으로 사용할 수 없는 특별한 단어

 

Address(주소)

모든 변수는 메모리 주소를 갖는다. (레지스터 변수 제외)

즉, 주소는 메모리의 어디에 변수가 할당될 것인가에 대한 속성이다.

 

※ Aliase(별칭)

별칭은 C/C++의 포인터나 union처럼 같은 메모리를 두 개 이상의 이름으로 가리키는 개념을 의미한다.

매우 큰 크기의 struct를 함수의 매개변수로 넘겨주어야 할 때 포인터라는 별칭을 사용한다면 훨씬 효율적으로 동작할 수 있다. 

하지만 별칭은 readability와 reliability를 해친다는 단점이 있다.

Type(타입), Value(값)

변수는 그 값에 따라 타입이 결정된다. 또한 변수의 타입만 먼저 결정될 수 도 있다.타입은 변수의 범위와 변수가 처리할 수 있는 연산의 종류를 결정한다.

 

a = b + c 라는 문장이 있을 때 왼쪽에 있는 변수는 l-value(address) 값을 가진다고 하며오른쪽에 있는 변수는 r-value(value) 값을 가진다고 한다.


바인딩(Binding)

바인딩이란 변수의 속성들과 이름이 매칭되는 것을 말한다.

 

※ 바인딩 시점

  • 언어 설계 시점
  • 언어 구현 시점
  • 컴파일 시점
  • 링크 시점
  • 로드 시점

바인딩의 종류

  • 정적 바인딩(Static binding)
    : 컴파일 타임을 포함한 런타임 이전의 모든 바인딩으로, 프로그램이 실행되더라도 변하지 않는 속성들이 해당
    ex) 변수의 타입

  • 동적 바인딩(Dynamic binding)
    : 런타임 바인딩으로, 프로그램이 실행될 때마다 바뀌는 속성들이 해당
    ex) 변수의 주소 값

 

타입 바인딩(Type binding)

변수의 이름에 타입을 어떻게 명시하고 언제 할당되는지에 대한 것

 

정적 타입 바인딩(Static type binding)

명시적(explicit) 선언과 묵시적(implicit) 선언으로 나뉘는데 명시적 선언은 C언어에서 쓰는 방식으로, int a; 와 같이 그 타입을 직접 써주는 방식이다. 묵시적 선언은 선언문을 사용하지 않고 디폴트 규칙에 의해서 변수에 속성을 부여하는 방식이다.

 

 

동적 타입 바인딩(Dynamic type binding)

파이썬이나 자바스크립트에서 많이 쓰는 방식으로 변수의 타입을 명시적으로 선언하지 않고, 변수에 어떤 값을 대입하느냐에 따라 런타임에 변수의 타입이 정해지는 방식이다. 이런 경우 언어의 타입 추정에 의존적이라고 한다. 동적 타입 바인딩의 장점으로는 유연하다는 것이 있지만 런타임 타입체킹으로 성능이 떨어진다는 단점이 있다.

 

저장공간 바인딩(Storage binding)과 실행주기(Lifetime)

- 변수명에 메모리 cell을 바인딩하는 것으로 변수가 어느 공간에 할당되는지에 따라 그 생명주기가 달라진다.

- 생명주기란 변수가 특정 메모리에 할당되어 유지되는 기간이다.

 

lifetime에 따른 변수의 카테고리

  • Static variables
    : 전역 변수나 static 변수가 바인딩되는 방식으로 프로그램이 실행되기 전에 data 영역에 할당되어 프로그램 종료 시까지 할당 해제되지 않는다. 이러한 변수들은 히스토리를 유지시키며 동작하는 데 사용되며 따라서 재귀 함수 호출에는 적합하지 않다.

  • Stack-dynamic variables
    : 지역 변수가 바인딩되는 방식으로 함수가 호출되어 콜 스택에 쌓였을 때 메모리에 할당되고 함수가 종료되어 콜 스택에서 빠져나갈 때 메모리에서 할당 해제된다.

  • Explicit heap-dynamic variables
    :  C언어에서 calloc이나 malloc 함수를 통해 heap 영역에 동적 메모리 할당을 해주는 방식이다.

  • Implicit heap-dynamic variables
    : 동적 타입 바인딩되는 변수들이 할당되는 방식이다. 변수에 값이 배정될때만 heap 영역에 할당된다.

Scope(유효범위)

scope이란 변수를 읽고 쓸 수 있는 범위, 공간을 의미한다.

 

Scope Rule

  • Static Scope
    : 변수가 사용된 위치(블록)로부터 점점 범위를 넓혀 나가며 변수가 선언된 위치를 찾는 방식
    : 일반적으로 우리가 사용하는 프로그래밍 언어에서 적용되는 방식 

  • Dynamic Scope
    : 변수가 실행된 시점을 기반으로 하여 호출 관계를 넓혀 나가며 변수가 선언된 위치를 찾는 방식
int x = 10;

void B(){
    printf("%d", x); // 정적 바인딩의 경우 10, 동적 바인딩인 경우 20
}

void A(){
    int x = 20;
    B();
}

int main(){
    A();
    retrun 0;
}

 


 

반응형

'PL' 카테고리의 다른 글

[PL] Data types(2)  (0) 2022.04.18
[PL] Data types(1)  (0) 2022.04.18
[PL] 어휘분석과 구문분석(Lexical and Syntax Analysis)  (0) 2022.04.17
[PL] Semantic의 표현  (0) 2022.04.17
[PL] Syntax의 표현  (0) 2022.04.15