728x90
1. 영역의 개요
✅ 변수의 영역(scope)
- 프로그램에서 변수를 사용할 수 있는 범위
- 변수에 값을 대입하거나 값을 읽어올 수 있는 범위
- 영역의 시작: 변수 선언 위치
- 수명의 시작
- 수명: 변수가 메모리를 할당받는 기간
- 동적 바인딩: 변수 선언 위치
- 정적 바인딩: 프로그램이 수행되는 시점
✅ 블록(block)
- 프로그램 문장들의 묶음
- 영역을 구분해주는 단위
- 블록의 표현이나 적용 기준은 언어별로 다름
- Algol 60: 복합문(begin ~ end)
- C, C++, Java: 복합문({~}), 함수, 클래스
- Pascal: 주 프로그램, 서브 프로그램 → 복합문(begin~end)는 블록이 아님
- 블록 안에서 변수 선언이 가능 (※해당 변수 영역의 끝: 블록이 끝나는 지점)
✅ 블록과 변수
- 지역변수(local variable): 블록 안에서 선언된 변수
- 비지역변수(non-local variable): 블록 밖에서 선언되었지만 블록 안에서 사용될 수 있는 변수
- 지역변수와 비지역변수는 상대적인 개념
✅ 참조 환경(reference environment)
- 프로그램의 한 위치에서 사용할 수 있는 모든 변수의 모음
- 해당 위치의 모든 지역변수와 비지역변수로 구성
- 위 그림은 정적 영역 규칙을 적용(동적 영영 규칙을 적용할 경우 다른 결과를 얻을 수 있음)
2. 영역 규칙
✅ 영역 규칙(scope rule)
- 변수의 참조 위치를 결정하는 방법
- 정적 영역 규칙
- 동적 영역 규칙
- 자유변수(free variable)
- 현재 블록에서 선언되지 않고 사용하려는 변수
- 영역 규칙에 따라 참조 위치를 결정
- 참조 위치를 찾은 경우(선언된 경우): 비지역변수
- 참조 위치를 찾지 못한 경우: 오류
✅ 정적 영역 규칙 = 사전적 영역 규칙(lexical scope rule)
: 블록들의 정적 내포 관계(블록의 문맥적인 포함 관계)를 이용
🔸용어
- 정적 조상(static ancestors): 현 블록을 문맥적으로 포함하는 모든 블록들
- 정적 부모(static parent): 현 블록에 가장 가까운 정적 조상
🔸적용 방법
![]() |
![]() |
- 사용하려는 변수의 이름에 대한 선언이 현재 블록 안에 존재 → 지역변수
- 자유변수라면 현재 블록의 정적 부모에 대해
- 자유변수 이름에 대한 선언 존재 → 비지역변수
- 선언이 없으면 그 블로그이 정적 부모에 대해 반복
- 가장 바깥 영역까지 선언을 찾지 못함 → 오류
✅ 영역 구멍(scope hole)
- 비지역변수가 같은 이름의 지역변수 때문에 보이지 않는 영역
✅ 동적 영역 규칙
- 블록들의 동적 내포 관계(서브프로그램의 호출 관계)를 이용
- 프로그램 수행시점에서만 판단 가능
🔸적용 방법
![]() |
![]() |
- 사용하려는 변수의 이름에 대한 선언이 현재 블록 안에 존재 → 지역변수
- 자유변수라면 현재 블록을 호출한 블록에 대해
- 자유변수 이름에 대한 선언이 존재 → 비지역변수
- 선언이 없으면 그 블록을 호출한 블록에 대해 반복
- 최종 호출자 영역까지 선언을 찾지 못함 → 오류
🔸영역 규칙의 비교
정적 영역 규칙 | 동적 영역 규칙 |
- 컴파일 시점에서 변수의 참조 위치를 결정 - 정적 타입 검사 가능, 빠른 수행 속도 - Algol 60, Pascal, C/C++, Java, Python 등 대부분의 언어 |
- 수행 시점에 변수의 참조 위치를 결정 - 정적 타입 검사 불가능, 느린 수행 속도 - LISP 등의 인터프리터 방식 언어 |
3. 이름 공간
✅ 전역 변수(global variable)
- 어떤 블록에도 포함되지 않는 곳에서 선언된 변수
- 영역: 프로그램 전체
- 모든 블록에서 비지역변수로 취급
🔸영역 구멍에서의 전역변수 사용
- 영역 구멍: 어떤 블록 내에서 전역변수 이름과 동일한 지역변수를 사용할 경우, 지역변수가 우선권을 가지기 때문에 전역 변수는 해당 블록 내에서 보이지 않음
- 영역 연산자(scope operator)를 이용하면 해결 가능
- C++의 영역 연산자 → ::
✅ 이름 공간(name space)
- 관련성이 높은 변수와 함수를 하나의 묶음으로 관리하는 영역
- 영역 자체의 이름을 가짐
🔸이름 공간 내의 변수/함수를 이름 공간 밖에서 사용하는 방법
- 이름 공간의 이름과 영역 연산자 ::를 이용
- 예약어 using을 이용
🔸이름 공간과 영역 구멍
- 이름 공간의 변수와 지역변수가 중첩된 경우 → 영역 연산자를 이용해서 해결
728x90
'KNOU > 프로그래밍언어론' 카테고리의 다른 글
[프로그래밍언어론] 10. 복합타입 (0) | 2022.11.15 |
---|---|
[프로그래밍언어론] 9. 타입 (0) | 2022.11.01 |
[프로그래밍 언어론] 7. 변수와 바인딩 (0) | 2022.09.28 |
[프로그래밍언어론] 6. 프로그래밍 언어의 구현 (1) | 2022.09.26 |
[프로그래밍 언어론] 5. 구문 분석 (1) | 2022.09.20 |