Top Banner
1 Chapter 8 – 영영영 영영 Outline 8.1 영영영 영영 8.2 영영 영영영 영영 영영 8.3 영영영영영 영영 8.4 영영영 영영 8.5 Ada 영 영영
38

Chapter 8 – 영역과 수명

Jan 17, 2016

Download

Documents

gunda

Chapter 8 – 영역과 수명. Outline 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 언어에서의 영역 8.4 변수의 수명 8.5Ada 의 영역. 8.1 블록과 영역. 영역 (Scope) 식별자의 효력을 나타낼 수 있는 영역 식별자의 사용이 허락되는 프로그램의 범위 식별자 (Identifier) 변수 , 상수 , 레이블 , 자료형 , 부프로그램 등의 이름 수명 (Extent 또는 Life time) - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Chapter 8 –  영역과 수명

1

Chapter 8 – 영역과 수명

Outline8.1 블록과 영역8.2 정적 영역과 동적 영역 8.3 언어에서의 영역8.4 변수의 수명8.5 Ada 의 영역

Page 2: Chapter 8 –  영역과 수명

2

8.1 블록과 영역

• 영역 (Scope)– 식별자의 효력을 나타낼 수 있는 영역 식별자의 사용이 허락되는 프로그램의 범위– 식별자 (Identifier) 변수 , 상수 , 레이블 , 자료형 , 부프로그램 등의 이름

• 수명 (Extent 또는 Life time)

– 식별자 ( 변수 ) 값을 보유할 기억장소가 배정되어 있는

실행시간

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

Page 3: Chapter 8 –  영역과 수명

3

8.1 블록과 영역• 식별자 영역 제공의 간결한 방법

- 모든 식별자를 전 프로그램에서 사용가능 ( 전역 변수화 )

모든 프로그램에서 모든 식별자 공유– 문제점

• 식별자 사용의 복잡화• 식별자 혼돈 단위프로그램의 식별자 • 프로그램 합성 시 문제점 발생 ( 지역화 요구 )

• ALGOL 60– begin-end 사용

• 블록 구조 ( 지역 식별자 선언 가능 ) 1) 블록 입구 - 기억장소 할당 2) 블록 출구 - 기억장소 해제• 블록끼리는 nested 또는 disjoint • 복합문 (compound statement) 과 대조

• ALGOL60

integer x

1) 컴파일 시간

2) 실행시간

x integer

x integer

Page 4: Chapter 8 –  영역과 수명

4

8.2 동적 영역과 정적 영역

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

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

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

3) 전역 변수 - 모든 블록에서 사용 가능한 변수

[ 참고 ] 자유변수 (free variable)

현재 블록에서 선언되지 않고 사용되는 변수 [ 참고 ] 영역 구멍 (hole-in-scope)

내포된 블록 사이에 동일 지역변수를 선언하면 , 바깥 블록의 지역변수는 내부 블록 구간에서 사용할 수 없는 현상

지역 (local) 전역 (global)

Page 5: Chapter 8 –  영역과 수명

5

8.2 동적 영역과 정적 영역

i j

integer

boolean

real

1, 2, 8, 18~19

3~7

9~17

1~8, 18~19

11~15

9~10, 16~17

x y

integer

real

9~17

1~8, 18~19

9~17

1~8, 18~19

1 a : begin integer i, j; real x, y;

2 b : procedure test(integer a, b)

3 begin boolean I;

4 . . .

5 x : = I * j +y;

6 . . .

7 end b;

8 . . .

9 c : begin integer x, y; real i, j;

10

11 d : begin boolean j;

12 . . .

13 call test(x, y);

14 . . .

15 end d;

16 . .

17 . . .

18 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;

정적 영역 규칙 (Algol)< 각 변수 영역 줄번호 >

Page 6: Chapter 8 –  영역과 수명

6

8.2 동적 영역과 정적 영역

• 정적 영역 규칙을 따른 변칙 현상 (anomaly):– 영역 구멍 (hole – in –scope)

• 앞 페이지 예 a 에서 선언된 x 처럼 전역 선언이 지역선언 때문에 보이지 않을 때

– 영역과 선언의 가시성 (visibility) 에 약간의 차이를 갖는다 .– Ada 와 Java 에서는 영역 한정자에 의해 접근이 가능하다 .

• 예 ) 앞 페이지 예에서 : Ada 경우• 블록 c 에서 영역 구멍 상태 인 a 블록의 x 접근

a. x

• 가시성 (visibility)

블록 c 에서 a 의 x 를 볼 수 있다 . : 선택에 의한 가시성

Page 7: Chapter 8 –  영역과 수명

7

8.2 동적 영역과 정적 영역

• 동적 영역 규칙 (dynamic scope rule)

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

- 식별자의 사용 영역이 프로그램의 실행 순서에 의해 결정

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

Page 8: Chapter 8 –  영역과 수명

8

8.2 동적 영역과 정적 영역

• 동적 영역 규칙 사용 예 (APL 에서 )

1) 주 프로그램에서 SUB 2 호출 <SUB>

X, Z : 전역 변수 ( 주 프로그램 )Y : 지역 변수

SUB 에서 FUN N 호출 <FUN>

Y : 비지역 변수 (SUB)N, X : 지역 변수

2) 주 프로그램에서 FUN Y 호출 <FUN>

Y : 전역 변수 ( 주 프로그램 )

N, X : 지역 변수

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 ▽

▽ R ← FUN N ; X : N 는 형식 매개 변수함수 :X 는 지역 , Y 는 전역 변수 프로그램 … X …FUN … Y …

Page 9: Chapter 8 –  영역과 수명

9

8.2 동적 영역과 정적 영역

• 예제 8.1 영역규칙 적용 예program scope; var a, b : integer;

begin a := p; q; end scope

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;

실행과정 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

Page 10: Chapter 8 –  영역과 수명

10

8.3 주요 언어에서의 영역

• FORTRAN– 지역변수 자체 프로그램 (MAIN, SUBROUTINE,또는 FUNCTION) 에서 ( 명시

적 / 묵시적 ) 선언한 변수 사용– 전역변수 COMMON 문으로 선언 한 변수– 예 ) C THIS IS THE MAIN PROGRAM

COMMON /A/ X, Y, Z(10)COMMON GD, IRED, TEMP . . .END

SUBROUTINE A1(P, Q)COMMON XX, KRED, XTEMP . . .END

SUBROUTINE A2(P, Q)COMMON /A/ G, H, Z(10) . . .END

X, Y, Z(10) 은 A2 와 공유 GD, IRED, TEMP 는 A1 과 공유

Page 11: Chapter 8 –  영역과 수명

11

8.3 주요 언어에서의 영역

• JOVIAL– ALGOL 58의 후계자– 미국방성에서 주로 사용– 정적 영역 규칙 ( 블록 중심 )– 분리 컴파일 허용– COMPOOL (communications pool)– 각 모듈에게 자료 , 프로시저 , 정의 등의 공유를 제공– COMPOOL을 사용해서 실행시간에 매개변수 간의 형 검사

• PL/I– ALGOL 60의 후계자– BEGIN..END 도입 ( 블록 개념 )– 묵시적 선언가능 -> 문제점 발생

Page 12: Chapter 8 –  영역과 수명

12

8.3 주요 언어에서의 영역

• PL/1 영역 문제점:PROCEDURE

A

END PEC;

: BEGIN; ···B

END A;

: BEGIN; J = X; ① ···C

D

END B;

: BEGIN J = Y; ② ···END C;

PEC

: /* 여기서 J 를 사용 */ ③

① J : 프로시저 PEC 에서 묵시적 선언 간주 ② J : 프로그래머가 C 에서 선언하여 사용한 것으로 간주 ③ J 의 해석 (?)

묵시적 선언 => 변수 선언의 혼동 초래

Page 13: Chapter 8 –  영역과 수명

13

8.3 주요 언어에서의 영역

• ALGOL 68– begin ... end 블록 개념 일반화 ( 문맥시작과 마침

기호 다양함 )– 영역 블록 - 모든 문맥시작 기호와 문맥 마침 기호 사이– 선언

• 블록 입구에서 선언• 블록 끝에서 해제 => 영역 : 블록 단위

– 예 ) if-fi, then-else, else-fi, begin-end, loop–pool, case-esac 등

then

else

if

fi

Page 14: Chapter 8 –  영역과 수명

14

8.3 주요 언어에서의 영역

• Pascal– begin ... end 도입 : 복합문 개념 - 영역 블록

아님– 선언 - 프로시저 , 함수 시작부 => 프로시저 / 함수가 영역 단위– 프로시저 내포 가능

• 정적 영역 규칙

• 예 ) Pascal 영역 문제 procedure A

procedure D

procedure B

호출 구조 1) A : A, B, D 2) B : A, B, C 3) C : A, B, C 4) D : A, B, D

변수 영역 - 정적 영역 규칙 예 ) B 에서 선언된 변수 B : 지역변수 C : 비지역 변수

procedure C

Page 15: Chapter 8 –  영역과 수명

15

8.3 주요 언어에서의 영역

• C, C++, Java에서의 영역– Algol과 같은 블록 개념의 언어– begin-end 대신에 중괄호 ( { ,} )를 사용하여

영역을 정의

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

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

동등하다 .

Page 16: Chapter 8 –  영역과 수명

16

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 : 영역 구멍 상태

Page 17: Chapter 8 –  영역과 수명

17

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 함수의 지역변수 */ · · · }

Page 18: Chapter 8 –  영역과 수명

18

8.3 언어에서의 영역

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

• 블록 구조를 통한 영역개념의 장점①지역성 (locality)을 높여준다 . 변수를 사용할 프로그램 가까이서 선언②운영 체제하에서 작은 working set 요구 크기가 작은 기억장소 요구③표준 패키지를 사용자 프로그램에 결합시켜 하나의

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

다 .

Page 19: Chapter 8 –  영역과 수명

19

8.4 변수의 수명 (extent)

• 수명 (Extent 또는 life time)

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

• Fortran 정적 기억장소 할당 변수 수명 = 프로그램수명

X int

Page 20: Chapter 8 –  영역과 수명

20

8.4 변수의 수명 (extent)

• Algol 60– 블록 단위 할당 / 해제

=> 변수 수명 : 블록 시작 ~ 블록 종료 (선언블록 )

– own 변수 • static 변수 =>

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

참고 ) 변수 영역 : 선언블록• 초기화는 한 번 ( 첫 번째 진입 시 )• own 형의 가변 배열 (?)

Page 21: Chapter 8 –  영역과 수명

21

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)

Page 22: Chapter 8 –  영역과 수명

22

8.4 변수의 수명 (extent)

• PL/1 기억 장소 요약

• 동적 수명– 힙 기법 사용– 주요언어 사용 예 ) Pascal - new() ~ dispose() PL/1 - ALLOCATE() ~ FREE()

C - malloc() ~ free() C++ - new ~ delete

기억 장소 자료형 기억 장소 할당 시점 기억 장소 소멸 시점

STATIC 주프로시저의 시작 시점 주프로시저의 종료 시점

AUTOMATIC proc/block 의 시작 시점 proc/block 의 종료 시점

CONTROLLED ALLOCATE 실행 시점 FREE 문 실행 , 또는 태스크를 벗어나는 시점

BASED ALLOCATE 실행 시점 FREE 문 실행 , 또는 태스크를 벗어나는 시점

스택 사용

힙 사용

Page 23: Chapter 8 –  영역과 수명

23

8.5 Ada 의 영역

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

• 영역 단위 구조

프로시져 , 함수 package task

procedure NAME(parameter) is

선언부begin

문장부end;

package NAME is 명세부end;package body NAME is 몸체end;

task NAME is 명세부end;task body NAME is 몸체end;

Page 24: Chapter 8 –  영역과 수명

24

8.5 Ada 의 영역

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

이름 한정 (qualification)

Page 25: Chapter 8 –  영역과 수명

25

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;

Page 26: Chapter 8 –  영역과 수명

26

8.4 변수의 수명 (extent)

• 식별자 이름한정 사용 예 (Ada)

package LOGICS is A, B, C : BOOLEAN;

end LOGICS;

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 endend DOSOMETHING

Page 27: Chapter 8 –  영역과 수명

슬라이드 쇼가 끝났습니다 .

Page 28: Chapter 8 –  영역과 수명

28

용 어 정리

Page 29: Chapter 8 –  영역과 수명

29

영역 (scope)

용어 국제 표준 규격 15.02.06

scope   영역scope of a declaration 선언 영역

That portion of a program within which a declaration is valid.

프로그램 내에서 어떤 선언이 유효한 부분

Page 30: Chapter 8 –  영역과 수명

30

지역 (local)

용어 국제 표준 규격 15.02.11

local (adj.) 지역

Pertaining to a language construct that has a scope only within the declarative region

in which it is declared.

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

Page 31: Chapter 8 –  영역과 수명

31

전역 (global)

용어 국제 표준 규격 15.02.12

global 전역

Pertaining to a language construct that is within the scope of all modules of the

program.

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

Page 32: Chapter 8 –  영역과 수명

32

동적 영역 규칙 (dynamic scope rule)

용어 국제 표준 규격 15.02.08

dynamic scope 동적 영역

The scope created by the activation of portions or all of the modules that contain

declarations used by another module that lacks these declarations during the execution

of the latter module.

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

Page 33: Chapter 8 –  영역과 수명

33

가시성 (visibility)

용어 국제 표준 규격 15.02.17(18)

visibility 가시성

(1) The ability to make a reference to a particular language construct at a specific place

in a module.

(2) The portion of a program within which a reference can be made to a specific

language construct.

(1) 모듈의 지정한 위치에서 특정 언어 구성자를 참조할 수 있게 하는 능력

(2) 프로그램에서 특정 언어 구성자를 참조할 수 있는 부분

Page 34: Chapter 8 –  영역과 수명

34

수명 (lifetime)

용어 국제 표준 규격 15.02.16

lifetime 수명

The portion of the execution duration during which a language construct exists.

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

Page 35: Chapter 8 –  영역과 수명

35

이름 한정 (qualification)

용어 국제 표준 규격 15.03.18

name qualification qualification

이름 한정

A means of referencing language constructs within the scope of a portion of a program

by reference to that portion and an identifier declared for the language construct in

that portion.

프로그램의 어느 영역 내부에 있는 언어 구성자를 참조하기 위한 수단인데 , 해당 부분과 그 부분의 언어 구성자에 선언된 식별자를 참조함으로써 가능하다 .

Page 36: Chapter 8 –  영역과 수명

36

식별자 (identifier)

용어 국제 표준 규격 15.01.03

identifier (in programming language) 식별자 ( 프로그래밍 언어에서 )

A lexical token that names a language construct.

<Examples> the names of variables, arrays, records, labels, procedures,

etc.

<NOTE> An identifier usually consists of a letter optionally followed by

letters, digits, or

other characters.

언어 구성자를 명명하는 어휘 토큰

< 예 > 변수 , 배열 , 레코드 , 레이블 , 프로시저 등의 이름

< 주 > 식별자는 일반적으로 문자가 맨 앞에 오고 그 뒤에 영문자 , 숫자 , 또는 그 밖의

문자가

0 개 이상 따라오도록 구성된다 .

Page 37: Chapter 8 –  영역과 수명

37

복합문 (compound statement)

용어 국제 표준 규격 15.05.03

compound statement 복합문

A statement that contains one or more statements, so delimited as to be the syntactic

equivalent of a simple statement.

하나 이상의 문장들을 포함하고 있는 문장으로 , 단순문과 구문적으로 동등하게 취급 될 수 있다 .

Page 38: Chapter 8 –  영역과 수명

38

정적 영역 규칙 (static scope rule)

용어 국제 표준 규격 15.02.09

static scope 정적 영역

The scope as determined by finding the innermost surrounding module in which the

declaration is made.

<Note> Desk checking of a program is sufficient for finding a static scope.

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

< 주 > 한 프로그램을 책상에 앉아 점검하기만 해도 정적 영역을 충분히 찾아낼 수 있다 .