본문 바로가기

B1:기초 Basement

범위 (Scope)

반응형

실체(변수,레이블의 속성)가 그 이름(변수이름,프로시저이름,레이블이름)으로 유효하게 사용(이름으로 접근 가능)될 수 있는 프로그램의 영역. Ada에서처럼 정의하는 방법에 따라서는 범위와 가시성을 별개로 구분할 수도 있다.

블록
ALGOL60에서 최초 제시된 개념. 특정 변수가 어떤 문맥 속에서 의미를 가지는 범위.
블록구조 언어 : 블록 안에 또 다른 블록이 포함되는 것을 허용하는 언어
경계 : 부호 또는 예약어를 사용하여 지정함
변수 사용 범위 :
  지역변수 : 자기 블록에서 선언된 변수
  비지역변수 : 상위 블록에서 선언된 것이지만 자기 블록에서 쓸 수 있는 변수
  전역변수 : 제일 바깥 쪽 블록에서 선언되어 모든 블록에서 쓸 수 있는 변수
장점 : 블록 내에서는 변수명을 자유롭게 사용할 수 있게 됨. 프로그램 모듈화 가능. 기억장소 효율적 관리

정적범위규칙
외형적 구조(어휘적 범위,lexical scope)에 의한 바인딩 규칙. 범위 구멍(Scope Hole)이 존재함. 범위구멍에 가려진 변수를 사용하는 방법 숙지할 필요 있음

- 이름에 대한 바인딩 순서
  1. 프로그램의 외형적인 구조에 따라, 먼저 자기 블록 내에서 바인딩
  2. 자기 블록에서 선언된 것이 아니면 그 바깥 쪽 블록을 조사하여 바인딩

- 범위 구멍(scope hole)
  동일한 이름이 안쪽 블록에서 선언되면 그 안쪽 블록에서는 유효하지 않게 되는데 이러한 부분을 범위 구멍이라고 함
∙ 파스칼, C++, Java 등 대부분의 정적 범위 언어에서 이름의 범위는 선언된 지점부터 그 블록의 끝까지이다. (범위 구멍 제외)
∙ Ada에서는 범위와 가시성을 구분. 범위는 범위 구멍도 포함하는 것으로 하였고 가시성은 범위 구멍이 제외된 부분만으로 정의하였다.
∙ C++의 범위 전환 연산자 : 범위 구멍에 의해 가려진 변수를 접근할 수 있도록 한다.
∙ Modula-2에서는 변수나 함수 이름의 범위가 선언된 지점에서부터 시작되는 것이 아니라 선언된 블록의 처음부터 시작된다. 유사하게 Java의 경우 클래스 이름은 범위가 선언된 패키지 전체로 된다.
 
- 단점
  컴파일러가 검출하지 못하고 실행시 발견되기 때문에 오류검출이 어려움
  전역변수의 보호문제(블록의 내포관계에 종속되는 현상)
  블록의 내포관계가 논리적 구조를 반영하는 데 미흡=>캡슐화 구조를 통한 해결 가능



동적범위규칙
실행 순서에 따른 결정 규칙. 비지역변수에 대한 바인딩이 호출순서(실행시의 순서)에 따라 이루어짐. 프로그램 수행중 비지역변수를 만나면 호출된 역순(블록의 역순)으로 추적.프로그램 수행 도중 지역에서 선언되지 않은 비지역 변수를 만나면 호출된 역순으로 추적하면서 그 이름의 변수가 선언된 곳을 찾아 바인딩 한다.

- 장점
  프로시저 호출시 매개변수 전달이 편리함 : 피호출 프로시저에 전달할 매개변수가 호출부에서 선언된 변수라면 구태여 매개변수로 전달할 필요가 없다.
  번역기 구현상의 용이성 : 번역기 구현시에 범위 바인딩을 위한 별도의 자료구조가 필요하지 않아 구현이 보다 용이해진다.

- 단점
  프로그램의 의미가 실행순서에 따라 달라짐으로 인해 난해
호출부의 실행환경이 피호출부에 그대로 노출되어 지역변수보호문제가 발생
  비지역 변수에 대하여 형 조사를 정적으로 행할 수가 없어 형 오류를 실행 전에 검출하기가 어렵다.
  비지역 변수에 접근하려면 정적 범위인 경우보다 더 많은 시간이 걸릴 수 있다.

∙ 동적 범위 바인딩은 APL, SNOBOL4, 초기 LISP 등에 채택되었지만 앞에서 든 단점들 때문에 나중에 발표된 LISP의 변종, 예를 들면 Scheme, Haskell 등에서는 정적 범위 규칙을 채택하였다.

반응형

'B1:기초 Basement' 카테고리의 다른 글

대규모 프로그래밍  (0) 2006.10.03
XMLSpy Enterprise Edition  (0) 2006.10.02
Java 개발환경 설정 - UltraEdit 버전  (0) 2006.09.10
JSR 94: JavaTM Rule Engine API  (0) 2006.09.02
한영 영영 사전 "야후 미니"  (0) 2006.09.02