본문 바로가기
CS(Computer Science)/프로그래밍언어

8. 영역과 수명

by 동욷 2023. 6. 3.

영역(scope) : 식별자의 효력을 나타낼 수 있는 영역 , 식별자의 사용이 허락되는 프로그램의 범위 , 프로그램 내에서 어떤 선언이 유효한 부분

 

식별자(identifier) : 변수, 상수, 레이블, 자료형, 부프로그램 등의 이름 

언어 구성자를 명명하는 어휘토큰 / 변수, 배열, 레코드, 레이블, 프로시저 등의 이름/ 

일반적으로 문자가 맨 앞에 오고, 그 뒤에 영문자,숫자, 그밖의 문자가 0개 이상 따라옴

 

 

수명(Extent, LifeTime)

: 식별자(변수) 값을 보유할 기억장소가 배정되어 있는 실행시간

  식별자의 기억장소 할당부터 해제까지의 기간

  언어 구성자가 존재하는 동안을 가리키는 실행시간의 부분

 

 

식별자 영역 제공의 간결화로 모든 식별자를 전 프로그램에서 사용가능하도록 "전역변수화" 하는 방법

-> 식별자 사용의 복잡화 / 식별자 혼돈 (지역화 요구) / 프로그램 합성 시 문제

 

ALGOL 60

- begin-end 구조

- 블록구조 (지역 식별자 선언 가능)

- 블록 입구 -> 기억장소 할당 / 블록 출구 -> 기억장소 해제

- 블록끼리는 nested or disjoint

- 복합문(compound statement)와는 대조된다

 

 

정적 영역 규칙 (static scope rule)

- 선언문이 선언된 곳을 둘러싼 모듈 중 가장 안쪽 모듈을 찾아 영역을 결정하는 영역

- 식별자의 사용영역을 블록의 정적 내포관계로 결정(컴파일러 언어)

 

지역변수 : 현재 블록에서 선언된 변수 , 형식 매개변수

비지역변수 : 현재 블록에서 사용되나 바깥 블록에서 선언된 변수

전역변수 : 모든 블록에서 사용 가능한 변수

자유변수(free variable) : 현재 블록에서 선언되지 않고 사용되는 변수

영역구멍(hole-in-scope) : 내포된 블록 사이에 동일 지역변수를 선언하면, 바깥 블록의 지역 변수는 내부 블록 구간에서 사용할 수 없는 현상

 

전역 : 프로그램의 모든 모듈을 영역으로 하는 언어 구성자의 속성

 

지역 : 해당 언어 구성자가 선언된 선언구역만을 영역으로 하는 언어 구성자의 속성

 

 

Anomaly(정적 영역 규칙을 따른 변칙현상)

1) 영역구멍 : 전역선언이 지역선언 때문에 가려지는 현상

영역과 선언의 가시성에 약간의 차이를 가짐

Ada와 Java에서는 영역 한정자에 의해 접근이 가능

ex) a.x

 

2) 가시성(visibility) : 모듈의 지정한 위치에서 특정 언어 구성자를 참조할 수 있도록 프로그램에서 특정 언어 구성자를 참조할 수 있는 부분

 

 

 

동적 영역 규칙(dynamic scope rule)

- 식별자의 영역이 실행시간에 확정

- 식별자의 사용 영역이 프로그램의 실행 순서에 따라 결정 (가장 최근에 호출된 순서에 따름)

- 인터프리터 언어에서 주로 사용

- 어떤 모듈이 수행 중 자신이 가지고 있지 않은 선언들을 요구할 때, 그 선언들을 가진 다른 모듈들의 전체 또는 일부가 미리 활성화 되어서 생성된 영역

- Lisp 초기버전, APL, symbol

 

 

FORTRAN

- 지역변수 : 자체 프로그램 (MAIN, SUBROUTINE, FUNCTION)에서 (명시적/묵시적) 선언한 변수 사용

- 전역변수 : COMMON 문으로 선언한 변수

 

JOVIAL
- ALGOL 58의 후계자

- 정적 영역 규칙 ( 블록 중심)

- 분리 컴파일 허용

- COMPOOL (communications pool) : 각 모듈에게 자료,프로시저,정의 등을 공유를 제공 / 실행시간에 매개변수 간의 형을 검사

 

PL/I

- ALGOL 60의 후계자

- BEGIN .. END 도입 (블록 개념)

- 묵시적 선언 가능 but 문제점이 존재

 

ALGOL 68

- begin .. end 블록 개념을 일반화 (문맥 시작과 마침 기호가 다양함)

- 영역 블록 -> 모든 문맥 시작 기호와 문맥 마침 기호 사이

- 선언 : 블록 입구에서 선언 / 블록 끝에서 해제

- 영역 : 블록 단위

 

PASCAL

- begin .. end 도입 (얘는 영역 블록이 아님 , 복합문 개념)

- 선언 : 프로시저, 함수 시작부 / 프로시저 및 함수가 영역단위

- 프로시저 내포 가능 ( 정적 영역 규칙)

 

C/C++/Java

- Algol과 같은 블록 개념의 어넝

- begin-end 대신에 중괄호({,})를 사용하여 영역을 정의

 

 

C : 모든 함수 전체를 영역으로 하는 외부 영역 (external scope)가 존재하며 외부 영역만이 전역이다.

 

C++ , Java : 변수 정의가 어디에서나 나타날 수 있고, 영역은 정의문에서 함수 끝까지 이며, For문의 초기화 식에 제어변수 정의되는 것을 허용한다.

for(int i=0;i<10;i++) 이런거 허용

 

블록 구조를 통한 영역 개념의 장점

- 지역성(locality)을 높여준다

- 운영체제하에서 작은 working set을 요구한다. (기억장소 크기 작음)

- 표준 패키지를 사용자 프로그램에 결합시켜 하나의 프로그램을 만들기 쉽다

- 프로그램의 구성을 단계적으로 세분화 하는데 도움이 된다.

 

 

변수의 수명(extent , life time)

- 변수가 기억장소를 할당 받은 기간 (실행 기간)

- 언어 구성자가 존재하는 동안을 가리키는 실행시간의 부분

 

Fortran : 정적 기억장소 할당 , 모든 변수의 수명 = 프로그램의 수명

 

Algol 60 : 블록 단위 할당/해제 , 변수 수명 = 블록 시작 ~ 블록 종료

                own 변수 : static 변수 (블록에 다시 들어갈 때 기존 블록에서의 변수 정보 재활용 목적)

                                  변수 수명 : 주 프로시저 시작 ~ 주 프로시저 종료

                                  변수 영역 : 선언 블록

                                  초기화는 한 번 ( 첫 번째 진입 시)

 

PL/I

static : 수명 -> 주 프로시저 진입 ~ 주 프로시저 탈출 (= 포트란)

automatic : 수명 -> 블록 진입 ~ 블록 탈출 (= 알골)

controlled : 수명 -> allocate() 실행 ~ free() 실행 (동적 자료구조 생성 / 소멸)

based(stack개념) : 수명 -> allocate() 실행 ~ free() 실행 (controlled와 동일)

 

 

동적 수명 - 힙 기법 사용

Pascal : new() ~ dispose()

PL/I : ALLOCATE() ~ FREE()

C : malloc() ~ free()

C++ : new ~ delete

 

스택은 컴파일 타임에 결정되고, 힙은 런타임에 결정된다.

 

 

Ada의 영역

- 부 프로그램 (procedure, function) 

- 패키지 (package)

- 태스크 (task)

 

이름 한정(qualification) : 영역구멍 상태인 식별자를 사용 할 수 있다.

-> 프로그램의 어느 영역 내부에 있는 언어 구성자를 참조하기 위한 수단

 

(블록이름.식별자)

 

 

 

 

 

 

 

 

 

 

728x90

'CS(Computer Science) > 프로그래밍언어' 카테고리의 다른 글

9장 요약  (0) 2023.06.04
9. 기억장소 배당  (3) 2023.06.03
2. Algol 60 , Algol 68  (0) 2023.04.19
1. Fortran  (0) 2023.04.19
4. 프로그래밍 언어 구문과 구현 기법  (0) 2023.04.07