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