서브프로그램 개념
서브프로그램이란?
- 프로그램
- 컴퓨터가 실행할 명령어를 나열한 것
- 이 명령어 나열은 입력을 출력으로 전환함
- 서브프로그램
- 독자적인 입력과 출력을 갖춘 일부 프로그램
- 역시 명령어 나열로 구성되어 있음
- 서브프로그램의 입력: 인수
- 서브프로그램의 출력: 반환값
- 반환값이 없는 서브프로그램도 존재: 서브루틴 혹은 프로시저
- 서브프로그램의 특징
- 서브 프로그램으로 들어오는 입구는 하나이고, 나가는 출구는 여러 곳이 될 수 있음
- 대개 서브 프로그램의 맨 끝은 자동적으로 출구가 됨
- 변도의 return 문을 통해 출구를 지정할 수도 있음
- 호출자(caller, 서브프로그램을 호출한 서브프로그램)는 피호출자(callee, 호출된 서브프로그램)가 수행되기 전에 수행이 정지되며, 피호출짜의 수행이 완료되면 호출자로 제어 흐름이 복귀되며 호출자의 수행이 재개됨
서브프로그램의 분류
- 서브루틴
- 매번 똑같이 실행해야 하는 명령어 묶음
- 초창기 서브프로그램 형태
- 인수 전달, 반환값 전달 등의 데이터 흐름이 명확하게 드러나지 않는 경우가 많음
- 프로시저
- 일정하게 수행해야 하는 단계에 이름을 붙인 것
- 반환 값이 없는 서브프로그램
- 함수
- 주어진 인수로부터 값을 계산해내는 장치
- 반환값이 있는 서브프로그램
- 순수 함수는 부대효과가 없어야 함
서브프로그램 관련 용어
- 서브프로그램 정의: 서브프로그램의 작동을 기술한 부분
- 서브프로그램 호출(call): 서브프로그램이 수행될 것을 요구하는 부분
- 서브프로그램 헤더: 서브프로그램의 이름, 종류, 매개변수 선언 등을 포함하는 부분
- 서브프로그램 본체: 서브프로그램이 호출되었을 때 실행되는 부분
- 매개변수 프로파일(signature): 서브프로그램의 매개변수의 개수, 순서, 타입
- 서브프로그램의 프로토콜: 매개변수 프로파일 + 반환 타입(함수의 경우)
- 서브프로그램의 선언과 정의의 차이
- 선언: 프로토콜만을 명시
- 정의: 헤더와 본체를 모두 명시
- 형식인수와 실인수
- 형식인수(formal parameter, 형식매개변수): 서브프로그램 헤더에 선언된 형식적 변수
- 실인수(actual parameter, 실매개변수): 서브프로그램 호출 시 전달되는 실제 값 또는 주소
- 서브프로그램 호출 시, 실인수가 형식인수로 전달됨
- 실인수와 형식인수의 대응
- 위치에 의한 대응: 가장 일반적
- 키워드에 의한 대응: 순서가 중요하지 않지만, 형식인수 이름을 기억해야 함
- 위치에 의한 대응과 키워드에 의한 대응 병용
- 인수전달 고려 사항
- 형식인수 기본값/기본 인수
- 가변인수 서브프로그램(함수): 받을 수 있는 인수 개수가 여러 개가 될 수 있는 서브프로그램
매개변수와 인수 전달
인수 전달 모델
- 의미적 모델
- 입력 모드(in mode): 실인수가 형식인수로 전달
- 출력 모드(out mode): 형식인수 값이 실인수로 전달
- 입출력 모드(in-out mode): 양방향 전달이 모두 일어남
- 개념적 모델
- 값 전달: 실인수의 값을 물리적으로 복사하여 전달
- 참조 전달: 실인수의 값을 참조할 수 있는 참조 경로를 전달
- 인수 전달 구현 모델
- 구현 모델: 값 전달, 결과 전달, 값-결과 전달, 참조 전달, 이름 전달
- 인수 전달 구현
- 어떤 프로그래밍 언어가 모든 인수 전달 방법을 제공하는 것은 아님
- 인수 전달 구현 방법은 언어마다 다름
- 언어에 따라 한 두개의 전달 방법을 채택하고 있음
값 전달
- 값에 의한 호출이라고도 함
- 입력 모드의 인수 전달을 구현
- 물리적으로 값을 전달
- 일반적인 값 전달 구현 방법
- 더 많은 공간을 요구할 수 있음
- 값 복사에 따른 시간 부담이 있음
- 참조 경로를 전달
- 호출된 서브프로그램에서 쓰기 금지시켜야 함
- 간접 참조로 인한 시간 부담이 따름
결과 전달
- 지역변수(형식인수)의 값이 호출자로 전달
- 출력 모드의 인수 전달을 구현
- 물리적으로 값을 전달
- 값 복사에 따른 시간 무담이 있음
- 복사 순서에 따라 결과가 달라질 수 있음
- 실인수의 주소 결정 시간: 호출 시, 반환 시 둘 중 하나이나 대개 호출 시에 결정됨
- 참조 경로 전달: 실인수의 초깃값을 사용하지 못하도록 해야 함
값-결과 전달
- 호출 시 값을 복사(실인수→형식인수)하고, 복귀 시 다시 값을 복사(형식인수→실인수)
- 입출력 모드의 인수 전달을 구현
- 복사에 의한 전달이라고 함
- 두 번 모두 물리적으로 값을 복사하여 구현
- 별칭 문제가 발생하지 않지만, 값 전달의 단점과 결과 전달의 단점이 모두 포함됨
참조 전달
- 참조 경로(주소)를 전달
- 공유에 의한 전달이라고도 함
- 입출력 모드의 인수 전달을 구현
- 전달 과정 자체가 효율적이지만, 별도의 간접 참조 시간이 필요하고, 별칭 문제가 발생할 수 있음
- 별칭
- 같은 변수에 대한 다른 이름
- 별칭 문제 발생 원인: 실인수 충돌, 배열 원소 충돌, 형식인수와 전역변수 충돌
이름 전달
- 특정 모델에 대응하지 않음
- 글자 그대로 치환하는 의미
- 참조 방법을 형식인수에 대응시킨 후, 형식인수 사용 시 이 참조 방법대로 값을 구함
- 인수의 의미: 실인수의 종류에 따라 달라짐
- 값 변수: 참조 전달과 동등함
- 상수 식: 값 전달과 동등함
- 배열 등이 포함된 복잡한 식: 대응되는 다른 인수 전달 방법이 없음
- 이름 전달의 난해함
- 장점
- 늦은 바인딩의 유연함
- 이로 인해 젠슨의 기법과 같은 범용 서브프로그램을 만들 수 있음
- 단점
- 인수 참조가 매우 비효율적
- 너무 난해하여 이해하기 어려움
서브프로그램 관련 주제
범용 서브프로그램
- 여러 용도로 사용할 수 있는 서브프로그램
- 여러 타입의 인수에 대해 적용 가능한 서브프로그램
- 범용 서브프로그램 관련 주제
- 인수 타입 검사 문제: 매크로나 void* 타입의 경우에는 타입 검사를 수행할 수 없다는 단점이 있음
- 매개변수적 다형성 및 서브타입 다형성을 이용하면 인수 타입 검사를 수행할 수 있음
- Jensen의 기법: 이름 전달 매개변수를 이용한 범용 서브루틴
분리 컴파일과 독립 컴파일
- 분리 컴파일: 인터페이스 정보를 이용하며, 프로그램의 일부를 다른 부분과 분리하여 컴파일하는 방법
- 독립 컴파일: 인터페이스 정보 없이, 프로그램의 일부를 다른 부분과 분리하여 컴파일하는 방법
'CS' 카테고리의 다른 글
[프로그래밍 언어론] 객체지향과 다형성 (2) | 2023.12.05 |
---|---|
[프로그래밍 언어론] 서브프로그램 구현 (2) | 2023.12.05 |
[프로그래밍 언어론] 문장 (1) | 2023.12.05 |
[프로그래밍 언어론] 수식 (1) | 2023.12.05 |
[컴퓨터과학개론] 컴퓨터 네트워크 (1) | 2023.12.05 |