PL 10장 PPT

Download Report

Transcript PL 10장 PPT

제 10장 부 프로그램
10.1 개요
10.2 매개 변수 평가와 전달 기법
10.3 형식 매개 변수 명세
10.4 부작용과 이명
10.5 연산자 중복 정의
10.6 포괄 기능
10.7 코루틴
부 프로그램
10.1 개요
부 프로그램
프로그램 모듈화 지원
함수 (function) - 함수 이름으로 값 반환
부 프로그램 (subroutine, procedure)
매개 변수로 값 반환
프로시저 4대 요소
프로시저 이름
몸체
매개 변수 (parameter) 리스트
환경
부 프로그램
10.2 매개 변수 평가와 전달 기법
형식 매개 변수와 실 매개 변수
(formal parameter) (actual parameter)
형식 매개 변수
부 프로그램 실행시 식 또는 다른 이름 대신하여
그 프로그램에서 사용되는 이름
일반적으로 지역 변수 역할
부 프로그램
실 매개 변수
부 프로그램 전달 위해 사용된 원래식 또는 이름
subroutine p (A, B)
...
formal parameter
CALL p(X, Y * Z)
Actual parameter
부 프로그램
다른 프로그래밍 언어의 예
SUBROUTINE P(A , B)
procedure
P(A , B)
P:PROCEDURE(A , B);
▽APB
CALL P(X , Y * Z)
P(X , Y * Z)
CALL P(X , Y * Z);
XPY×Z
[Fortran]
[Algol]
[PL/I]
[APL]
부 프로그램
전달 방법
(1) call by reference (by address, by location)
(2) call by value
(3) call by result
(4) call by value & result
(5) call by name
부 프로그램
(1) call by reference (by address, by location)
실 매개 변수 주소를 대응되는 형식 매개 변수에
보내는 방법
실 매개 변수가 수식이면 임시 기억 장소 계산
FORTRAN, PL/I, PASCAL(var 사용)
예) procedure P(x, y)
call P(a, b)
a
x
b
y
부 프로그램
예) call by reference
Procedure P(a, b)
begin
a <- b * 4
end
호출 : P(x[i], y)
전달 : x[i] 주소 -> ADDR1
목적 코드
LDIND ADDR2
MULT @4
STIND ADDR1
y 주소 -> ADDR2
부 프로그램
(2) call by value
실 매개 변수의 r-value를 구하여 형식 매개 변수에
복사
실 매개 변수 값이 변하지 않음
Coupling(결합도) 작게 하는 장점
PASCAL 기본, ALGOL value 사용
예) procedure P(x, y)
call P(a, b)
a
x
b
y
부 프로그램
예) call by value
Procedure P(a, b)
begin
a <- b * 4
end
목적 코드
LDIND
STORE
LDIND
STORE
ADDR1
a
ADDR2
b
LOAD b
MULT @4
STORE a
실매개 변수값을 지역 변수인
형식 매개 변수에 복사
몸체부에 대한 코드
부 프로그램
(3) call by result
값 반환 방법
부 프로그램에서 값을 반환하는 형식 매개 변수 값
저장, 기억 장소 보유
최종 값 실 매개 변수에 복사 (epolog)
(4) call by value & result
Call by value + call by result
ALGOL-w, ALGOL 68, Ada
부 프로그램
예) call by value & result
Procedure P(a, b) { a:by result, b : by value }
begin
a <- b * 4
end
목적 코드
LDIND ADDR1
STORE b
LOAD b
MULT @a
STORE a
LOAD
STIND
b
ADDR1
B에 대한 시작부 (by value)
몸체부
A에 대한 끝맺음부(by result)
부 프로그램
매개 변수 전달 기법에 따른 차이를 보이기 위한
프로그램 예
procedure PRINT
integer y
procedure INCR(x)
integer x
begin
y
1
x
x+2
end
begin
y
0
INCR(y)
write y
end
call by reference
y
3
call by value
y
1
call by value & result
y
2
부 프로그램
(5) call by name
형식 매개 변수의 이름이 사용될 때마다 그에 대응
되는 실 매개 변수 그 자체가 사용된 것 처럼 매번
구하여 실행
구현 거의 불가능 (컴파일러 언어)
프로그램 작성, 읽기 어렵다
ALGOL 60
부 프로그램
예) PL/I 형태 프로그램 (1)
P : PROCEDURE;
DECLARE A(3), I;
I = 1;
A(1) = 2;
A(2) = 4;
CALL Q(A(I));
Q : PROCEDURE(B);
A(I) = 3;
I = 2;
PUT LIST(B);
END Q;
END P;
/* A는 세개의 원소를 갖는 배열*/
/* =은 배정 연산자 */
/* A(I)가 실매개 변수 */
/* 형식 매개 변수 B는 실매개
변수 A(I)에 대응됨 */
/* 식별자 A와 I는 프로시저 P에서
상속 */
/* B값을 인쇄 */
부 프로그램
예) PL/I 형태 프로그램 (2)
P : PROCEDURE;
DECLARE A;
A = 1;
CALL Q(A);
Q : PROCEDURE(B);
DECLARE A, B;
A = 2;
PUT LIST(B);
END Q;
END P;
부 프로그램
예) ALGOL 형태 프로그램
begin
integer k
integer array v
procedure P(a)
integer a
begin
a <- a + 1
v[k] <- 5
k <- 3
a <- a + 1
end
v[3] <- 6
v[4] <- 8
k <- 4
call P(v[k])
end
부 프로그램
10.3 형식 매개 변수 명세
언어들은 매개 변수의 여러 사항 번역기에게 알림
Ada
call by value
in : 값 전달 (지역 상수)
out : 결과 전달
in out : 값 결과 전달
부 프로그램
예)
Procedure NonSense (
A : in integer
B : in out integer
C : out integer ) is
begin
B := B + A
C := 0;
end
main :
x := 1;
y := 5;
z := 10;
NonSense ( X, Y, Z)
부 프로그램
10.4 부작용과 이명
프로그램을 난해하게 함
Goto 문
부작용(side effect)
비 지역 변수의 값을 변화 시킴
call by reference, call by name
FORTRAN COMMON문
이명 (aliasing)
동일한 기억 장소를 함께 사용하고 있는 다른
이름의 변수들
FORTRAN의 EQUIVALENCE, COBOL의 REDEFINES
부 프로그램
10.5 연산자 중복 정의 (overloading)
한 개체 (식별자, 함수이름, 연산자 등등)가
두 가지 이상의 개념으로 사용되었을 때
장점
일반적 표기 방법 지원
중복 사용하여 프로그램 합쳐도 혼동 안됨
예) Ada : 연산자가 행렬 곱셈으로 중복 표현
function “*” (X, Y : MATRIX) return MATRIX;
부 프로그램
Ada에서의 중복 표현 해결 예
procedure MAIN is
...
package P is
function F(X : REAL) return RANGE ;
-- P.F
function G(X : DOMAIN) return REAL ;
-- P.G
function K(X : DOMAIN) return BOOLEAN ; -- P.K
end P;
function F(X : BOOLEAN) return RANGE ; -- MAIN.F
function G(X : DOMAIN) return BOOLEAN ; -- MAIN.G
function K(X : DOMAIN) return REAL ;
-- MAIN.K
S : DOMAIN ; T : RANGE ;
U : BOOLEAN ; V : REAL ;
use P;
...
begin
T := F(V) ; -- P.F(V)를 의미
T := F(U) ; -- MAIN.F(U)를 의미
T := F(K(S)) ; -- MAIN.F(P.K(S))인지 P.F(MAIN.K(S))인지 애매 모호함
T := F(G(S)) ; -- MAIN.F(MAIN.G(S))인지 P.F(P.G(S))인지 애매 모호함
end
부 프로그램
10.6 포괄 기능
하나 이상의 요소는 매개 변수로 받아 들이는
프로시저들을 의미
매개 변수가 컴파일 시간에 실매개 변수로 대체되어
실제 프로시저를 발생
장점
일반적 표기 방법 지원
중복 사용하여 프로그램 합쳐도 혼동 안됨
부 프로그램
Ada에서의 포괄 프로시저
generic type ITEM is private;
procedure SWAP(X, Y : in out ITEM) is
TEMP : ITEM ;
begin
TEMP := Y ;
Y := X ;
X := TEMP ;
end ;
부 프로그램
포괄 프로시저의 실제화 방법
procedure SWAPINTEGER is new SWAP(INTEGER) ;
procedure SWAPREAL is new SWAP(FLOAT) ;
프로시저의 사용
SWAPINTEGER(A, B) ;
SWAPREAL(P, Q) ;
프로시저의 사용
procedure
procedure
procedure
procedure
EXCHG
EXCHG
EXCHG
EXCHG
is
is
is
is
new SWAP(INTERGER) ;
new SWAP(FLOAT) ;
new SWAP(BOOLEAN) ;
new SWAP(CHARACTER) ;
부 프로그램
10.7 코루틴 (coroutines)
주종이 아니라 프로시저들 사이의 동등관계
Coroutine A에서 resume B 수행 단계
A의 resume 문장 다음 위치를 A의 제어 장소에 기억
Coroutine B의 실행 위치 알기 위해 B의 제어 장소의
값 참조
부 프로그램
두 코루틴 사이의 제어 수행도
A
Resume B
B
Resume A
Resume B
Resume A
Resume B