본문 바로가기
프로그래밍언어론

[프로그래밍언어론] 26. 바인딩 정책(Binding Policy)

by 파스텔코랄 2023. 10. 17.

고차 함수(Higher-Order)

  • 다음과 같은 경우 함수는 고차로 간주된다.
    • 함수를 매개변수로 받아들인다.
    • 아니면 함수를 반환한다.
  • 이 메커니즘은 많은 프로그래밍 언어, 특히 기능적 언어에서 지원된다.

 


 

매개변수로서의 함수

  • 함수를 매개변수로 사용하는 C 코드의 예제
int x = 1;
int f(int y) {
    return x+y; // x = 1
}
int g(function<int(int)> h) {
    int x = 2;
    return h(3)+x; // x = 2
}
int main() {
    //Functions as parameters
    int x = 4;
    int z = g(f); // x = 4
}
  • 함수 fg에 매개변수로 전달된다.
  • 변수 x가 여러 번 정의되었다.
  • 함수 g에서 x의 어떤 바인딩을 사용해야 하는가?
    • 이름 x에 대해 어떤 환경을 확인해야 할까?

 

깊고 얕은 바인딩(Deep and Shallow Binding)

  • Deep Binding : fh 사이의 링크가 만들어질 때 활성화된 환경을 사용한다.
    • 환경(전역변수)을 바인딩. 
    • int z = g(f);
  • Shallow Binding f(h 사용) 호출이 발생할 때 활성화된 환경을 사용한다.
    • 이전 환경(이전 함수 속 지역변수)을 바인딩 
    • return h(3)+x;

 

  • 정적범위(Static Scope) + Deep/Shallow Binding
    • h(3) = 4, g(f) = 6
  • 동적범위(Dynamic Scope) + Deep Binding
    • h(3) = 7, g(f) = 9
  • 동적범위(Dynamic Scope) + Shallow Binding
    • h(3) = 5, g(f) = 7

 


 

환경을 정의하는 것은 무엇인가?

  • 가시성 규칙(Visibility Rules)
  • 가시성 규칙의 예외 : 재정의된 이름을 고려해야 하며 선언 후에 이름을 사용해야 한다.
  • 범위 규칙(Scope Rules)
  • 매개변수 전달 모드(Parameter Passing Modes)
  • 바인딩 정책(Binding Policy)

 


 

결과로서의 함수

  • 함수는 결과로 다른 함수를 반환할 수 있다.
  • 정적 범위를 사용하면 k() 호출은 실제로 s를 호출하고 s에서는 x = 1이다.
    • 반환된 함수에서는 환경도 고려된다.
  • 따라서 calling_s()의 결과는 실제로 클로저이다.
int x = 1;
int s() {
    return x+1;
}
function<int()> calling_s() {
    return s;
}

int main() {
    // Fuctions as results
    int x = 4;
    function<int()> k = calling_s();
    int y = k();
}

 


 

클로저(Closure)

  • 클로저는 (표현식, 환경) 쌍이다.
    • 환경에는 표현식의 모든 자유 변수가 포함된다.
  • 자유 변수는 표현식에 사용되지만 현재 환경에서는 선언되지 않은 변수이다.
    • Python에서는 전역 변수가 자유 변수가 아니라는 특별한 차이점이 있다.
    • 그러나 일반적으로 전역 변수는 로컬 환경에서 다시 선언되지 않는 한 자유 변수이다.

댓글