CS

[프로그래밍 언어론] 서브프로그램 개요

Grace 2023. 12. 5. 20:52

서브프로그램 개념

서브프로그램이란?

  • 프로그램
    • 컴퓨터가 실행할 명령어를 나열한 것
    • 이 명령어 나열은 입력을 출력으로 전환함
  • 서브프로그램
    • 독자적인 입력과 출력을 갖춘 일부 프로그램
    • 역시 명령어 나열로 구성되어 있음
    • 서브프로그램의 입력: 인수
    • 서브프로그램의 출력: 반환값
    • 반환값이 없는 서브프로그램도 존재: 서브루틴 혹은 프로시저
  • 서브프로그램의 특징
    • 서브 프로그램으로 들어오는 입구는 하나이고, 나가는 출구는 여러 곳이 될 수 있음
    • 대개 서브 프로그램의 맨 끝은 자동적으로 출구가 됨
    • 변도의 return 문을 통해 출구를 지정할 수도 있음
    • 호출자(caller, 서브프로그램을 호출한 서브프로그램)는 피호출자(callee, 호출된 서브프로그램)가 수행되기 전에 수행이 정지되며, 피호출짜의 수행이 완료되면 호출자로 제어 흐름이 복귀되며 호출자의 수행이 재개됨

서브프로그램의 분류

  • 서브루틴
    • 매번 똑같이 실행해야 하는 명령어 묶음
    • 초창기 서브프로그램 형태
    • 인수 전달, 반환값 전달 등의 데이터 흐름이 명확하게 드러나지 않는 경우가 많음
  • 프로시저
    • 일정하게 수행해야 하는 단계에 이름을 붙인 것
    • 반환 값이 없는 서브프로그램
  • 함수
    • 주어진 인수로부터 값을 계산해내는 장치
    • 반환값이 있는 서브프로그램
    • 순수 함수는 부대효과가 없어야 함

서브프로그램 관련 용어

  • 서브프로그램 정의: 서브프로그램의 작동을 기술한 부분
  • 서브프로그램 호출(call): 서브프로그램이 수행될 것을 요구하는 부분
  • 서브프로그램 헤더: 서브프로그램의 이름, 종류, 매개변수 선언 등을 포함하는 부분
  • 서브프로그램 본체: 서브프로그램이 호출되었을 때 실행되는 부분
  • 매개변수 프로파일(signature): 서브프로그램의 매개변수의 개수, 순서, 타입
  • 서브프로그램의 프로토콜: 매개변수 프로파일 + 반환 타입(함수의 경우)
  • 서브프로그램의 선언과 정의의 차이
    • 선언: 프로토콜만을 명시
    • 정의: 헤더와 본체를 모두 명시
  • 형식인수와 실인수
    • 형식인수(formal parameter, 형식매개변수): 서브프로그램 헤더에 선언된 형식적 변수
    • 실인수(actual parameter, 실매개변수): 서브프로그램 호출 시 전달되는 실제 값 또는 주소
    • 서브프로그램 호출 시, 실인수가 형식인수로 전달됨
  • 실인수와 형식인수의 대응
    • 위치에 의한 대응: 가장 일반적
    • 키워드에 의한 대응: 순서가 중요하지 않지만, 형식인수 이름을 기억해야 함
    • 위치에 의한 대응과 키워드에 의한 대응 병용
  • 인수전달 고려 사항
    • 형식인수 기본값/기본 인수
    • 가변인수 서브프로그램(함수): 받을 수 있는 인수 개수가 여러 개가 될 수 있는 서브프로그램

매개변수와 인수 전달

인수 전달 모델

  • 의미적 모델
    • 입력 모드(in mode): 실인수가 형식인수로 전달
    • 출력 모드(out mode): 형식인수 값이 실인수로 전달
    • 입출력 모드(in-out mode): 양방향 전달이 모두 일어남
  • 개념적 모델
    • 값 전달: 실인수의 값을 물리적으로 복사하여 전달
    • 참조 전달: 실인수의 값을 참조할 수 있는 참조 경로를 전달
  • 인수 전달 구현 모델
    • 구현 모델: 값 전달, 결과 전달, 값-결과 전달, 참조 전달, 이름 전달
    • 인수 전달 구현
      • 어떤 프로그래밍 언어가 모든 인수 전달 방법을 제공하는 것은 아님
      • 인수 전달 구현 방법은 언어마다 다름
      • 언어에 따라 한 두개의 전달 방법을 채택하고 있음

값 전달

  • 값에 의한 호출이라고도 함
  • 입력 모드의 인수 전달을 구현
  • 물리적으로 값을 전달
    • 일반적인 값 전달 구현 방법
    • 더 많은 공간을 요구할 수 있음
    • 값 복사에 따른 시간 부담이 있음
  • 참조 경로를 전달
    • 호출된 서브프로그램에서 쓰기 금지시켜야 함
    • 간접 참조로 인한 시간 부담이 따름

결과 전달

  • 지역변수(형식인수)의 값이 호출자로 전달
  • 출력 모드의 인수 전달을 구현
  • 물리적으로 값을 전달
    • 값 복사에 따른 시간 무담이 있음
    • 복사 순서에 따라 결과가 달라질 수 있음
    • 실인수의 주소 결정 시간: 호출 시, 반환 시 둘 중 하나이나 대개 호출 시에 결정됨
  • 참조 경로 전달: 실인수의 초깃값을 사용하지 못하도록 해야 함

값-결과 전달

  • 호출 시 값을 복사(실인수→형식인수)하고, 복귀 시 다시 값을 복사(형식인수→실인수)
  • 입출력 모드의 인수 전달을 구현
  • 복사에 의한 전달이라고 함
  • 두 번 모두 물리적으로 값을 복사하여 구현
  • 별칭 문제가 발생하지 않지만, 값 전달의 단점과 결과 전달의 단점이 모두 포함됨

참조 전달

  • 참조 경로(주소)를 전달
  • 공유에 의한 전달이라고도 함
  • 입출력 모드의 인수 전달을 구현
  • 전달 과정 자체가 효율적이지만, 별도의 간접 참조 시간이 필요하고, 별칭 문제가 발생할 수 있음
  • 별칭
    • 같은 변수에 대한 다른 이름
    • 별칭 문제 발생 원인: 실인수 충돌, 배열 원소 충돌, 형식인수와 전역변수 충돌

이름 전달

  • 특정 모델에 대응하지 않음
  • 글자 그대로 치환하는 의미
  • 참조 방법을 형식인수에 대응시킨 후, 형식인수 사용 시 이 참조 방법대로 값을 구함
  • 인수의 의미: 실인수의 종류에 따라 달라짐
    • 값 변수: 참조 전달과 동등함
    • 상수 식: 값 전달과 동등함
    • 배열 등이 포함된 복잡한 식: 대응되는 다른 인수 전달 방법이 없음
  • 이름 전달의 난해함
  • 장점
    • 늦은 바인딩의 유연함
    • 이로 인해 젠슨의 기법과 같은 범용 서브프로그램을 만들 수 있음
  • 단점
    • 인수 참조가 매우 비효율적
    • 너무 난해하여 이해하기 어려움

서브프로그램 관련 주제

범용 서브프로그램

  • 여러 용도로 사용할 수 있는 서브프로그램
  • 여러 타입의 인수에 대해 적용 가능한 서브프로그램
  • 범용 서브프로그램 관련 주제
    • 인수 타입 검사 문제: 매크로나 void* 타입의 경우에는 타입 검사를 수행할 수 없다는 단점이 있음
    • 매개변수적 다형성 및 서브타입 다형성을 이용하면 인수 타입 검사를 수행할 수 있음
  • Jensen의 기법: 이름 전달 매개변수를 이용한 범용 서브루틴

분리 컴파일과 독립 컴파일

  • 분리 컴파일: 인터페이스 정보를 이용하며, 프로그램의 일부를 다른 부분과 분리하여 컴파일하는 방법
  • 독립 컴파일: 인터페이스 정보 없이, 프로그램의 일부를 다른 부분과 분리하여 컴파일하는 방법