Programming Language) Week9 -SubProgram

Jay Kim·2022년 1월 17일
0

Programming Language

목록 보기
9/11

(1) 서브프로그램 정의

-sub program (=function, procedure, subroutine)

​ -사용 이유 : 프로그램 크기 줄이기, 모듈화, readability, 유지보수&디버깅 용이

​ -요소 : Name, parameter list, body, reference environment

​ -호출 : name, 매개변수의 개수와 유형, 리턴 값의 개수와 유형 필요

​ -> proc(i,j)로 호출 ---C언어 / 결과 반환: return 결과;

​ -재귀 함수 : 함수 자체를 이용하여 function을 구현하는 것

​ -블록 구조

​ -블록 = 선언부(declaration part) + 실행부(execution part)

​ -C언어의 블록 : 이름 없는 블록(ex, for 문) , 중첩 블록은 없음

​ -특징)

​ -지역 변수 선언 : 정보 은닉, 블록 외부에서 접근 불가

​ -블록 실행 시 지역 변수에 대한 메모리 할당(stack) , 블록 끝나면 메모리 반환

​ -이름 있는 블록만 호출 가능 : 내부 블록은 외부 블록에 감춰지기 때문에 블록 외부에서는 블록 안에 있는 sub-program 호출 불가능

(2) 매개변수 전달

​ -매개 변수 종류)

​ -실인자(actual parameter) : 실제 값을 가지는 매개 변수

​ -형식 인자(formal parameter) : 함수 선언에 나타나는 매개 변수

​ -실 매개 변수의 개수 <= 형식 매개 변수의 개수

(3) 복잡한 자료구조 전달

  1. 값에 의한 호출(call by value) : 값 전달

    -실 매개 변수와 형식 매개 변수는 서로 다른 메모리 공간을 차지

    -실 매개 변수 값(r-value) -> 형식 매개 변수

  2. 값과 결과에 의한 호출 (call by value result) : 값과 결과 전달

    -값 전달 + 형식 매개 변수의 값을 실 매개 변수에 돌려줌 -----> result

  3. 참조에 의한 호출 (call by reference)

    -실 매개 변수와 형식 매개 변수 서로 같은 메모리 공간을 차지

    -실 매개 변수의 주소(l-value) -> 형식 매개 변수

  4. 이름에 의한 호출 (call by name) : 이름 전달

    -매개 변수가 사용될 때마다, 필요한 실 매개 변수의 l-value or r-value 계산되고 사용됨

    • l-value 사용은 call by reference와 동일
  5. java에서의 매개 변수 전달 방법

    1. 값 전달 (call by value) : integer, real, character, boolean
    2. 참조 전달 (call by reference) : string, array , object
  6. 배열 전달

    1. call by value : copy cost
    2. call by reference: 변경된 값을 반환하기에 적합
  7. 레코드 전달(struct in C)

    1) call by referenct 많이 사용

void sub(struct colors *s) {...}

void main(){
    struct colors col ={"red", "blue"};
    sub(&col);
}

8.sub-program passing(함수 자체를 전달)

1) sub-program name+ 매개변수들

int process(int (*pf)(int, int), int x , int y){...}

void main(){
	printf("%d", process(add,8,4));	//add함수 자체를 전달
}

9.함수 중복 : C에서는 지원 안 함, C++에서는 같은 함수 이름+ 다른 매개 변수 리스트인 경우 함수 중복 가능

double square(double f){...}

int square(int a){...}

(4)서브프로그램의 구현 및 실행

​ -sub-program 호출

​ -현재 실행중인 프로그램 상태 저장

​ -sub-program으로부터 제어 반환

  • Co-routine : sub-program 종료 전 제어 반환 /다시 호출되면 제어가 반환된 곳에서 수행이 재개 /호출하는 서브 프로그램과 호출 받는 서브 프로그램 동등한 관계
  • Subroutine : 서브프로그램 종료 후 제어를 반환

​ -호출한 다음 문장 실행

<sub-program 호출과 반환 구조>

  1. main program 1개, sub program 여러개
  2. main program 실행 시작
  3. 다른 sub programs 호출 (sub program이 다른 sub-program 호출 가능)
  4. 호출한 서브프로그램(caller)은 실행을 멈추고, 호출 받은 서브 프로그램(callee)가 실행을 시작
  5. 호출된 sub program이 종료 후 제어를 반환
  6. 호출한 문장의 다음 문장에서 실행을 다시 시작함
  • 구현
    • sub program = 정의(프로그래머가 이해하는) , 활성화(컴퓨터 내부에 기계어로 번역된 것)
    • 활성화 = code segment(알고리즘) + 활성화 record(data)
      • code ) 실행 코드, 상수 / 실행 중 변화 없음 / 메모리에 정적으로 저장
      • 활성화 record (= stack) ) 프로그램 실행 환경 정보 저장(지역 변수 , 매개 변수) / sub program 호출 시 생성 , 종료 시 파괴됨
    • 실행을 하기 위해서는 code와 활성화 record 위치를 알아야함
  • CIP : 현재 명령어 포인터 (=PC)
  • CEP: 현재 환경 포인터 (현재 실행중인 서브프로그램의 활성화 record를 가리키는 포인터)
  • 호출, 반환 구조의 구현
    • 호출) CIP와 CEP를 활성화 record에 저장 --- push / 새로운 서브프로그램을 위해 CIP와 CEP를 수정
    • 반환) old CIP와 CEP를 제거 ---PoP -> CIP와 CEP를 복구
  • 활성화 record 단순화
    • code segment 다음에 정적으로 A.R을 생성
    • 실행 중에 A.R 생성 안 함, 호출 할 때마다 A.R을 초기화
    • CIP만 필요함
  • 재귀 호출의 구현
    • ex) X->X / X->Y->X
    • 첫번째 A.R이 존재할 때 두번째 A.R이 생성되고 각각은 서로 독립적임
    • Stack 기반의 A.R 관리
    • 레코드 체인) stack에 있는 순서를 따라 A.R을 연결 --- 동적 체인 -> 실행 순서를 알 수 있음

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN