ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서브루틴과 제어 추상화
    프로그래밍언어론 2023. 5. 22. 18:47

    추상화
    프로그래머가 프로그램 부분에 이름을 붙이는 방법과 절차.
    사용되는 곳에서 그 이름만 쓰고 구체적인 구현은 알 필요가 없다.

    제어 추상화 라고 하면 잘 정의된 영ㄴ산에 이름을 붙여 사용하는 것이 추상화의 목적인 경우이고,
    데이터 추상화는 추상화의 주요 목적이 정보를 표현하는 것이다.

    서브루틴
    호출자에 의해 수행이 시작되고 호출자는 서브루틴의 수행이 끝나기를 기다린다.
    대부분의 서브루틴은 매개변수를 가져서 호출자가 서브루틴의 행동에 영향을 미칠 목적으로 또는 연산을 수행할 데이터를
    제공하기 위하여 매개변수를 전달한다.

    값을 반환하는 서브루틴은 함수라고 불리고 그렇지 않은 서브루틴은 프로시저 라고 불린다.
    대부분의 언어세 서브루틴은 사용되기 전에 선언되어야 하지만 일부 언어에서는 선언하기 전에 호출할 수 있게 허용한다.

    매개변수와 지역변수가 차지하는 기억장소는 대부분의 언어에서 스택에 할당된다.
    어떤 시점에 SP는 스택 탑의 마지막 사용된 위치 또는 처섭ㄴ재 미사용 위치의 주소를 가진다.
    FP는 프레임 내부의 주소를 가진다.
    프레임 객체들은 프레임 포인터로부터 상대 주소로 접근된다.

    컴파일러는 어느 함수에 대해 프레임의 크기를 미리 알지 못한다.
    그 이유는 배열이 스택영역에 할당되는 C, C++. C#같은 언어에서 배열의 크기를 컴파일시간에 알 수 없는 경우가 있기 때문이다.

    호출과정

    호출과정은 호출자에 의해 서브루틴 호출의 직전과 직후에 불려지는 코드이다.
    프롤로그


    서브루틴 코드의 시작부에 수행되는 코드

    에필로그


    서브루틴 코드의 마지막 부분에 수행되는 코드   

     

    서브루틴으로 들어가면서 수행되어야 하는 작업은 매개변수 전달, 반환 주소의 저장, PC바꾸기, 프레임공간 할당 후 SP바꾸기 등등이 필요하다. 레지스터의 저장은 호출자에 의해 덮어써질 수 있는 중요한 값들을 가진 레지스터인 경우 백업되어야 한다.
    서브루틴에서 나온 후에 수행하는 작업은 반환값이나 반환 되어야 할 매개변수를 전달하고 지역 객체 중에서 최종화 코드를 수행하는 것을 실행하고 스택 프레임을 해지하고 SP를 복구한다.

    이 작업들중 불려진 때마다 달라지는 일부 작업은 호출자에 의해 수행된다.
    그러나 대부분의 작업은 호출자나 피호출자 중에 어느 곳에든 수행될 수 있지만, 일반적으로 피호출자가 가능한 많은 일을 하면 코드 크기를 줄일 수 있다.

    피호출자에 의해 수행되는 코드는 Object 프로그램에서 한번만 나타나지만, 호출자에 의해 수행되는 작업은 모든 호출지점에서 나타나야 하고 대부분의 경우 서브루틴은 한 군데 이상에 불려지기 때문이다.

    까다로운 것은 레지스터의 저장부분이다. 어떤 서브루틴은 R(이하 레지스터)를 아주 많이 써야하고 어떤 서브루틴은 한두개만 있으면 된다. 피호출자에서 써야할 레지스터는 프롤로그에서 값을 스택에 저장하고 에필로그에서 다시 복구해 주어야 한다.

     

    특수목적 R을 제외하고 일반 R은 반반 정도로 나누어서 반은 호출자의 책임이고 나머지 반은 피호출자의 책임이다.
    피호출자 입장에서 호출자 저장집합에 속하는 R은 얼마든지 덮어써도 된다. 반대로 피호출자저장 집합의 R에 있는 값들은 피호출자가 잘 보관했다가 백업해 줄것이라고 가정해도 된다.

    인라인 확장

    스택 기반 호출방식의 대안으로 많은 언어 구현에서는 서브루틴이 호출되는 시점에 인라인으로 확장되는 것을 허용한다.
    즉, 호출된 루틴의 복사가 호출자의 일부가 되는 것이다.

    실제 서브루틴 호출은 일어나지 않는다.

    스택기반 할당은 실제로 많은 오버헤드를 가지기 때문에 인라인으로 확장을 하게 되면 많은 이점이 있다.

    • 스택프레임 할당과 해지, 호출과 리턴의 분기로 인한 지연 부담이 없다.
    • 추가적인 코드 개선 가능
    • 코드 작성시 함수로 작성(정보은닉, 범위, 바인딩 지원)
    • 모듀로가 프로그래밍
    • 컴파일러가 범위나 타입을 정적검사 가능

    매개변수 전달

    형식매개변수(parameter)


    선언에 나타나는 파라미터 이름

    실 매개변수(argument)


    서브루틴 호출부에 전달되는 변수나 수식

    매개변수 모드

    서브루틴의 아규먼트 전달
    값모델 언어에서 변수 x가 전역으로 정의되었고 x를 서브루틴 p에게 매개변수로 전달하고자 한다고 가정하자.
    p(x);

    p에게 x값을 복사하여 전달하거나 x의 주소를 전달하는 두가지 관점이 존재한다.

     

    Call-by-value

     

    값으로 전달이 이 방법이다.
    실매개변수 값이 해당 형식 매개변수에 지정된다.
    실매개변수와 형식 매개변수는 서로 독립적이다.

     

    Call-by-referece

     

    참조로 전달이 이 방법이다.
    각 형식 매개변수는 실매개변수에 대한 새로운 이름이 된다.
    실 매개변수는 left-value여야 한다.

    C언어는 한상 값으로 전달을한다. 포인터는 주소값을 전달하며 배열은 포인터를 전달한다.
    주소 전달을 통해 참조를 흉내낸다.

    변형으로 Call-by-result 방식이 있는데 시작전에 실매개변수를 형식매개변수로 복사한다.
    return후에 형식 매개변수 값으 실 매개변수에 다시 복사한다.

     

     

    읽기전용 매개변수

     

    피 호출자 루틴에서 객체 참조 전달의 경우 값의 보존을 보장할 수 없다.
    값으로 복사의 경우는 아규먼트가 너무 큰 경우 복사 비용이 커지고, 수정 값을 호출자에 반영하지 못한다.

    이때 읽기 전용매개변수를 활용하면 참조로 전달하면서 값을 보호할 수 있다.
    c에서 const키워드가 그 예다.

    728x90

    '프로그래밍언어론' 카테고리의 다른 글

    제어흐름 - 구조적 흐름과 선택  (0) 2023.05.30
    제어흐름 -수식2  (0) 2023.05.29
    제어흐름-수식1  (0) 2023.04.15
    현대의 컴파일  (0) 2023.04.15
    명령문구조  (0) 2023.04.14

    댓글

Designed by Tistory.