400 likes | 791 Views
Chapter 8 – 영역과 수명. Outline 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 언어에서의 영역 8.4 변수의 수명 8.5 Ada 의 영역. 8.1 블록과 영역. 영역 (Scope) 식별자의 효력을 나타낼 수 있는 영역 식별자의 사용이 허락되는 프로그램의 범위 식별자 (Identifier) 변수 , 상수 , 레이블 , 자료형 , 부프로그램 등의 이름 수명 (Extent 또는 Life time)
E N D
Chapter 8 – 영역과 수명 Outline 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 언어에서의 영역 8.4 변수의 수명 8.5 Ada의 영역
8.1 블록과 영역 • 영역(Scope) • 식별자의 효력을 나타낼 수 있는 영역 식별자의 사용이 허락되는 프로그램의 범위 • 식별자(Identifier) 변수, 상수, 레이블, 자료형, 부프로그램 등의 이름 • 수명(Extent 또는 Life time) • 식별자(변수) 값을 보유할 기억장소가 배정되어 있는 실행시간 • 식별자의 기억장소 할당부터 해제까지의 기간
ALGOL60 • integer x • 1) 컴파일 시간 • 2) 실행시간 x integer x integer 8.1 블록과 영역 • 식별자 영역 제공의 간결한 방법 - 모든 식별자를 전 프로그램에서 사용가능 (전역 변수화) 모든 프로그램에서 모든 식별자 공유 • 문제점 • 식별자 사용의 복잡화 • 식별자 혼돈 단위프로그램의 식별자 • 프로그램 합성 시 문제점 발생 (지역화 요구) • ALGOL 60 • begin-end사용 • 블록 구조(지역 식별자 선언 가능) 1) 블록 입구 - 기억장소 할당 2) 블록 출구 - 기억장소 해제 • 블록끼리는 nested또는 disjoint • 복합문(compound statement)과 대조
8.2 동적 영역과 정적 영역 • 정적 영역 규칙(static scope rule) - 식별자의 사용 영역을 블록의 정적 내포관계로 결정(컴파일러 언어) 1) 지역변수 - 현재 블록에서 선언된 변수, 형식매개변수 2) 비지역 변수 - 현재 블록에서 사용되나 바깥 블록에서 선언된 변수 3) 전역 변수 - 모든 블록에서 사용 가능한 변수 [참고] 자유변수(free variable) 현재 블록에서 선언되지 않고 사용되는 변수 [참고] 영역 구멍(hole-in-scope) 내포된 블록 사이에 동일 지역변수를 선언하면, 바깥 블록의 지역변수는 내부 블록 구간에서 사용할 수 없는 현상 지역 (local) 전역 (global)
1 a : begin integer i, j; real x, y; • b : procedure test(integer a, b) • begin boolean I; • . . . • x : = I * j +y; • . . . • end b; • . . . • c : begin integer x, y; real i, j; • d : begin boolean j; • . . . • call test(x, y); • . . . • end d; • . . • . . . • end a; b : procedure test(integer a, b) begin boolean i; . . . x : = i * j +y; . . . end b; c : begin integer x, y; real i, j; . . . d : begin boolean j; . . . call test(x, y); . . . end d; end c; d : begin boolean j; . . . call test(x, y); . . . end d; 8.2 동적 영역과 정적 영역 정적 영역 규칙 (Algol) <각 변수 영역 줄번호>
8.2 동적 영역과 정적 영역 • 정적 영역 규칙을 따른 변칙 현상(anomaly): • 영역 구멍(hole – in –scope) • 앞 페이지 예 a 에서 선언된 x처럼 전역 선언이 지역선언 때문에 보이지 않을 때 • 영역과 선언의 가시성(visibility)에 약간의 차이를 갖는다. • Ada와 Java에서는 영역 한정자에 의해 접근이 가능하다. • 예) 앞 페이지 예에서 : Ada 경우 • 블록 c에서 영역 구멍 상태 인 a 블록의 x 접근 a. x • 가시성 (visibility) 블록 c에서 a의 x를 볼 수 있다. : 선택에 의한 가시성
8.2 동적 영역과 정적 영역 • 동적 영역 규칙(dynamic scope rule) • 식별자의 영역이 실행시간에 확정 • 식별자의 사용 영역이 프로그램의 실행 순서에 의해 결정 • 인터프리터 언어에서 주로 사용
8.2 동적 영역과 정적 영역 • 동적 영역 규칙 사용 예 (APL에서) Z ← 0 X ← 0 주 프로그램 Y ← 0 SUB 2 : 2는 실 매개 변수 Z ← FUN Y : Y는 실 매개 변수, 결과를 Z에 배정 ▽ SUB I ; Y : I는 형식 매개 변수, Y는 지역 변수 부 프로그램 … X … SUB … Y … Z ← FUN N ; X ▽ • 1) 주 프로그램에서 SUB 2 호출 • <SUB> • X, Z : 전역 변수 (주 프로그램) • Y : 지역 변수 • SUB 에서 FUN N 호출 • <FUN> • Y : 비지역 변수 (SUB) • N, X : 지역 변수 • 2) 주 프로그램에서 FUN Y 호출 • <FUN> • Y : 전역 변수 (주 프로그램) • N, X : 지역 변수 ▽ R ← FUN N ; X : N는 형식 매개 변수 함수 :X는 지역, Y는 전역 변수 프로그램 … X … FUN … Y … ▽
8.2 동적 영역과 정적 영역 • 예제 8.1 영역규칙 적용 예 program scope; var a, b : integer; begin a := p; q; end scope 실행과정 1) scope 실행 2) 함수 p 호출, 실행 a = 0 (지역변수) b = 1 (비지역 scope변수) p = 2 (함수 이름) 반환 후 => scope의 a에 2 배정 3) 프로시져 q 호출, 실행 a = 3 (비지역 scope변수) b = 4 (지역변수) p = 5 (지역변수) 4) 프로시져 print 호출, 실행 ① 정적 영역 규칙 a : scope, b : scope, p : 함수 p 결과 : 3, 1, 2 ② 동적 영역 규칙 a : scope, b : 함수 q, p : 함수 q 결과 : 3, 4, 5 function p : integer; var a : integer; begin a := 0; b :=1; p := 2 end p; procedure print; begin write(a); write(b); writeln(p) end print; procedure q; var b, p : integer; begin a := 3; b := 4; p := 5; print end q;
8.3 주요 언어에서의 영역 • FORTRAN • 지역변수 자체 프로그램(MAIN, SUBROUTINE,또는 FUNCTION)에서 (명시적/묵시적)선언한 변수 사용 • 전역변수 COMMON문으로 선언 한 변수 • 예) C THIS IS THE MAIN PROGRAM COMMON /A/ X, Y, Z(10) COMMON GD, IRED, TEMP . . . END X, Y, Z(10)은 A2와 공유 GD, IRED, TEMP는 A1과 공유 SUBROUTINE A1(P, Q) COMMON XX, KRED, XTEMP . . . END SUBROUTINE A2(P, Q) COMMON /A/ G, H, Z(10) . . . END
8.3 주요 언어에서의 영역 • JOVIAL • ALGOL 58의 후계자 • 미국방성에서 주로 사용 • 정적 영역 규칙(블록 중심) • 분리 컴파일 허용 • COMPOOL (communications pool) • 각 모듈에게 자료, 프로시저, 정의 등의 공유를 제공 • COMPOOL을 사용해서 실행시간에매개변수 간의 형 검사 • PL/I • ALGOL 60의 후계자 • BEGIN..END 도입(블록 개념) • 묵시적 선언가능 -> 문제점 발생
8.3 주요 언어에서의 영역 • PL/1 영역 문제점 :PROCEDURE A END PEC; PEC :BEGIN; ··· B END A; : BEGIN; J = X; ① ··· C D END B; : BEGIN J = Y; ② ··· END C; • ① J : 프로시저 PEC에서 묵시적 선언 간주 • ② J : 프로그래머가 C에서 선언하여 사용한 • 것으로 간주 • ③ J의 해석 (?) • 묵시적 선언 => 변수 선언의 혼동 초래 :/* 여기서 J를 사용 */ ③
8.3 주요 언어에서의 영역 • ALGOL 68 • begin ... end블록 개념 일반화(문맥시작과 마침 기호 다양함) • 영역 블록 - 모든 문맥시작 기호와 문맥 마침 기호 사이 • 선언 • 블록 입구에서 선언 • 블록 끝에서 해제 => 영역 : 블록 단위 • 예) if-fi, then-else, else-fi, begin-end, loop–pool, case-esac 등 if fi then else
8.3 주요 언어에서의 영역 • Pascal • begin ... end도입 : 복합문 개념 - 영역 블록 아님 • 선언 - 프로시저, 함수 시작부 =>프로시저/함수가 영역 단위 • 프로시저 내포 가능 • 정적 영역 규칙 • 예) Pascal 영역 문제 호출 구조 1) A : A, B, D 2) B : A, B, C 3) C : A, B, C 4) D : A, B, D 변수 영역 - 정적 영역 규칙 예) B에서 선언된 변수 B : 지역변수 C : 비지역 변수 procedure A procedure B procedure C procedure D
8.3 주요 언어에서의 영역 • C, C++, Java에서의 영역 • Algol과 같은 블록 개념의 언어 • begin-end 대신에 중괄호 ( { ,} )를 사용하여 영역을 정의 { int a_outer = 2 ; printf ("%d\n", a_outer) ; { int a_inner = 5 ; printf ("%d\n", a_inner) ; } printf("%d\n", ++a_outer) ; } { int a = 2 ; /* outer block a */ print f ( “%d \n”, a) ; /* 2 is printed */ { int a = 5 ; /* inner block a */ printf (“%d\n”, a) ; /* 5 is printed */ } /*back to the outer block */ printf (“%d\n”, ++a) ; /* 3 is printed */ } 동등하다.
8.3 주요 언어에서의 영역 • C언어 영역 예 void p(void) { int a, b, x ; /* 블럭 p */ · · · { float x, y, z ; /* 다른 블럭 */ y = 1.5 ; /* 지역 변수 y */ a = 2 ; /* 비지역 변수 a, 즉 p의 a */ x = b * z ; /* 지역 변수 x, z, 비지역 변수 b*/ } · · · } 다른 블록에서: x, y, z : 지역변수 a, b : 비지역 변수 p의 x : 영역 구멍 상태
8.3 주요 언어에서의 영역 • C에서는 모든 함수 전체를 영역으로 하는 외부 영역 (external scope) 이 존재. 외부 영역만이 전역임 int i, j ; float x , y ; /* i, j, x, y는 전역 변수 */ void main (void) { int i, k ; /* i, k는 main 함수의 지역변수 */ float a, b, c ; /* a, b, c는 main 함수의 지역변수*/ · · · }
8.3 언어에서의 영역 • C++, Java • 변수 정의가 어디에서나 나타날 수 있다. (영역 : 정의문에서 함수 끝까지) • For문의 초기화식에 제어 변수가 정의되는 것을 허용 • 블록 구조를 통한 영역개념의 장점 ①지역성(locality)을 높여준다. 변수를 사용할 프로그램 가까이서 선언 ②운영 체제하에서 작은 working set 요구 크기가 작은 기억장소 요구 ③표준 패키지를 사용자 프로그램에 결합시켜 하나의 프로그램을 만들기 쉽다. ④프로그램의 구성을 단계적으로 세분화하는데 도움이 된다.
X int 8.4 변수의 수명 (extent) • 수명(Extent 또는life time) 변수가 기억장소를 할당 받은 기간(실행시간) • Fortran 정적 기억장소 할당 변수 수명 = 프로그램수명
8.4 변수의 수명 (extent) • Algol 60 • 블록 단위 할당/해제 => 변수 수명 : 블록 시작 ~ 블록 종료(선언블록) • own 변수 • static 변수 => 변수 수명: 주 프로시저 시작 ~ 주 프로시저 종료 참고)변수 영역 : 선언블록 • 초기화는 한 번(첫 번째 진입 시) • own 형의 가변 배열 (?)
8.4 변수의 수명 (extent) • PL/1 • automatic : 수명 - 블록 진입 ~ 블록 탈출 • static : 수명 - 주 프로시저 진입 ~ 주 프로시저 탈출 • controlled : 수명 - allocate()실행~ free()실행 • based(stack 개념) : 수명 -allocate()실행 ~ free()실행 • 예) DECLARE 1 STUDENT BASED (P) 2 NAME CHARACTER(25) VARYING, 2 SNUMBER FIXED, 2 AGE FIXED, 2 MAJOR CHARACTER(10), 2 LINK POINTER; • STUDENT : 레코드형 이름 • P : STUDENT를 가리키는 포인터 • ALLOCATE(P) - 메모리 할당 • 연속적인 ALLOCATE(P) - 스택 개념 사용 • FREE(P) - 메모리 해제(스택에서 POP)
스택 사용 힙 사용 8.4 변수의 수명 (extent) • PL/1 기억 장소 요약 • 동적 수명 • 힙 기법 사용 • 주요언어 사용 예) Pascal - new() ~ dispose() PL/1 - ALLOCATE() ~ FREE() C - malloc() ~ free() C++ - new ~ delete
8.5 Ada 의 영역 • Ada 영역 단위 • 부프로그램(procedure, function) • 패키지(package) • 태스크(task) • 영역 단위 구조
8.5 Ada 의 영역 • 이름 한정(qualification)를 통해 영역구멍 상태인 식별자를 사용할 수 있다. 이름 한정(qualification)
8.4 변수의 수명 (extent) • 내포된 부 프로그램과 이름한정 예 (Ada) procedure HERE is begin … end HERE procedure THEN is A : REAL; B : REAL; begin … end THEN; procedure NOW is B : REAL; -- THEN. B가 숨겨짐 C : REAL; begin B := A; -- NOW.B := THEN.A C := THEN.B; -- NOW.C := THEN.B end NOW; • 지역/비지역 식별자 구분 • - 지역/비지역 식별자가 • 같은 경우 지역식별자를 • 한정하여 표현 • 블럭 이름.식별자
8.4 변수의 수명 (extent) package LOGICS is A, B, C : BOOLEAN; end LOGICS; • 식별자 이름한정 사용 예(Ada) procedure MAIN is Begin … end MAIN package NUMBERS is C, D, E : INTEGER; end NUMBERS; procedure DOSOMETHING is A, F : REAL; use LOGICS, NUMBERS begin -A는 DOSOMETHING.A -B는 LOGICS.B -D는 NUMBERS.D -E는 NUMBERS.E -F는 DOSOMETHING.F -C는 LOGICS.C 또는 NUMBERS.C end end DOSOMETHING