24강 Subprogram
Subprogram의 종류
-function
-procedure
-method
-subroutines
(4개 모두 유사하지만 같다고 하기는 좀 그렇다.)
*subprogram을 만드는 이유
코드를 짜다보면 똑같이 반복되는 문장 뭉텅이들이 있다,
이 뭉텅이를 하나의 subprogram으로 만들어주면
다시 사용할 때 하나의 문장으로 대신 할 수 있음.
장점 ->
코드길이를 줄여서 메모리 공간 줄이고, 코딩시간도 줄임
추상화를 통해 간단하게 이해 가능(복잡함을 숨길 수 있다)
----------------------------------------------------------------
*subprogram의 특징
각각의 subprogram은 일반적으로 entry point를 가진다. //
근데 또 항상 그런건 아님 동시에 진행 되기도 하나봄? , co-routine
-------------------------------------------------------------
*subprogram(sp)의 definitions
// 프로그램 언어마다 다르지만 대체로 유사함. C언어를 기준으로 하겠다.
subprogram header - int sum(int a, int b, float c) 요런거
parameter profile(=signature) -> sp의 파라미터와 관련된 정보 요약정도라고 생각하면 됨
//놓칠만한 것은 parameter의 순서도 기억한다는 것.
C++의 경우 오버로딩한 함수가 있으면 이 함수를 호출할때 이 signature에 기반해 호출할 함수를 결정함.
function declaration
static type checking runtime전에 type 체크함. 함수에 사용한 인수가 적절한지 검사
actual parameter(ap)와 formal parameter(fp)
ap는 argument라고도 함
단순히 parameter라고 하면 fp임
ap의 값이 fp의 값이 되는 binding이 일어남(associate),
binding 방법 2가지
1.positional parameter(c언어)
-1번째 argu가 1번째 para에 binding 되고 ,같은 방식으로 차례대로
2.keyword parameter(파이썬)
-호출할 때 순서랑 상관없이 keyword에 값자체를 넣어서 넘김
실은 파이썬, ada, Fortran 95+ 의 경우에는 positional과 keyword방식 둘다 지원한다.
그리고 섞어서 사용할 수도 있다.
하지만, keyword 방식을 쓰기 시작하면 그 뒤는 모두 keyword 방식을 사용해야한다.
논리적으로 생각해보면 당연함. keyword라는게 쓰이기 시작하는 순간부터 순서가 뒤섞이니까
파이썬의 경우
subprogram 호출할 때 , argument를 꽉 채우지 않고 비워도 되는 경우가 있음
//애초에 def할때 fp에 default 값을 넣어둘수 있다.
C++의 경우
C++도 위에 파이썬처럼 default 설정 가능하지만 default 값을 넣을 fp는 뒤에 위치해야함.
positional 방식을 쓰므로 중간에 default를 넣어버리면 순서가 뒤엉켜버리므로.
실제로 실행 될때는
header : sum(a, b=1, c)
call : sum(5,3)
a=5, b=3 이 되고 c는 값이 없어 error가 발생
C언어에서 24.2.7을 실행하면
옳지 않지만 실행이 되고
출력은 다음과 같다
5
5
즉 파라미터의 수를 검사하지 않는다.
Procedure VS Function
각각은 implemented subprogram이지만 그 개념은 조금 차이가 있다.
procedure은 값을 반환하지 않는다.
side effect(부작용)이 있다. 값을 반환하지 않기 때문에
해당 프로시져에서 어떤 변수값을 바꾸려고 시도한다고 해도 전달이 안됨. (물론 포인터 사용하면 전달 가능)
(프로시져에서 사용한 변수는 프로시져 종료시에 사라지니까)
function도 사실 같은 부작용이 있는데 값을 반환함으로써 해당 문제를 해결할 수 있다고 생각하고
이상적으로는 부작용이 없다고 생각한다.
언어들은 둘의 구분을 명확하게 하지 않는다 // 애초에 정의도 구분이 모호한데가 있음
Fortran의 경우는 명확하게 구분하는 편 : function은 function으로 procedure는 subroutine으로 표현한다.
subroutine은 expression처럼 활용되지 않는다. 즉, 어떤 변수에 값을 할당해줄 수 없음. 독립적으로 혼자 사용됨.
'Concepts of Programming Languages' 카테고리의 다른 글
4장 Lexical and Syntax Analysis 3(lecture 11)_Top-down parse (0) | 2018.05.06 |
---|---|
4장 Lexical and Syntax Analysis 2(lecture 10) (0) | 2018.05.06 |
4장 Lexical and Syntax Analysis 1(lecture 9) (0) | 2018.05.05 |