Grace
grace's dev_note
Grace
전체 방문자
오늘
어제
  • 분류 전체보기
    • FrontEnd
      • Next.js
      • React
      • ReactNativ..
      • Vue
    • Javascript
      • 러닝 자바스크립트
      • 모던 자바스크립트
    • CS
    • DataScienc..
      • Data Struc..
      • LeetCode
    • BackEnd
      • Express
      • Node.js
      • Nest.js
    • DevOps
      • Docker
    • 매일메일
    • 회고
    • 코드캠프

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • javascript
  • Express
  • vitejs
  • 번들러
  • 함수
  • React Native
  • node.js
  • PostgreSQL
  • tanstack
  • Vue3
  • nest.js
  • 알고리즘
  • 자바스크립트
  • Vite
  • postgres
  • Vue.js
  • pinia
  • Vue
  • vue-query
  • backend

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Grace

grace's dev_note

CS

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

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를 이용
  • 이름 공간과 영역 구멍
    • 이름 공간의 변수와 지역변수의 중첩
    • 영역 연산자를 이용하면 사용 가능
저작자표시 비영리 변경금지 (새창열림)

'CS' 카테고리의 다른 글

[프로그래밍 언어론] 복합타입  (0) 2023.12.01
[프로그래밍 언어론] 타입  (0) 2023.12.01
[프로그래밍 언어론] 변수와 바인딩  (0) 2023.12.01
[컴퓨터과학개론] 운영체제  (0) 2023.11.30
[컴퓨터과학개론] 알고리즘  (1) 2023.11.30
    'CS' 카테고리의 다른 글
    • [프로그래밍 언어론] 복합타입
    • [프로그래밍 언어론] 타입
    • [프로그래밍 언어론] 변수와 바인딩
    • [컴퓨터과학개론] 운영체제
    Grace
    Grace
    기술 및 회고 블로그

    티스토리툴바