Computer Science/프로그래밍 언어론

프로그래밍언어론 - 부프로그램

Beomsu Koh 2023. 5. 30.

프로그래밍언어론 - 부프로그램

부프로그램이란, 프로그램에서 호출에 의해 실행되도록 만들어진 일련의 코드를 의미한다

부프로그램의 정의와 호출

부프로그램은 실행 할 내용을 기술한 일련의 코드로 머리부와 본체로 구성 되었다
부 프로그램은 코드 흐름 상, 순차적으로 실행 되던 중 함수, 프로시져 등 프로그램 흐름을 변경해서 기능하는 것들을 일컫는 것이라 이해했다

부프로그램의 머리 부분은 예약어, 부프로그램의 이름, 매개변수들의 이름과 타입, 반환 값의 타입 등을 기술한다

부프로그램의 정의 방법

부프로그램 선언

  • 부프로그램이 정의되어 있다는 것을 컴파일러에게 알리는 역할
  • 부프로그램의 머리부는 제공하지만, 부프로그램 몸체를 포함하진 않음
void sub(int, int);

부 프로그램 호출

  • FORTRAN에서 SUB 부프로그램을 호출하는 예
CALL SUB(I, J)
  • Pascal과 C에서 sub1 부프로그램을 호출하는 예
sub(i,j)

호출 프로그램에서 부프로그램에게 어떤 정보(인자)를 전달

  • 실 매개 변수 : 호출 문장의 매개변수 i 와 j
  • 형식 매개 변수 : 부 프로그램의 정의 머리부의 매개변수 x와 y

위치 매개변수 방법

  • 위치에 따라 형식 매개변수와 실 매개 변수를 대응하는 방법

키워드 매개 변수 방법

  • 호출 문장에서 실 매개변수와 대응되는 형식 매개 변수의 이름을 지정할 수 있는 방법
    procedure sub(koreanScore, mathScore, engScore: integer) is 
    begin
    ⋮
    end sub;
    
  • 호출 문자
    sub(i=>mathScore, j=>engScore, k=>koreanScore);
    

Ada는 위치 매개변수 방법과 키워드 매개변수 방법을 혼합해서 사용 된다

  • 위치 매개변수 방법을 적용한 i는 koreanScore와 대응되고,
  • 키워드 매개변수 방법을 적용한 j는 engScore와, 그리고 k는 mathScore와 대응
sub(i, j=>engScore, k=>mathScore);

Default 매개 변수

Ada의 디폴트 매개 변수를 알아보자

with Ada.Text_IO;
use Ada.Text_IO;

procedure Default is
   package Int_IO is new Ada.Text_IO.Integer_IO (Integer);
   use Int_IO;

   i, k : Integer;
   
   procedure Sub(KoreanScore: Integer; MathScore: Integer := 60; EngScore: Integer) is
   begin
      Put("Korean: ");
      Put(KoreanScore);
      New_Line;
      
      Put("Mathematics: ");
      Put(MathScore);
      New_Line;
      
      Put("English: ");
      Put(EngScore);
   end Sub;
   
begin
   i := 80;
   k := 70;
   
   Sub(i, engScore => k);
end Default;

제공된 Ada 코드에서 Sub 절차에는 MathScore: Integer := 60이라는 기본 매개변수가 있습니다.
즉, Sub 프로시저를 호출할 때 호출자가 MathScore 매개변수에 대한 값을 제공하지 않으면 자동으로 기본값인 60이 할당됩니다.

예를 들어 코드 스니펫 Sub(i, engScore => k)에서 MathScore 인수는 명시적으로 제공되지 않습니다.
결과적으로 ‘Sub’ 프로시저를 실행할 때 ‘MathScore’ 매개변수에 기본값인 60이 사용됩니다.

C++도 비슷한 느낌으로 매개변수를 사용한다

#include <iostream>
using std::cout;
using std::endl;

void sub(int koreanScore, int mathScore, int engScore = 60) {
    cout << "korean: " << koreanScore << endl;
    cout << "mathematics: " << mathScore << endl;
    cout << "english: " << engScore << endl;
}

int main(void) {
    sub(80, 70, 90);
    sub(70, 50);
    return 0;
}

부프로그램의 종류

  • 프로시저 : 값을 반환하지는 않고 부작용을 만듦
  • 함수 : 값을 반환하고 부작용은 없음
    하지만, 프로시저와 함수를 별도로 구분하지 않기도 한다

FOTRAN

SUBROUTINE CopySub(A, B, N)
    INTEGER A(N), B(N)
    DO 10 I = 1, N
        A(I) = B(I)
10  CONTINUE
    RETURN
END

위의 포트란 프로시저는 CALL COPYSUB(K,L,I)와 같다

INTEGER FUNCTION ADD(A, B)
	ADD = A + B 
	RETURN 
END

위의 포트란 함수는 I = ADD(K,L)과 같이 사용한다

Ada

procedure incre(x, y: in out integer) is 
begin 
	x := x + 1; 
	y := y + 1; 
end incre;

위는 Ada의 프로시저이다.

function 함수이름(매개변수) return 
반환값타입 is 
begin 
	return 반환값; 
end 함수이름;

위는 Ada의 함수이다.

C

C언어의 경우 값을 반환 할 때 함수 이름 왼쪽에 반환하는 값의 타입을 쓴다

int add(int x, int y) 
{ 
	return x+y; 
}
  • 값을 반환하지 않으려면, void 사용

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

댓글