Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 8장 영역과 수명 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 주요 언어에서의 영역 8.4 변수의 수명

Similar presentations


Presentation on theme: "제 8장 영역과 수명 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 주요 언어에서의 영역 8.4 변수의 수명"— Presentation transcript:

1 제 8장 영역과 수명 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 주요 언어에서의 영역 8.4 변수의 수명
8.5 Ada의 영역

2 8.1 블록과 영역 영역 (Scope) 식별자의 사용이 허락하는 프로그램 범위 수명 (Extent, Life time)
식별자 영역과 수명 8.1 블록과 영역 영역 (Scope) 식별자의 사용이 허락하는 프로그램 범위 수명 (Extent, Life time) 식별자의 메모리 할당부터 해제까지의 기간 가장 간단한 영역 사용 개념 전역 변수화 : 모든 프로그램에서 공유 가능 문제점 - 식별자 사용의 복잡화 - 혼돈 - 프로그램 합성시 문제점 발생

3 컴파일 시간 : 기호(Symbol) 테이블 저장
식별자 영역과 수명 ALGOL 60 블록 구조 (begin - end) 사용 컴파일 시간 : 기호(Symbol) 테이블 저장 실행 시간 : 기억 장소 할당 ALGOL60 integer x 1) 컴파일시간 2) 실행시간 x 정수

4 8.2 정적 영역과 동적 영역 정적 영역 규칙 (static scope rule) 영역이 블록의 정적 내포 관계로 결정
식별자 영역과 수명 8.2 정적 영역과 동적 영역 정적 영역 규칙 (static scope rule) 영역이 블록의 정적 내포 관계로 결정 : 컴파일러 언어 most closely nested 동적 영역 규칙 (dynamic scope rule) 영역을 프로그램의 실행 순서에 의해 결정 : 인터프리터 언어 most recently initiated

5 비지역 변수 : 현재 블록에서 사용되나 바깥 블록에서 선언된 변수
식별자 영역과 수명 변수의 종류 지역 변수 : 현재 블록에서 선언된 변수 비지역 변수 : 현재 블록에서 사용되나 바깥 블록에서 선언된 변수 전역 변수 : 모든 블록에서 사용 가능한 변수 영역 구멍 (hole-in-scope) 내포된 블록 사이에 동일 지역 변수 선언하면 바깥 블록의 지역 변수는 내부 블록 구간에서 사용 할 수 없는 현상

6 정적 영역 규칙 (Algol) 식별자 영역과 수명 1 a:begin integer i, j; real x, y; 2 3 4 5
6 7 ··· 9 10 11 12 13 14 15 16 17 ··· end a; 변수 자료형 integer boolean real i j 1, 2, 8, 18~19 3~7 9~17 1~8, 18~19 11~15 9~10, 16~17 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; ··· end c; d:begin boolean j; ··· call test(x, y); end d;

7 동적 영역 규칙 (APL) 식별자 영역과 수명 Z 5 주프로그램 7 SUB 2 : 2 는 실매개 변수 Z FUN Y
SUB I; Y : I는 형식 매개 변수 Z FUN N; X X Y R FUN N; X : N은 형식 매개 변수 Z 5 7 SUB 2 Z FUN Y : 2 는 실매개 변수 : Y는 실매개 변수, 결과를 Z에 배정 주프로그램 부프로그램 SUB 함수 FUN X는 지역변수 Y는 지역변수 1) 주프로그램에서 “SUB 2” 호출 <SUB > X, Z : 전역변수(주프로그램) Y : 지역변수 1-1) SUB에서 “FUN N” 호출 <FUN > Y : 비지역변수(SUB) N, X : 지역변수 2) 주프로그램에서 “FUN Y” 호출 <FUN> Y : 전역변수(주프로그램)

8 정적, 동적 영역 규칙의 예 식별자 영역과 수명 실행과정 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 : 함수 q, b : 함수 q, p : 함수 q 결과 : 3, 4, 5 function p : integer; var a : integer; begin a :=0; b :=1; p :=2 end p; procedure print; write(a); write(b); writeln(p) end print; procedure q; var b, p : integer; a :=3; b :=4; p :=5; print end q; program scope; var a, b : integer; begin a :=p; q; end scope

9 Scoperule.java public class ScopeRule{ int a,b,p,q;
public ScopeRule() { a = p(); q(); } public int p(){ int a; a = 0; b = 1; p = 2; return p; public void print() { System.out.println("a="+a); System.out.println("b="+b); System.out.println("p="+p); public int q() { int b,p; a = 3; b = 4; p = 5; print(); return q; public static void main (String args[]) { new ScopeRule();

10 8.3 언어에서의 영역 FORTRAN 지역 변수 프로그램(SUBROUTINE 또는 FUNCTION) 내에
식별자 영역과 수명 8.3 언어에서의 영역 FORTRAN 지역 변수 프로그램(SUBROUTINE 또는 FUNCTION) 내에 선언된(명시적/묵시적) 변수 전역 변수 COMMON 문으로 선언

11 예 식별자 영역과 수명 C THIS IS THE MAIN PROGRAM COMMON /A/ X, Y, Z(10)
COMMON GD, IRED, TEMP END SUBROUTINE A1(P, Q) COMMON GD, IRED, TEMP .... SUBROUTINE A2(P, Q) COMMON /A/ X, Y, Z(10) X, Y, Z(10)은 A2와 공유 GD, IRED, TEMP는 A1과 공유

12 주요 언어 영역 규칙 (JOVIAL, PL/I)
식별자 영역과 수명 주요 언어 영역 규칙 (JOVIAL, PL/I) JOVIAL ALGOL 58의 후계자 미국방성에서 주로 사용 정적 영역 규칙(블록 중심) 분리 컴파일 허용 COMPOOL(각 모듈에게 자료, 프로시져. 정의 등의 공유를 제공) 실행시간 매개 변수 간의 형 검사, 전역 변수의 정의 / 사용 검사 가능

13 PL/I ALGOL 60의 후계자 BEGIN, END 도입 (블록 개념) 묵시적 선언 가능 -> 문제점 발생
식별자 영역과 수명 PL/I ALGOL 60의 후계자 BEGIN, END 도입 (블록 개념) 묵시적 선언 가능 -> 문제점 발생

14 PL/I 영역 문제 식별자 영역과 수명 PEC:PROCEDURE A:BEGIN; ··· B: BEGIN; J = X; ①
END PEC; A:BEGIN; ··· END A; B: BEGIN; J = X; ① END B; C: BEGIN J = Y; ② END C; D:/* J 사용 */ ③ ① : 프로시져 PEC에서 선언(묵시적, 시스템) ② : C 믈록에서 선언(묵시적, 프로그래머) ③ : J의 해석 1) ②의 J가 지역변수 -> J == Y 2) ②의 J가 전역변수 -> J == X 묵시적 선언 => 변수 선언의 혼동 초래

15 주요 언어 영역 규칙 (ALGOL 68, Pascal)
식별자 영역과 수명 자 료 형 주요 언어 영역 규칙 (ALGOL 68, Pascal) ALGOL 68 begin … end 도입 (블록 개념) 선언문 블록 입구에서 선언 블록 끝에서 해제 => 영역 : 블록 단위 예) if-fi, then-else, else-fi, begin-end 등

16 Pascal begin … end 도입 (복합문 개념) 선언 프로시져, 함수 시작부 => 프로시져/ 함수가 영역 단위
식별자 영역과 수명 Pascal begin … end 도입 (복합문 개념) 선언 프로시져, 함수 시작부 => 프로시져/ 함수가 영역 단위 프로시져 내포 가능 블록 끝에서 해제 => 영역 : 블록 단위

17 Pascal 영역 문제 예) Pascal 식별자 영역과 수명 호출 구조 procedure A 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

18 { int a = 2; /* 외부 영역의 a변수 */ printf(“%d\n”,a); /* 2가 출력 됨 */ int a = 5; /* 내부 영역의 a변수 */ printf(“%d\n”,a); /* 5가 출력 됨 */ } printf(“%d\n”,++a); /* 3이 출력 됨 */

19 { int a_outer = 2; printf(“%d\n”,a_outer); int a_inner = 5; printf(“%d\n”,a_inner); } printf(“%d\n”,++a_outer);

20 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 */ }

21 int i , j; /* i, j, x, y는 전역 변수 */ float x, y; void main (void) { int i , k; /* I, k는 main 함수의 지역적임 */ float a, b, c; /* a, b, c는 main 함수의 지역적임 */ }

22 높은 지역성 => 작은 working set 표준 패키지와 사용자 프로그램 연결 용이 <= 식별자 충돌 제거
식별자 영역과 수명 블록 구조 영역 규칙 사용 장점 지역성 (locality) 증가 높은 지역성 => 작은 working set 표준 패키지와 사용자 프로그램 연결 용이 <= 식별자 충돌 제거 단계적 세분화 (stepwise refinement) 유리

23 8.4 변수의 수명 수명 (Extent) 또는 (life time) 변수가 기억 장소를 할당 받은 기간
식별자 영역과 수명 8.4 변수의 수명 수명 (Extent) 또는 (life time) 변수가 기억 장소를 할당 받은 기간 FORTRAN, COBOL 정적 메모리 할당 => 변수 수명 = 프로그램 수명

24 => 변수 수명 : (블록 시작 - 블록 종료)
식별자 영역과 수명 ALGOL 60 블록 단위 할당 / 해제 => 변수 수명 : (블록 시작 - 블록 종료) own 변수 (static 변수) => 변수 수명 : (주 프로세서 시작 - 주 프로세서 종료) 참고) 변수 영역 : (블록 시작 - 블록 종료) 초기화는 1번 (첫번째 진입시) own 형의 가변 배열 가능?

25 변수의 수명 (PL/I) PL/I Automatic - 수명 : (블록 입구 - 블록 출구)
식별자 영역과 수명 변수의 수명 (PL/I) PL/I Automatic - 수명 : (블록 입구 - 블록 출구) static - 수명 : (주 프로시져 입구 - 주 프로시져 끝) controlled - 수명 : (allocated() 문 - free() 문) Based (stack 개념) - 수명 : (allocate() 문 - free() 문)

26 예) 식별자 영역과 수명 DECLARE 1 STUDENT BASED (P)
2 NAME CHARACTER(25) VARYING, 2 SSNUMBER FIXED, 2 AGE FIXED, 2 MAJOR CHARACTER(10), 2 LINK POINTER; STUDENT : 레코드형 이름 P : STUDENT를 가리키는 포인터 ALLOCATE(P) - 메모리 할당 연속적인 ALLOCATE(P) - 스택에 저장 FREE(P) - 메모리 해제(스택에서 POP)

27 변수 수명 (PL/I) PL/I 기억 장소 요약 식별자 영역과 수명 CONTROLLED AUTOMATIC STATIC
BASED 종 류 주 프로시저 시작 기억장소 할당 블록/프로시저 시작 ALLOCATE() 문 기억장소 해제 주 프로시저 종료 블록/프로시저 종료 FREE() 문, 태스크 종료

28 1) pascal - new(), dispose() 2) PL/I - ALLOCATE(), FREE()
식별자 영역과 수명 동적 수명 실행 시간에 메모리를 할당문에 의해 할당, 해제문에 의해 회수된 예) 1) pascal - new(), dispose() 2) PL/I - ALLOCATE(), FREE() 힙(heap) 기법 이용

29 C – Type Modifier auto extern register static
자동변수를 선언함. 그러나 모든 지역변수는 자동변수 이므로 불필요한 수정자이다. (C언어의 전신인 B언어와 호환성을 위해 존재) extern extern 변수는 메모리 할당을 받지 않으며 해당 이름의 전역변수를 사용하겠다는 의미. (분리 컴파일 / 링크 시 사용) register 변수의 접근 시 가능한 빠른 접근을 원한다는 것을 컴파일러에게 알려주는 역할을 함. (반드시 CPU 레지스터에 변수를 저장해야 한다는 규정은 없어졌다.) static 전역변수와 static변수는 프로그램이 실행되는 전체시간 동안 존속하게 된다. (전역변수-외부링크, static전역변수-내부링크, static지역변수-링크없음)

30 static keyword C Java static 변수들은 프로그램 실행 동안 계속 존재하게 된다.
전역변수나 지역변수에 모두 사용 가능하다. 함수 내에(지역변수) 선언 시 함수호출 시 마다 초기화 되지 않고 단 한번만 초기화된다. 전역변수에 사용되면 같은 파일의 함수에서만 알려지고 다른 파일에서는 접근할 수 없게 된다. 명시적으로 초기화 하지 않으면 값이 0이 된다. static member는 클래스 전역에서 사용되며 객체생성 없이 클래스 이름만으로 참조 가능하다. class member에만 static을 사용할 수 있다. 한 객체에서 그 값을 변경하면 같은 클래스로 만들어진 모든 객체의 static 변수의 값도 함께 변경된다. final keyword와 함께 쓰여서 class constant 정의 시 사용된다. Java에서는 main() 메소드도 클래스 내에 존재해야 하므로 static으로 선언된다.

31 variable.c #include <stdio.h> int i; // 전역변수 void other();
void main(){ static int a; // static변수(0으로 초기화) register int b=3; // register변수 int c=4; // 지역변수(자동변수) printf("%d\t%d\t%d\t%d\n", i, a, b, c); other(); i++; a++; } void other(){ int i=16; // 지역변수(자동변수) static int a=0; // static변수(한번만 초기화) a+=2; printf("%d\t%d\n", i, a);

32 Variable.java class Variable{ public int i; // 멤버변수(0으로 초기화)
static int a; // static변수 public static void main(String args[]){ // static메소드 Variable v=new Variable(); int b=3; // 지역변수 int c=4; // 지역변수 System.out.println(v.i+"\t"+Variable.a+"\t"+b+"\t"+c); other(); v.i++; Variable.a++; } static void other(){ // static메소드 int i=16; // 지역변수 a+=2; System.out.println(i+"\t"+a);

33 8.5 Ada의 영역 Ada 영역 단위 부 프로그램 (procedure, function) 패키지 (package)
태스크 (task)

34 영역 단위 구조 식별자 영역과 수명 프로시져, 함수 procedure NAME(parameter) is 선언부 begin
문장부 end; package package NAME is package body NAME is task task NAME is task body NAME is

35 내포된 부프로그램과 자격 부여 예 (Ada) 식별자 영역과 수명 지역/비지역 식별자 구분 - 지역/비지역 식별자가
procedure HERE is procedure THEN is A:REAL; B:REAL; 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; ··· end THEN; end HERE; 지역/비지역 식별자 구분 - 지역/비지역 식별자가 같은 경우 지역식별자를 한정하여 표현 블럭 이름.식별자

36 Qualification.java public class Qualification{
public static double a =10.0, b = 20.0; public Qualification() { new now(); } class now extends Object { public double b = 30.0, c = 40.0; public now() { b = a; c = Qualification.b; System.out.println("b = "+b); System.out.println("c = "+c); public static void main (String args[]) { new Qualification();

37 식별자 자격 부여 사용 예(Ada) 식별자 영역과 수명 package LOGICS is begin
A, B, C:BOOLEAN; end LOGICS; procedure MAIN is 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 ··· end MAIN


Download ppt "제 8장 영역과 수명 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 주요 언어에서의 영역 8.4 변수의 수명"

Similar presentations


Ads by Google