Transcript Document

1
Chapter 8 – 영역과 수명
Outline
8.1
8.2
8.3
8.4
8.5
블록과 영역
정적 영역과 동적 영역
언어에서의 영역
변수의 수명
Ada의 영역
2
8.1 블록과 영역
•
영역(Scope)
– 식별자의 효력을 나타낼 수 있는 영역
식별자의 사용이 허락되는 프로그램의 범위
– 식별자(Identifier)
변수, 상수, 레이블, 자료형, 부프로그램 등의 이름
•
수명(Extent 또는 Life time)
– 식별자(변수) 값을 보유할 기억장소가 배정되어 있는
실행시간
– 식별자의 기억장소 할당부터 해제까지의 기간
3
8.1 블록과 영역
• 식별자 영역 제공의 간결한 방법
- 모든 식별자를 전 프로그램에서 사용가능 (전역 변수화)
모든 프로그램에서 모든 식별자 공유
– 문제점
• 식별자 사용의 복잡화
• 식별자 혼돈
단위프로그램의 식별자
• 프로그램 합성 시 문제점 발생
(지역화 요구)
• ALGOL 60
– begin-end 사용
• 블록 구조(지역 식별자 선언 가능)
1) 블록 입구 - 기억장소 할당
2) 블록 출구 - 기억장소 해제
• 블록끼리는 nested 또는 disjoint
• 복합문(compound statement)과 대조
• ALGOL60
integer x
1) 컴파일 시간
x
2) 실행시간
x
integer
integer
4
8.2 동적 영역과 정적 영역
• 정적 영역 규칙(static scope rule)
-
식별자의 사용 영역을 블록의 정적 내포관계로 결정(컴파일러 언어)
1) 지역변수 - 현재 블록에서 선언된 변수, 형식매개변수
2) 비지역 변수 - 현재 블록에서 사용되나 바깥 블록에서 선언된 변수
3) 전역 변수 - 모든 블록에서 사용 가능한 변수
[참고] 자유변수 (free variable)
현재 블록에서 선언되지 않고 사용되는 변수
[참고] 영역 구멍 (hole-in-scope)
내포된 블록 사이에 동일 지역변수를 선언하면, 바깥 블록의
지역변수는 내부 블록 구간에서 사용할 수 없는 현상
지역 (local)
전역 (global)
5
8.2 동적 영역과 정적 영역
정적 영역 규칙 (Algol)
1 a : begin integer i, j; real x, y;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bb :: procedure
procedure test(integer
test(integer a,
a, b)
b)
begin
begin boolean
boolean i;I;
.. .. ..
xx :: == iI ** jj +y;
+y;
.. .. ..
end
end b;
b;
...
cc :: begin
begin integer
integer x,
x, y;
y; real
real i,i, j;j;
<각 변수 영역 줄번호>
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
9~17
1~8,
18~19
9~17
1~8,
18~19
...
dd :: begin
begin boolean
boolean j;j;
.. .. .. .
call
test(x,
y);
call
test(x,
y);
call
test(x,
y);
.. ... ... .
end
d;
end
d;d;
end
end
. . c;
17
...
18
end a;
integer
real
6
8.2 동적 영역과 정적 영역
• 정적 영역 규칙을 따른 변칙 현상(anomaly):
– 영역 구멍(hole – in –scope)
• 앞 페이지 예 a 에서 선언된 x처럼 전역 선언이
지역선언 때문에 보이지 않을 때
– 영역과 선언의 가시성(visibility)에 약간의 차이를 갖는다.
– Ada와 Java에서는 영역 한정자에 의해 접근이 가능하다.
• 예) 앞 페이지 예에서 : Ada 경우
• 블록 c에서 영역 구멍 상태 인 a 블록의 x 접근
a. x
• 가시성 (visibility)
블록 c에서 a의 x를 볼 수
있다. : 선택에 의한 가시성
7
8.2 동적 영역과 정적 영역
• 동적 영역 규칙(dynamic scope rule)
- 식별자의 영역이 실행시간에 확정
- 식별자의 사용 영역이 프로그램의 실행 순서에 의해 결정
- 인터프리터 언어에서 주로 사용
8
8.2 동적 영역과 정적 영역
•
동적 영역 규칙 사용 예 (APL에서)
주 프로그램
Z←0
X←0
Y←0
SUB 2
Z ← FUN Y
: 2는 실 매개 변수
: Y는 실 매개 변수, 결과를 Z에 배정
▽ SUB I ; Y
: I는 형식 매개 변수, Y는 지역 변수
…X…
…Y…
부 프로그램
SUB
Z ← FUN N ; X
▽
함수
프로그램
FUN
▽ R ← FUN N ; X : N는 형식 매개 변수
:X는 지역, Y는 전역 변수
…X…
…Y…
▽
1) 주 프로그램에서 SUB 2 호출
<SUB>
X, Z : 전역 변수 (주 프로그램)
Y : 지역 변수
SUB 에서 FUN N 호출
<FUN>
Y : 비지역 변수 (SUB)
N, X : 지역 변수
2) 주 프로그램에서 FUN Y 호출
<FUN>
Y : 전역 변수 (주 프로그램)
N, X : 지역 변수
9
8.2 동적 영역과 정적 영역
• 예제 8.1 영역규칙 적용 예
program scope;
var a, b : integer;
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;
begin
a := p;
end scope
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
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과 공유
11
8.3 주요 언어에서의 영역
• JOVIAL
– ALGOL 58의 후계자
–
–
–
–
–
–
미국방성에서 주로 사용
정적 영역 규칙(블록 중심)
분리 컴파일 허용
COMPOOL (communications pool)
각 모듈에게 자료, 프로시저, 정의 등의 공유를 제공
COMPOOL을 사용해서 실행시간에 매개변수 간의 형 검사
• PL/I
– ALGOL 60의 후계자
– BEGIN..END 도입(블록 개념)
– 묵시적 선언가능 -> 문제점 발생
12
8.3 주요 언어에서의 영역
• PL/1 영역 문제점
PEC :PROCEDURE
A :BEGIN;
···
B : BEGIN;
J = X;
···
C : BEGIN
J = Y;
···
END C;
D
①
②
:/* 여기서 J를 사용 */ ③
① J : 프로시저 PEC에서 묵시적 선언 간주
② J : 프로그래머가 C에서 선언하여 사용한
것으로 간주
③ J의 해석 (?)
묵시적 선언 => 변수 선언의 혼동 초래
END B;
END A;
END PEC;
13
8.3 주요 언어에서의 영역
• ALGOL 68
– begin ... end 블록 개념 일반화(문맥시작과 마침 기호
다양함)
– 영역 블록 - 모든 문맥시작 기호와 문맥 마침 기호 사이
– 선언
• 블록 입구에서 선언
• 블록 끝에서 해제
=> 영역 : 블록 단위
– 예)
if-fi, then-else, else-fi,
begin-end, loop–pool,
case-esac 등
if
then
else
fi
14
8.3 주요 언어에서의 영역
• Pascal
– begin ... end 도입 : 복합문 개념 - 영역 블록 아님
– 선언 - 프로시저, 함수 시작부
=> 프로시저/함수가 영역 단위
– 프로시저 내포 가능
• 정적 영역 규칙
• 예) Pascal 영역 문제
procedure A
procedure B
procedure C
procedure D
호출 구조
1) A : A, B, D
2) B : A, B, C
3) C : A, B, C
4) D : A, B, D
변수 영역
- 정적 영역 규칙
예) B에서 선언된 변수
B : 지역변수
C : 비지역 변수
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) ;
}
}
동등하다.
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 : 영역 구멍 상태
17
8.3 주요 언어에서의 영역
• C에서는 모든 함수 전체를 영역으로 하는 외부 영역
(external scope) 이 존재.
외부 영역만이 전역임
int i, j ;
float x , y ;
void main (void)
{
int i, k ;
float a, b, c ;
· · ·
}
/* i, j, x, y는 전역 변수 */
/* i, k는 main 함수의 지역변수 */
/* a, b, c는 main 함수의 지역변수*/
18
8.3 언어에서의 영역
• C++, Java
– 변수 정의가 어디에서나 나타날 수 있다.
(영역 : 정의문에서 함수 끝까지)
– For문의 초기화식에 제어 변수가 정의되는 것을 허용
• 블록 구조를 통한 영역개념의 장점
①지역성(locality)을 높여준다.
변수를 사용할 프로그램 가까이서 선언
②운영 체제하에서 작은 working set 요구
크기가 작은 기억장소 요구
③표준 패키지를 사용자 프로그램에 결합시켜 하나의
프로그램을 만들기 쉽다.
④프로그램의 구성을 단계적으로 세분화하는데 도움이 된다.
19
8.4 변수의 수명 (extent)
• 수명(Extent 또는life time)
변수가 기억장소를 할당 받은 기간(실행시간)
X
int
• Fortran
정적 기억장소 할당
변수 수명 = 프로그램수명
20
8.4 변수의 수명 (extent)
• Algol 60
– 블록 단위 할당/해제
=> 변수 수명 : 블록 시작 ~ 블록 종료(선언블록)
– own 변수
static 변수 =>
변수 수명: 주 프로시저 시작 ~ 주 프로시저 종료
참고) 변수 영역 : 선언블록
• 초기화는 한 번(첫 번째 진입 시)
• own 형의 가변 배열 (?)
•
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)
22
8.4 변수의 수명 (extent)
• PL/1 기억 장소 요약
기억 장소 자료형
기억 장소 할당 시점
기억 장소 소멸 시점
STATIC
주프로시저의 시작 시점
주프로시저의 종료 시점
AUTOMATIC
proc/block의 시작 시점
proc/block의 종료 시점
CONTROLLED
ALLOCATE 실행 시점
FREE문 실행, 또는 태스크를
벗어나는 시점
BASED
ALLOCATE 실행 시점
FREE문 실행, 또는 태스크를
벗어나는 시점
• 동적 수명
– 힙 기법 사용
– 주요언어 사용 예)
Pascal - new() ~ dispose()
PL/1 - ALLOCATE() ~ FREE()
C - malloc() ~ free()
C++ - new ~ delete
스택 사용
힙 사용
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;
24
8.5 Ada 의 영역
• 이름 한정(qualification)를
통해 영역구멍
상태인 식별자를 사용할 수 있다.
이름 한정(qualification)
25
8.4 변수의 수명 (extent)
• 내포된 부 프로그램과 이름한정 예 (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;
begin
…
end THEN;
begin
…
end HERE
26
8.4 변수의 수명 (extent)
• 식별자 이름한정
사용 예(Ada)
package LOGICS is
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
Begin
…
end MAIN
슬라이드 쇼가 끝났습니다.
28
용 어 정리
29
영역 (scope)
용어 국제 표준 규격 15.02.06
scope
scope of a declaration
영역
선언 영역
That portion of a program within which a declaration is valid.
프로그램 내에서 어떤 선언이 유효한 부분
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.
해당 언어 구성자가 선언된 선언구역만을 영역으로 하는 언어 구성자의 속성
31
전역 (global)
용어 국제 표준 규격 15.02.12
global
전역
Pertaining to a language construct that is within the scope of all modules of the
program.
프로그램의 모든 모듈을 영역으로 하는 언어 구성자의 속성
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.
어떤 모듈이 수행 중 자신이 가지고 있지 않은 선언들을 요구할 때, 그 선언들을 가진
다른 모듈들의 전체 또는 일부가 미리 활성화되어서 생성된 영역
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) 프로그램에서 특정 언어 구성자를 참조할 수 있는 부분
34
수명 (lifetime)
용어 국제 표준 규격 15.02.16
lifetime
수명
The portion of the execution duration during which a language construct exists.
언어 구성자가 존재하는 동안을 가리키는 실행시간의 부분
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.
프로그램의 어느 영역 내부에 있는 언어 구성자를 참조하기 위한 수단인데, 해당
부분과 그 부분의 언어 구성자에 선언된 식별자를 참조함으로써 가능하다.
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개 이상 따라오도록 구성된다.
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.
하나 이상의 문장들을 포함하고 있는 문장으로, 단순문과 구문적으로 동등하게 취급
될 수 있다.
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.
선언문이 선언된 곳을 둘러싼 모듈 중 가장 안쪽 모듈을 찾아 영역을 결정하는 영역
<주> 한 프로그램을 책상에 앉아 점검하기만 해도 정적 영역을 충분히 찾아낼 수 있다.