관리 메뉴

너와 나의 스토리

[프로그래밍 언어론] CH9 Subprograms 본문

Programming Language

[프로그래밍 언어론] CH9 Subprograms

노는게제일좋아! 2019. 12. 3. 01:08
반응형

두 가지 기본 추상화 설비

  • 프로세스 추상화
    • 예전부터 강조
    • 이번 챕터에서 논의
  • 데이터 추상화
    • 챕터 11에서 논의

 

 

Subprogram의 기본

  • 각 서브프로그램는 단일 엔트리 포인트를 가진다.
  • 호출 프로그램은 호출된 서브프로그램을 실행하는 동안 일시 중단됨.
  • 호출된 서브프로그램의 실행이 종료될 때 제어권(control)이 항상 호출자에게 반환됨

 

 

기본 정의

  • 서브 프로그램 정의(Subprogram definition)는 서브 프로그램 추상화에 대한 인터페이스 동작을 설명한다.
    • Python에서 함수 정의는 실행가능하며, 다른 모든 언어에서 실행가능하지 않다.
    • Ruby에서 함수 정의는 클래스 정의 내부 또는 외부에 나타날 수 있다. 바깥쪽이라면, 그들은 객체의 메서드이다. 그들은 함수처럼 객체없이 호출할 수 있다.
    • Lua에서 모든 함수는 익명이다.
  • 서브 프로그램 호출(Subprogram call)은 서브 프로그램을 실행하라는 명시적 요청이다.
  • 하위 프로그램 헤더는 이름, 하위 프로그램의 종류 및 공식 매개변수를 포함하는 정의의 첫 번째 부분이다.
    • 목적1: 다음 구문 구조는 어떤 특별한 종류의 부프로그램의 정의라는 것을 명시. 한 종류 이상의 부 프로그램을 갖는 언어에서, 부프로그램의 종류는 일반적으로 특수어로 나타낸다.
    • 목적2: 부프로그램이 이름을 갖는다면, 헤더는 부프로그램의 이름을 제공한다. 
    • 목적3: 선택적으로 매개변의 리스트를 지정한다.
  • 하위 프로그램은 파라미터 profile (signature라고도 함)은 해당 파라미터의 수, 순서 및 유형이다.
  • 프로토콜은 하위 프로그램의 매개변수 프로파일이며, 함수인 경우 반환하는 유형이다.
  • C와 C++에서 함수 선언은 종종 prototypes이라고 부른다.
  • 서브프로그램 선언은 프로토콜을 제공하지만 서브프로그램의 본문(body)는 아니다.
  • 형식 매개변수는 하위 프로그램 헤더에 나열되고 하위 프로그램에 사용되는 dummy 변수이다.
  • 실제 파라미터는 하위 프로그램 호출에 사용되는 값 또는 주소를 나타낸다.

 

 

 

Actual/Formal Parameter Correspondence

  • 위치(Positional)
    • 실제 매개변수를 공식 매개변수에 바인딩하는 것은 위치: 첫 번째 실제 매개변수가 첫 번째 공식 매개변수 등에 바인딩된다.
    • 안전하고 효과적
  • Keyword
    • 실제 매개변수가 바인딩될 형식 매개변수의 이름은 실제 매개변수와 함께 지정된다.
    • 장점: 매개변수는 임의의 순서로 나타날 수 있으므로 매개변수 대응 오류를 피할 수
    • 무시: 사용자는 형식 매개 변수의 이름을 알아야 함

 

 

Formal Parameter Default Values

  • 특정 언어(예: C++, Python, Ruby, Ada, PHP)에서 형식 매개변수는 기본값을 가질 수 있다(실제 매개변수가 전달되지 않은 경우)
    • C++에서는 파라미터가 위치적으로 연결되어 있으므로 기본 파라미터가 마지막에 표시되어야 함(키워드 파라미터가 없음)
  • 파라미터의 변수 수
    • C# 메서드는 동일한 유형의 매개변수만 사용할 수 있다. 해당 공식 매개변수는 모수 앞에 배열된다.
    • 루비에서는 실제 파라미터가 해시 리터럴의 요소로 전송되고 해당 형식 파라미터 앞에 별표가 붙는다.
    • Python에서 실제는 값의 목록이며 해당 형식 매개변수는 별표를 가진 이름이다.
    • Lua에서 변수 개수의 파라미터는 3개의 마침표를 가진 공식 파라미터로 표시되며, 3개의 마침표에서 a 또는 복수 할당으로 액세스된다.

 

Ruby Blocks

  • Ruby는 어레이의 요소를 처리하는 데 종종 사용되는 여러 iterator 기능을 포함한다.
  • iterators는 블록으로 구현되며, 애플리케이션으로도 정의 가능
  • 블록은 부착된 메서드 호출이며, 매개변수를 가질 수 있으며(수직 막대에서), 메서드가 yield문을 실행할 때 실행된다.

 

 

Procedures and Functions

  • 하위 프로그램의 두 가지 카테고리가 있습니다.
    • Procedures는 매개변수 연산을 정의하는 문장(statements)의 집합이다.
    • 함수는 구조적으로 procedures지만 의미론적으로 수학에서 함수를 모델로 한 것입니다. 
      • 그들은 부작용이 생길 것으로 예상된다.
      • 실제로, 프로그램 함수는 부작용을 가지고 있다.

 

Design Issues for Subprograms

  • 로컬 변수가 정적 변수인가, 동적 변수인가?
  • 하위 프로그램 정의가 다른 하위 프로그램 정의에 나타날 수 있는가?
  • 어떤 매개변수 전달 방법이 제공되는가?
  • 매개변수 유형을 확인하였는가?
  • 서브프로그램을 매개 변수로 전달할 수 있고 서브프로그램을 중첩할 수 있는 경우 전달된 서브 프로그램의 참조 환경은 무엇입니까?
  • 하위 프로그램을 오버로드할 수 있는가?
  • 하위 프로그램이 일반적일 수 있는가?
  • 하위 프로그램 중첩을 허용하는 언어인 경우 폐쇄(closure)가 지원되는가?

 

 

Local Referencing Environments

  • 지역 변수는 stack-dynamic일 수 있다.
    • 장점:
      • 재귀 허용
      • local용 저장소는 일부 서브 프로그램들에서 공유된다.
    • 단점:
      • 할당/해제, 시간 초기화
      • 간접 addressing 
      • 서브프로그램은 hitory sensitive할 수 없다.
  • 지역 변수는 static일 수 있다.
    • 장점과 단점은 stack-dynamic local variable의 반대
  • 예:
    • 대부분의 현대 언어에서 local은 stack-dynamic이다.
    • C 기반 언어에서 local은 기본적으로 stack-dynamic이지만(default), static으로 선언될 수도 있다.
    • C++, JAVA, Python, C#의 메서드에는 stack-dynamic local만 가진다.
    • Lua에서 암시적으로 선언된 모든 변수는 전역이다. 지역 변수는 local로 선언되고 stack-dynamic이다.

 

Semantic Models of Parameter Passing

  • In mode
  • Out mode
  • Inout mode

 

 

 

Conceptual Models of Transfer

  • 물리적으로 값(value)을 변경
  • 값(value)의 경로에 접근하여 변경

 

 

 

Pass-by-Value (In mode) [값-전달]

  • 보통 복사로 구현됨. 값-전달은 호출자의 실 매개변수 값에 대한 접근 경로를 전달함으로써 구현하는 것이 가능하지만, 값이 쓰기 보호 셀(읽는 것만 가능한 셀)에 있어야한다.

Pass-by-Result (Out mode) [결과-전달]

  • 매개변수가 결과로 전달될 때, 어떤 값도 부프로그램으로 전달되지 않는다. 해당 형식 매개변수는 지역변수로서 사용되지만, 제어가 호출자에게 반환되기 바로 전에 그 값은 호출자의 실 매개변수로 전달된다.

 

                                                                                     

 

반응형
Comments