영역(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) : 영역구멍 상태인 식별자를 사용 할 수 있다.
-> 프로그램의 어느 영역 내부에 있는 언어 구성자를 참조하기 위한 수단
(블록이름.식별자)
'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 |