Published on

함수, 프로시저, 서브루틴

Authors
  • avatar
    Name
    유사공대생
    Twitter

함수, 프로시저, 서브루틴

함수-function(또는 프로시저- procedure 나 서브루틴- subroutine)는 코드를 재사용(reuse)하는 주요 수단이다. 이 세 용어는 여러분이 관심을 갖는 범위 안에서는 모두 동일한 것을 의미하며, 언어에 따라 부르는 이름만 다를 뿐이다.

멋진 부분은 함수를 여러 번 작성하지 않아도 이 함수를 여러 번 호출(invoke, call)할 수 있다는 점이다. 코드가 복잡해질수록 이런 함수 호출은 엄청나게 편리해진다.

function cube(x) {
  return x * x * x
} // 함수 정의

y = cube(3)

동작 원리

함수를 호출하는 부분에서 함수를 실행하고 다시 원래 자리로 돌아올 방법이 필요하다. 원래 돌아오기 위해서는 어디서 함수로 들어갔는지를 기억해야 한다. 이 위치는 바로 프로그램 카운터의 값이다.

아래 표에는 명령어 집합을 활용해 함수를 호출하는 방법을 보여준다.

image

여기서 cube 함수를 실행한 다음 돌아와야 하는(함수에서 돌아오는 것을 반환-return이라고 함) 주소를 계산해야 한다.

반환 주소를 계산하기 위해 명령어를 몇 개 사용해야 하고, 세제곱을 계산할 숫자를 넣는 코드와 cube 함수를 호출하는 코드가 차지하는 주소도 감안해야 한다. 따라서 반환 주소는 프로그램 시작(100번지)으로부터 5개의 명령어가 지난 다음이다. 이 값을 200번지에 넣는다. 함수를 호출하면 함수가 실행되고, 함수 안에 있는 모든 코드를 실행하고 나면 200번지에 있는 값을 사용해 간접 분기를 한다. 간접 분기를 한 결과는 (200번지에 105가 들어가 있기 때문에) 105번지다.

image

이 과정은 상당히 많은 작업이 필요하다. 따라서 대부분의 기계는 이런 과정을 돕는 명령어를 제공한다.

예를 들어, ARM 프로세서에는 **링크 레지스터를 사용해 분기(BL, Branch with Link) 명령어가 있다. 이 명령어는 함수로 호출하는 명령어와 현재 명령어의 다음 위치를 저장하는 명령어를 하나로 합친 것이다.