Transcript 10장

1
Chapter 10 – 부 프로그램
Outline
10.1
10.2
10.3
10.4
10.5
10.6
10.7
개요
매개변수 평가와 전달기법
형식 매개변수 명세
부수효과와 이명
연산자 중복 정의
포괄 기능
코루틴
2
10.1 개요
•
부프로그램(subprogram, procedure)
– 일련의 행위나 계산을 추상화하는 기법으로 제공
– 실행과 분리해서 선언할 수 있는 블록(호출 요구)
– 함수(function) : 함수 이름으로 값 반환
– 서브루틴(subroutine),프로시저(procedure) : 매개변수로 값 반환
•
부프로그램의
일반적 특성
– 각 프로시저는 단일 진입점을 갖음
– 호출프로그램(caller)은 피호출 프로그램(callee)의 실행동안 중단
– 부프로그램 종료 시 제어는 호출자에게 되돌아감
•
프로시저의 구성
– 프로시저 이름
– 매개변수(parameter) 리스트
– 환경(environment)
– 몸체(body)
procedure 프로시저 이름(매개변수리스트)
선언부(declarations)
몸체(body)
end 프로시저 이름
3
10.1 개요
• 매개변수 (parameter)
• 매개변수 결합 (parameter association)
• 위치 매개변수 결합(positional parameter association)
– 리스트에 나타난 위치로 바인딩
– 짧은 매개변수 리스트에 적합
• 이름 매개변수 결합(named parameter association)
– 이름으로 바인딩
– 매개변수 리스트가 길 때 적합
– 일부 매개변수 값을 디폴트로 줄 때 적합
4
10.1 개요
•
함수(Function)
– 함수 이름으로 값을 반환
– 함수의 투명성 제공(환경 변화 없이)
- 함수 값 반환 방법
• 함수이름에 값 배정
• RETURN 문으로 결과 값 반환
•
함수 반환 값으로 허용되는 자료형
– FORTRAN, ALGOL 60 : 스칼라형(실수, 정수, 논리형 등)
– Pascal : 스칼라형, 포인터
– PL/I : 스칼라형, 포인터, 문자열
– Ada : 모든 자료형(배열, 레코드 등 포함): 반환문의 직교성
– C, C++ : 스칼라형, 포인터(반환문의 직교성을 갖도록 제공)
5
10.1 개요
• 프로시저에서 사용 식별자
– 형식 매개 변수
– 지역 변수
– 비지역 변수
• 프로시저에 관해서 고려할 사항
– 비지역 변수 값을 바인딩하는 환경은?
– 실 매개 변수의 평가방법은?
– 형식 매개 변수와 실 매개 변수의 바인딩 방법은?
6
10.2 매개변수 평가와 전달기법
• 형식 매개 변수와 실매개 변수
– 실 매개 변수
• 호출 프로그램으로 전달하기 위하여 사용된 식 또는 이름
– 형식 매개 변수
• 부프로그램이 실행될 때, 실 매개 변수를 대신하여 사용되는 이름
• 일반적으로 지역 변수(또는 상수) 역할
• 매개 변수 명세 제공
– 최근 경향
– 형식매개변수 이름, 자료형, 바인딩 방법 등등
7
10.2 매개변수 평가와 전달기법
• 형식 매개 변수와 실 매개 변수의 사용 예
– 형식 매개 변수 - 피호출자 (callee)
SUBROUTINE P(A , B)
procedure
P(A , B)
[Fortran]
[Algol]
P:PROCEDURE(A , B);
[PL/I]
▽APB
[APL]
– 실 매개 변수 - 호출자 (caller)
CALL P(X , Y * Z)
P(X , Y * Z)
CALL P(X , Y * Z);
XPY×Z
8
10.2 매개변수 평가와 전달기법
• 형식 매개 변수와 실 매개 변수의 대응 방법
– 위치 대응
• 형식 매개 변수와 실 매개 변수가 순서대로 대응
• 예) procedure TEST(A, B : in REAL; C : in INTEGER);
call TEST(0.1, 100.0, 50);
– 이름 대응
• 실 매개 변수에서 대응되는 형식 매개 변수 이름 사용
• Ada 언어 예 : 위치 대응, 이름 대응 병행 사용
(위 procedure 선언문에서 다음 경우 모두 동일)
TEST (A => 0.1, C => 50, B => 100.0);
TEST (0.1, C => 50, B => 100.0);
TEST (0.1, 100.0, 50);
9
10.2 매개변수 평가와 전달기법
• 참조 호출 (Call by reference, - by address, - by location)
• 실 매개 변수 주소를 대응되는 형식 매개 변수에 보내는 방법
procedure p (x, y)
call p (a, b)
a
x
b
y
• 기법 적용
– caller는 실 매개 변수의 주소를 계산하여 callee에게 전달
10
10.2 매개변수 평가와 전달기법
• 예제) 참조 호출 기법의 사용 예
procedure p(a, b)
begin a
b*4
{call by reference}
end
• p(x[i], y) 호출시 목적 코드
x[i] 주소
y 주소
ADDR1
ADDR2
LDIND ADDR2
MULT @4
STIND ADDR1
11
10.2 매개변수 평가와 전달기법
• 값 호출(call by value)
– 형식 매개 변수의 지역 변수화
– 실 매개 변수 값을 대응 지역 변수로 복사
– 특징 - 실 매개 변수 값 불변
call p (a, b)
procedure p (x, y)
a
x
b
y
• 기법 적용
– caller는 실 매개 변수 주소(또는 값) 전달
– callee는 r-value를 형식 매개 변수의 기억 장소에 복사
– 이후 다른 지역 변수와 동일하게 취급
12
10.2 매개변수 평가와 전달기법
• 값 호출 기법의 예제
procedure p(a, b)
begin a
b*4
{call by value}
end
목적 코드
LDIND
STORE
LDIND
STORE
ADDR1
a
ADDR2
b
LOAF b
MULT @4
STORE a
실매개 변수값을 지역 변수인
형식 매개 변수에 복사
몸체부에 대한 코드
13
10.2 매개변수 평가와 전달기법
• 결과 호출 기법 (call by result)
– 피호출자가 반환 직전에 형식 매개 변수의 값을 대응되는
실 매개 변수에 복사 후 반환
– 형식 매개 변수 - 지역 변수 취급
– 형식 매개 변수의 초기 값 미정의(callee에서 정의)
• 값-결과 호출 기법 (call by value-result)
– 값 호출 기법과 결과 호출 기법을 함께 사용한 방법
– 기법 적용
callee 실행 시작 - 값 호출 기법 적용
callee 실행 끝 - 결과 호출 기법 적용
14
10.2 매개변수 평가와 전달기법
• 표 10.1 매개 변수 전달 기법에 따른 프로그램 예
procedure PRINT
integer y
procedure INCR(x)
integer x
begin
y
1
x
x+2
end
begin
y
0
INCR(y)
write y
end
• 프로그램 실행 후 인쇄 값 (y)
call by reference 적용 : 3
call by value-result 적용 : 2
15
10.2 매개변수 평가와 전달기법
• 이름 호출 기법 (Call by name)
– 형식 매개 변수의 이름이 사용될 때마다 그에 대응되는 실 매개 변수
자체가 사용된 것으로 간주 (필요한 r-value 또는 l-value를 매번 계산)
– 기법 적용
• caller - 실 매개 변수의 r-value와 l-value 계산 routine (THUNK ) 작성
• callee – 필요시 THUNK를 이용하여 필요한 값( r-value, l-value) 계산
– 단점
• 구현 난해
• 프로그램 판독성 난해
16
10.2 매개변수 평가와 전달기법
• 이름 전달 기법 예제
procedure EXCHG(X, Y)
integer TEMP
begin
TEMP
X
X
Y
Y
TEMP
end
call EXCHG(J, N(J)) 의 해석
Integer TEMP
begin
TEMP
J
J
N(J)
N(J)
TEMP
end
호출 시 J의 값 J0로 가정
참조 호출 : J0
N(J0 )
이름 호출 : J
N(J0)
N(N(J0 ))
J0
17
10.2 매개변수 평가와 전달기법
•
예제 10.2
매개변수의 전달에 아래
기법이 각각 사용되었다고
가정할 때, 출력되는 값을
구하여라.
P : PROCEDURE ;
DECLARE A(3), I ; /* A는 세 개의 원소를 갖는 배열 */
I=1;
/* =은 배정 연산자 */
A(1) = 2 ;
1. Call by value
2. Call by name
3. Call by reference
A(2) = 4 ;
/* A(I)가 실 매개 변수 */
CALL Q( A(I) ) ;
Q : PROCEDURE( B );/* 형식 매개 변수 B는 */
/* 실매개변수 A(I)에 대응됨
A(I) = 3 ;
/* 식별자 A와 I는 /*
I=2;
/* 프로시져 P에서 상속 */
PUT LIST(B) ;
/* B의 값을 인쇄 */
END Q ;
END P ;
18
10.2 매개변수 평가와 전달기법
•
예제 10.3
매개변수의 전달이 아래
기법이 각각 사용되었다고
가정할 때, 출력되는 값을
구하여라.
P : PROCEDURE ;
DECLARE A ;
A= 1;
CALL Q(A) ;
1. Call by reference
2. Call by value
3. Call by name
Q : PROCEDURE(B) ;
DECLARE A,B ;
A=2;
PUT LIST(B) ;
END Q ;
END P ;
19
10.2 매개변수 평가와 전달기법
•
예제
10.4
다음 Algol 형태의 프로그램에서 매개
변수 전달 방법이 아래 (a), (b), (c),
(d) 및 (e) 기법으로 사용되었을
경우,프로그램이 실행된 후의 v[3]과
v[4]의 최종값을 구하여라.
(단, 미확정될 수도 있음)
(a) call by value
(b) call by reference
(c) call by result
(d) call by value result
(e) call by name
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
20
10.3 형식 매개 변수 명세
•
실 매개 변수와 형식 매개 변수의 정적 형 검사
•
형식 매개 변수 명세
형식 매개 변수 명세표 요구
- 자료형, 전달 기법, 초기값, 대응 관계 등
•
각종 언어의 형식매개 변수 명세
Pascal : 자료형, 전달 기법
( 값 전달 기본, var 선언 - 참조 전달, 값-결과 전달)
Algol 60 : 전달 기법(이름전달 기본, value 선언 - 값 전달)
Ada : 전달 기법 - 예약어 in(값 전달), out(결과 전달), in out (값-결과 전달)
in - 지역 상수 취급 (지역 변수 취급 안함)
형식 매개 변수 자료형 선언
형식 매개 변수의 디폴트(초기) 값 선언 가능 (지역 상수인 in mode도 가능)
Ada 함수는 투명성을 위해 in 모드만 가능
21
10.4 부작용과 이명
• 프로그래밍 언어의 유해한 특징
– GOTO 문
– 포인터 사용 : 이명 발생 유도
– 부수효과 (side effect)
– 이명(aliasing)
22
10.4 부작용과 이명
• 부수 효과(side effect)
– 단위 프로그램간의 의사 소통 방법
• 비지역 변수 접근
• 부수효과 이용
– 참조 전달기법, 이름 전달기법
• 실 매개 변수 값 변화(부수효과)
• 예기치 못한 결과 발생(심각한 오류 발생)
– 단점
• 프로그램 판독성 저하
• 심각한 오류 발생
• 함수의 투명성 상실
23
10.4 부수 효과와 이명
• 이 명(aliasing)
– 동일한 기억 장소를 함께 사용하고 있는 다른 이름
– 한 변수 값 변화
동일장소 사용하는 다른 변수의 값 변화
이명의 효과(aliasing effect)
– 초기 언어 : 효율적 기억 장소 사용을 위해 이명 허용
예) Fortran의 EQUIVALENCE, Cobol의 REDEFINES, C의 union 등
* x, y가 서로 이명 관계
call
그림 10.3 이명
그림 10.4 포인터 변수와 일반 변수와의 이명
p(a,a)
procedure p(x,y) ;
x := x + 1 ;
y := x + y ;
end p
프로시저 호출에서 발생되는 이명 예(참조호출)
24
10.5 연산자 중복 정의
• 중복 정의(overloading)
– 한 개체(식별자, 함수 이름, 연산자)가 두 가지 이상의 개념 갖음
참조) 영역 구멍(hole in scope) 개념과 대조
– 사용 이유
• 자연스러운 원래의 일반적인 표기 사용을 지원
• 동일한 이름이나 연산자를 중복 사용하여 하나의 프로그램으로 합쳐도
혼동되지 않음 (문맥에 의한 구별)
– 중복정의 사용시 구별법
• 의미 확정을 문맥에서 알 수 있으면 컴파일러가 수행
• 문맥으로 구별이 될 수 없는 경우
사용자가 제약 사항을 명시(자격 부여)
– 사용자 중복 정의 제공(최근 언어)
25
10.5 연산자 중복 정의
• Ada사용 예) “*” 연산자를 행렬 곱셈에 중복 정의 (사용자 정의)
function "*"(X, Y : MATRIX) return MATRIX ;
– 이항 연산자(binary operator)“*”를 행렬 곱셈 연산자로 정의
– 자료형 MATRIX는 별도 선언
– MATRIX 형 검사 – A :=
B
B, C가
*
Ada 시스템에서 수행
C ;
MATRIX 형 - 위 함수 정의대로 수행
B, C가 integer 형 - 정수 곱셈
B, C가 real 형 - 실수 곱셈
문맥으로 검사
26
10.5 연산자 중복 정의
• 중복 정의 연산자를 결정하기 위한 방법
– 자료형 정보를 파스 트리의 각 노드에 붙인 것을 가정
(동적 또는 정적으로 결정)
– 트리의 단 노드들의 자료형 확정
COMPLEX C
INTEGER
I
REAL
R
.
.
C=2*I+R
간 노드의 자료형 결정
= (complex)
C
(complex)
+ (real)
* (integer) R (real)
I
2
(integer) (integer)
27
10.5 연산자 중복 정의
•
표 10.2 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
28
10.6 포괄 기능 (Generic Functions)
• 포괄 프로시저 (generic procedure)
하나 이상의 요소를 매개변수로 받아들여 실 프로시저를
생성할 수 있는 프로시저 틀(procedure templates)
– 컴파일 시간에 실 매개 변수가 대체되어 실 프로시저를 발생
– 코딩의 오류 감소
– 프로그램의 길이 축소
– 추상화 개념 제공
– ELI, Simula, CLU (자료형에 따른 프로시저들 생성)
29
10.6 포괄 기능 (Generic Functions)
• Ada의 부프로그램이나 패키지에서 사용되는 포괄 설비
– 매크로(macro)의 확장된 개념
– 프로그램 생성 틀 (자체가 호출될 수 없음)
– 실 프로시저 : 번역시 정적 생성 (instantiation)
30
10.6 포괄 기능 (Generic Functions)
• 표 10.3 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) ;
31
10.6 포괄 기능 (Generic Functions)
•
포괄 프로시저 SWAP에 중복 표현을 함께 사용
procedure EXCHG is new SWAP(INTERGER) ;
procedure EXCHG is new SWAP(FLOAT) ;
procedure EXCHG is new SWAP(BOOLEAN) ;
procedure EXCHG is new SWAP(CHARACTER) ;
EXCHG (A, B) 의 해석
• A, B의 자료형에 따라
정수형, 문자형, 실수형, 부울형 SWAP
프로시저 결정
•
포괄 기능 제공 설계 고려 사항
• 포괄기능
사용 가능 연산은 ?
• Ada - procedure, function, package
32
10.7 코루틴 (Coroutines)
• 코루틴
– 호출된 프로그램의 수행이 완전히 끝나기 전에 타 프로시저
(호출 프로시저 포함)로 제어를 넘겼다가 재개(resume)할 수
있는 프로시저
A
B
Resume B
Resume A
Resume B
Resume A
Resume B
33
10.7 코루틴 (Coroutines)
• 특징
– 코루틴은 제어를 넘겨 받으면 프로시저의 일부만 실행
– 제어의 반환은 실행 일시 정지
– 후에 제어를 받으면 정지된 위치에서 실행 재개(resume)
– 프로시저들간의 관계가 주종 관계가 아님
• coroutine A에서 resume B 문장 실행 시 수행 작업
(1) A의 resume 문장 다음 위치를 A의 제어 장소에 기억
(2) coroutine B의 실행 위치를 알기 위하여 B의 제어 장소의 값 참조
(3) B의 제어 장소의 참조된 값으로 제어 분기
•
코루틴은 이산 체계 시뮬레이션 언어의 범주에서 취급
• 경우에 따라 자연스러운 알고리즘 제공
•
기존 언어에서 시뮬레이션으로 간단히 해결
슬라이드 쇼가 끝났습니다.
34
35
용 어 정리
36
부프로그램 (subprogram)
용어 국제 표준 규격 15.06.03
subprogram
부프로그램
A module that has an identifier and that is invoked into the control flow from another
program or by another module by means of a specific language construct and from
which the control flow returns to the invoking program or module
식별자를 가지고 있고 특정 언어 구성자를 이용하여 다른 모듈에 의해서 호출되거나,
다른 프로그램에서의 제어 흐름(control flow)속으로 호출되는 모듈로서 그
모듈에서부터 제어 흐름은 호출한 프로그램이나 모듈로 변환된다.
37
매개 변수 (parameter)
용어 국제 표준 규격 15.03.13
parameter (in programming language) 매개 변수 (프로그래밍 언어에서)
A language construct for passing data objects or data values between modules.
모듈 간에 자료 객체나 자료값을 넘겨주기 위한 언어 구성자
38
매개 변수 결합 (parameter association)
용어 국제 표준 규격 15.03.16
parameter association
매개 변수 결합
The association between formal parameters and their corresponding actual parameters
in a call or generic instantiation.
호출 또는 포괄 인스턴스화 (generic instantiation) 할 때 형식 매개 변수와 그에
대응되는 실매개 변수 간의 결합
39
위치 매개 변수 결합 (positional parameter association)
용어 국제 표준 규격 15.06.19
positional parameter association
위치 매개 변수 결합
In a subprogram call, the correspondence of an actual parameter with a formal
parameter in the same position in the declaration of the subprogram.
<Note> Contrast with named parameter association.
부프로그램 호출에서, 부프로그램의 선언에서 주어진 위치에 따라 형식 매개 변수와
실매개 변수를 대응시키는 방법
<주> 이름 매개 변수 결합과 대조를 이룸
40
이름 매개 변수 결합 (named parameter association)
용어 국제 표준 규격 15.06.18
named parameter association
assignment by name
이름 매개 변수 결합
In a subprogram call, the explicit naming of the formal parameters corresponding to
actual parameters to establish parameter association.
<Note> 1. In named parameter association, actual parameters can be given in any
order.
2. Contrast with positional parameter association.
부프로그램 호출에서, 매개 변수 결합을 이루기 위해 실매개 변수에 대응하는 형식
매개 변수의 명시적인 이름을 부여하는 방법
<주> 1. 이름 매개 변수 결합에서 실매개 변수는 어떤 순서로나 주어질 수 있다.
2. 위치 매개 변수와 대조를 이룸
41
함수 (function)
용어 국제 표준 규격 15.06.12
function
(in programming language)
함수
(프로그래밍 언어에서)
A subprogram, usually with formal parameter, that produces a data value which it
returns to the place of the invocation.
<Note> A function may also produce other changes through the use of parameters.
불려진 곳으로 반환되어지는 자료값을 생성하는 부프로그램, 통상 형식매개변수를
가진다.
<주> 함수는 또한 매개변수의 사용을 통해 다른 변화를 생성할 수도 있다.
42
실매개 변수 (actual parameter)
용어 국제 표준 규격 15.03.14
actual parameter
actual argument
실매개 변수
A parameter, such as an expression, * identifier, or other language construct, used in a
call or generic instantiation for association of a data object with a corresponding
declaration.
<Note> The corresponding declaration is called formal parameter.
식, 식별자 또는 이외의 언어 구성자들로서 된 매개 변수인데 호출 또는 포괄
인스턴스화 될 때, 이들 자료 객체와 대응된 선언과의 결합을 위하여 사용된다.
<주> 대응된 선언을 형식 매개 변수라 부른다.
43
형식 매개 변수 (formal parameter)
용어 국제 표준 규격 15.03.15
formal parameter
dummy argument
형식 매개 변수
A parameter, define in the declaration of certain modules, that is associated with an
actual parameter in a call or generic instantiation.
어떤 모듈에서 선언하여 정의된 매개 변수인데, 호출 또는 포괄 인스턴스화 될 때
실매개 변수와 결합된다.
44
참조 호출 기법(call by reference, address, location)
용어 국제 표준 규격 15.06.08
call by reference
call by address
call by location
참조호출
주소호출
위치호출
A call in which the calling * module provides to the called module the addresses of the
parameters to be passed.
<Note> In a call by reference, the called module has the ability to change the values of
the parameters stored by the calling module.
호출 모듈이 넘겨질 매개 변수의 주소를 호출된 모듈에 제공하는 호출
<주> 참조 호출에서는, 호출된 모듈이 호출 모듈이 저장한 매개 변수의 값을 바꿀 수
있는 능력을 가지고 있다.
45
값 호출 (call by value)
용어 국제 표준 규격 15.06.09
call by value
값 호출
A call in which calling * module provides to the called module the actual values of the
parameters to be passed.
<Note> In a call by value, the called module cannot change the values of the
parameters stored by or for the calling module.
호출 모듈이 넘겨질 매개 변수의 실제값을 호출된 모듈에 제공하는 호출
<주> 값 호출에서는, 호출 모듈이 저장하거나 호출 모듈이 사용하도록 저장된 실매개
변수의 값을 호출된 모듈이 바꿀 수 없다.
46
부작용 (side effect)
용어 국제 표준 규격 15.08.03
side effect
부수효과,
부작용
Any indirect consequence caused by the execution of an expression, statement, or
subprogram.
<Note> Side effect may be intended, for example, to change the data value of a
parameter passed by a function.
식, 문장, 부프로그램의 실행에 의해 야기되는 어떤 간접적인 결과
<주> 예를 들어 함수에 의해 전달된 매개 변수와 자료값을 바꾸는 것과 같이
의도적으로 부작용을 사용할 수 있다.
47
이 명 (aliasing)
용어 국제 표준 규격 15.03.19
alias
An alternate identifier for a language construct.
언어 구성자에 대한 대체 식별자
이명
48
중복 정의 (overloading)
용어 국제 표준 규격 15.01.08
to overload
중복 정의하다
과적하다.
To assign more than one meaning to a lexical token.
<Example> The lexical token “+” can mean integer addition, real addition, set union,
concatenation, etc.
하나의 어휘 토큰에 두 개 이상의 의미를 할당하다.
<예> 어휘 토큰 “+”에 정수의 덧셈, 실수의 덧셈, 결합, 집합, 문자열 연결 등을 의미할
수 있다.
49
포괄적인 (generic)
용어 국제 표준 규격 15.06.28
generic
포괄적인
Pertaining to a language construct that serves as a template for creating an actual
language construct for applicable data types in compliance with the rules of strong
typing.
언어 구성자의 속성으로 강자료형의 규칙에 따라서 적용 가능한 자료형을 위한 실언어
구성자를 생성하기 위한 틀로 제공한다.
50
코루틴 (coroutines)
용어 국제 표준 규격 15.06.04
coroutine
포괄적인
A subprogram that, when called again after an execution, resumes at the location to
which its previous execution returned.
어떤 실행 후에 다시 호출되었을 때, 이전의 실행이 반환된 위치에서 실행을 제거하는
부프로그램