영역의 개요
변수의 영역(scope)
- 프로그램에서 변수를 사용할 수 있는 범위
- 변수에 값을 대입하거나 변수의 값을 읽어올 수 있는 부분
- 영역의 시작: 변수 선언
영역과 수명
변수의 영역과 변수의 수명은 다를 수 있음
- 영역의 시작: 변수 선언
- 수명의 시작: 변수 선언(동적 바인딩) 또는 프로그램 수행 시작(정적 바인딩)
영역의 단위
- 블록(block)
- 영역을 구분해 주는 단위
- 블록 안에서 변수를 선언할 수 있음
- 선언된 변수의 영역은 블록이 끝나는 곳까지임
- 블록은 언어별로 차이가 있음
- Algol 60: 복합문(begin~end)
- C, C++, Java: 복합문({~}), 함수, 클래스
- Pascal: 주프로그램, 서브프로그램
블록과 변수
- 지역변수: 블록 안에서 선언된 변수
- 비지역변수: 블록 밖에서 선언되었으나 안에서 사용될 수 있는 변수
참조 환경
- 프로그램의 한 위치에서 사용할 수 있는 모든 변수의 모음
- 해당 위치의 모든 지역변수와 모든 비지역변수로 구성
영역 규칙
변수의 참조 위치를 결정하는 방법
자유변수
- 현 블록에서 선언되지 않은 변수
- 자유변수는 비지역변수이거나 오류일 수 있음
- 자유변수의 참조 위치는 영역 규칙에 따라 결정
정적 영역 규칙
- 블록들의 정적 내포 관계(문맥적 포함 관계)를 이용
- 정적 조상: 현 블록을 문맥적으로 포함하는 블록들
- 정적 부모: 가장 가까운 정적 조상
- 자유변수의 참조 위치 찾기: 현 블록의 정적 부모에 대해
- 자유변수 이름에 대한 선언이 있으면 그 변수를 비지역변수로 참조
- 자유변수 이름에 대한 선언이 없으면 그 블록의 정적 부모에 대해 반복
- 영역 구멍: 비지역변수가 같은 이름의 지역변수 때문에 보이지 않는 영역
동적 영역 규칙
- 블록들의 동적 내포 관계(서브프로그램의 호출 관계)를 이용
- 수행 시점에 영역을 결정
- 자유변수의 참조 위치 찾기: 현 블록을 호출한 블록에 대해
- 자유변수 이름에 대한 선언이 있으면 그 변수를 비지역변수로 참조
- 자유변수 이름에 대한 선언이 없으면 그 블록을 호출한 블록에 대해 반복
영역 규칙의 비교
정적 영역 규칙
- 컴파일 시점에 변수의 참조 위치 결정 가능
- 정적 타입 검사 가능, 빠른 수행 속도
- Algol 60, Pascal, C, C++, Java, Python 등 대부분의 언어
동적 영역 규칙
- 수행 시점에 변수의 참조 위치 결정 가능
- 정적 타입 검사 불가능, 느린 수행 속도
- LISP
이름 공간
전역변수
- 어떤 블록에도 포함되지 않는 곳에서 선언된 변수
- 모든 블록에서 비지역변수임
- 영역 구멍에서의 전역변수 사용: 영역 연산자(::)를 이용하면 가능
이름 공간(namespace)
- 관련성이 높은 변수와 함수를 하나의 묶음으로 관리하는 영역
- 변수명처럼 영역 자체의 이름을 가짐
- C++: 영역 연산자를 이용하거나 using namespace를 이용
- 이름 공간과 영역 구멍
- 이름 공간의 변수와 지역변수의 중첩
- 영역 연산자를 이용하면 사용 가능
'CS' 카테고리의 다른 글
[프로그래밍 언어론] 복합타입 (0) | 2023.12.01 |
---|---|
[프로그래밍 언어론] 타입 (0) | 2023.12.01 |
[프로그래밍 언어론] 변수와 바인딩 (0) | 2023.12.01 |
[컴퓨터과학개론] 운영체제 (0) | 2023.11.30 |
[컴퓨터과학개론] 알고리즘 (1) | 2023.11.30 |