CS

[프로그래밍 언어론] 변수의 영역

Grace 2023. 12. 1. 10:09

영역의 개요

변수의 영역(scope)

  • 프로그램에서 변수를 사용할 수 있는 범위
  • 변수에 값을 대입하거나 변수의 값을 읽어올 수 있는 부분
  • 영역의 시작: 변수 선언

영역과 수명

변수의 영역과 변수의 수명은 다를 수 있음

  • 영역의 시작: 변수 선언
  • 수명의 시작: 변수 선언(동적 바인딩) 또는 프로그램 수행 시작(정적 바인딩)

영역의 단위

  • 블록(block)
    • 영역을 구분해 주는 단위
    • 블록 안에서 변수를 선언할 수 있음
    • 선언된 변수의 영역은 블록이 끝나는 곳까지임
  • 블록은 언어별로 차이가 있음
    • Algol 60: 복합문(begin~end)
    • C, C++, Java: 복합문({~}), 함수, 클래스
    • Pascal: 주프로그램, 서브프로그램

블록과 변수

  • 지역변수: 블록 안에서 선언된 변수
  • 비지역변수: 블록 밖에서 선언되었으나 안에서 사용될 수 있는 변수

참조 환경

  • 프로그램의 한 위치에서 사용할 수 있는 모든 변수의 모음
  • 해당 위치의 모든 지역변수와 모든 비지역변수로 구성

영역 규칙

변수의 참조 위치를 결정하는 방법

자유변수

  • 현 블록에서 선언되지 않은 변수
  • 자유변수는 비지역변수이거나 오류일 수 있음
  • 자유변수의 참조 위치는 영역 규칙에 따라 결정

정적 영역 규칙

  • 블록들의 정적 내포 관계(문맥적 포함 관계)를 이용
    • 정적 조상: 현 블록을 문맥적으로 포함하는 블록들
    • 정적 부모: 가장 가까운 정적 조상
  • 자유변수의 참조 위치 찾기: 현 블록의 정적 부모에 대해
    • 자유변수 이름에 대한 선언이 있으면 그 변수를 비지역변수로 참조
    • 자유변수 이름에 대한 선언이 없으면 그 블록의 정적 부모에 대해 반복
    → 최외곽 영역까지 선언을 찾기 못하면 잘못된 변수 참조이므로 오류
  • 영역 구멍: 비지역변수가 같은 이름의 지역변수 때문에 보이지 않는 영역

동적 영역 규칙

  • 블록들의 동적 내포 관계(서브프로그램의 호출 관계)를 이용
  • 수행 시점에 영역을 결정
  • 자유변수의 참조 위치 찾기: 현 블록을 호출한 블록에 대해
    • 자유변수 이름에 대한 선언이 있으면 그 변수를 비지역변수로 참조
    • 자유변수 이름에 대한 선언이 없으면 그 블록을 호출한 블록에 대해 반복
    → 최초 호출자 영역까지 선언을 찾지 못하면 잘못된 변수 참조이므로 오류

영역 규칙의 비교

정적 영역 규칙

  • 컴파일 시점에 변수의 참조 위치 결정 가능
  • 정적 타입 검사 가능, 빠른 수행 속도
  • Algol 60, Pascal, C, C++, Java, Python 등 대부분의 언어

동적 영역 규칙

  • 수행 시점에 변수의 참조 위치 결정 가능
  • 정적 타입 검사 불가능, 느린 수행 속도
  • LISP

이름 공간

전역변수

  • 어떤 블록에도 포함되지 않는 곳에서 선언된 변수
  • 모든 블록에서 비지역변수임
  • 영역 구멍에서의 전역변수 사용: 영역 연산자(::)를 이용하면 가능

이름 공간(namespace)

  • 관련성이 높은 변수와 함수를 하나의 묶음으로 관리하는 영역
  • 변수명처럼 영역 자체의 이름을 가짐
  • C++: 영역 연산자를 이용하거나 using namespace를 이용
  • 이름 공간과 영역 구멍
    • 이름 공간의 변수와 지역변수의 중첩
    • 영역 연산자를 이용하면 사용 가능