목차
Chapter 5. Names, Bindings, Type Checking and Scopes
Chapter 6. Data Type
Chapter 7. 식과 배정문
Chapter 8. 문장수준 제어 구조
chapter 9. 부프로그램
Chapter 10. 부프로그램의 구현
Chapter 6. Data Type
Chapter 7. 식과 배정문
Chapter 8. 문장수준 제어 구조
chapter 9. 부프로그램
Chapter 10. 부프로그램의 구현
본문내용
ent>
[] ->
...
[] ->
fi
<다익스트라의 반복문>
do ->
[] ->
...
[] ->
od
chapter 9. 부프로그램
1. 부프로그램의 원리
(1) 기본정의
- 부프로그램 정의 : 부프로그램 추상화의 인터페이스와 동작 서술
- 부프로그램 호출 : 호출되는 부프로그램을 수행하라는 명시적 요청
- 부프로그램 머리부 : 정의의 첫 번째 라인.
- 매개변수 프로파일 : 매개변수의 개수, 순서, 타입.
- 프로토콜 : 매개변수 프로파일 + 리턴 타입
- 부프로그램 선언 : 프로토콜 제공. 바디는 없음. 부프로그램 헤더와 비슷
- 형식 매개 변수 : 부프로그램 머리부의 매개 변수 . 매개변수 프로파일과 비슷
- 실 매개 변수 : 부프로그램 호출문에서 전달하는 매개 변수 리스트.
2. 매개변수 전달 방법
1) 의미적 모델
- 입력 모드 : 형식 매개변수는 해당 실 매개 변수로부터 데이터를 받는다.
- 출력 모드 : 형식 매개 변수는 데이터를 실 매개 변수에 전달한다.
- 입출력 모드 : 형식 매개 변수는 실 매개 변수로부터 데이터를 받고 또한 데이터를 실 매개 변수에 전달한다.
2) 구현 모델
- 값 전달(in mode) : 실 매개 변수 값에 대한 접근 패스를 전달하는 방법 : 값이 쓰기 보호 셀에 있어야하며 비용이 더 든다.
복사하는 방법 : 형식 매개 변수를 위한 부가적인 기억 장소가 할당되어야 함. 매개 변수 크기가 크면 더 큰 비용이 든다.
- 결과 전달(out mode) : 제어가 호출자에게 반환되기 바로 전에 지역변수가 호출자의 실 매개 변수로 전달 됨. 데이터 복사로 구현. (단점 : 실 매개 변수에 할당되는 순서의 문제)
- 값 결과 전달(inout mode) : 실 매개 변수의 값은 대응되는 형식 매개 변수를 초기화하는 데 사용. 그 후 형식 매개 변수는 지역 변수로 사용. 부프로그램 종료 시에 형식 매개 변수의 값은 실 매개 변수로 반환. (단점 : 매개 변수를 위한 다중 기억 장소와 값을 복사하는 시간 요구, 실 매개 변수에 할당되는 순서의 문제점)
- 참조 전달(inout mode) : 접근 패스를 피호출 부프로그램에 전달. (장점:전달 과정이 효율적. 공간 중복이 요구되지 않고, 복사도 요구되지 않음. , 단점: 형식 매개 변수 접근이 간점 주소를 요구하므로 느림, 별칭 생성으로 실 매개 변수 사이의 충돌이 생길 수 있음.)
- sub는 main으로부터 sub(w,x,y,z)로 호출. w는 값-전달, x는 결과-전달, y는 값-결과 전달, z는 참조-전달.
3. 부프로그램들
- 중복 부프로그램 : 같은 참조 환경에서 다른 부프로그램과 같은 이름을 갖는 부프로그램. 모든 중복 부프로그램은 고유한 프로토콜을 갖는다. 즉, 매개 변수의 개수, 순서, 타입, 반환타입에서 다른 보프로그램과 달라야 함.
- 포괄형 부프로그램(=다형 부프로그램) : 함수명과 매개 변수명이 같으나 매개 변수 타입이 틀림. ex) template
4. coroutines
- 코루틴 : 코루틴 자체에 의해서 제어되는 다중 진입점을 갖는 부프로그램
- 주어진 시점에서 하나의 코루틴만 실행되며, 끝까지 실행되기보다 부분적으로 실행되고 제어를 다른 코루틴으로 전달. 다시 시작하면 제어를 다른 곳으로 전달한 문장 바로 다음부터 재시작.
- 코루틴 호출을 resume이라 부름.
Chapter 10. 부프로그램의 구현
1. 단순 부프로그램의 구현
- 활성화 레코드(activation record) : 부프로그램의 비 코드부분의 형식. 즉 배치(layout)
ex) if-else구문 같이 컴파일러가 제공하는 것.
- 활성화 레코드 사례(activation record instance) : 활성화 레코드의 구체적인 예이며 활성화 레코드 형식에 존재하는 데이터의 모임.
ex) if-else 같은 거 말고 변수에 관련된 부분.
- 단순 부프로그램을 갖는 언어는 재귀 부프로그램을 지원하지 않기 때문에, 한 시점에 주어진 부프로그램의 활성화는 하나만 존재. 부프로그램의 활성화 레코드 사례도 하나만 존재.
- 단순 부프로그램의 활성화 레코드
- 단순 부프로그램을 갖는 프로그램의 코드와 활성화 레코드
2. 스택-동적 지역 변수를 갖는 부프로그램의 구현
- 재귀 부프로그램을 지원함.
- 현재 언어의 대부분이 FILO 형태의 stack-dynamic 형태이다.
(1) 복잡한 활성화 레코드
- 스택-동적 지역 변수를 갖는 언어의 활성화 레코드
- 활성화 레코드 형식은 정적이지만, 크기는 동적이다.
- 동적 링크 : 호출자의 활성화 레코드의 꼭대기에 대한 포인터.
(2) 재귀 없는 부프로그램
- fun3의 실행이 끝났을 때, fun3의 활성화 레코드 사례는 스택에서 제거되고 동적 링크는 스택 top포인터를 재설정하기 위해 사용됨.
- fun2로부터 main에 복귀된 후, 스택에는 main의 활성화 레코드 사례만 남음.
- 동적 체인 또는 호출 체인 : 주어진 시점에서 스택에 있는 동적 링크의 집합.
- 지역 오프셋 : 활성화 레코드의 시작점으로부터 지역 영역의 오프셋
- func1에서 y의 지역 오프셋은 3, func2에서 s의 지역 오프셋은 3 t의 지역 오프셋은 4
(3) 재귀
(457page 참고)
3. 동적 영역 규칙의 구현
(1) 심층 접근 (deep access)
- Link를 따라서 가장 가까운 Link에 있는 해당 값으로 접근함.
- 반드시 변수명이 있어야 함. 지역 오프셋으로 찾아갈 수 없음.
sub3의 변수 x, v의 참조.
x의 참조는 sub3의 활성화 레코드 사례에서 발견
v의 참조는 sub1의 최근 활성화 레코드 사례에서 발견
(2) 피상 접근(shallow access)
- 방법1 : 전체 프로그램에 있는 각 변수에 대해서 별도의 스택을 가짐.
- 방법2 : 각 변수 이름에 대한 엔트리를 갖는 중앙 테이블 이용
[]
...
[]
fi
<다익스트라의 반복문>
do
[]
...
[]
od
chapter 9. 부프로그램
1. 부프로그램의 원리
(1) 기본정의
- 부프로그램 정의 : 부프로그램 추상화의 인터페이스와 동작 서술
- 부프로그램 호출 : 호출되는 부프로그램을 수행하라는 명시적 요청
- 부프로그램 머리부 : 정의의 첫 번째 라인.
- 매개변수 프로파일 : 매개변수의 개수, 순서, 타입.
- 프로토콜 : 매개변수 프로파일 + 리턴 타입
- 부프로그램 선언 : 프로토콜 제공. 바디는 없음. 부프로그램 헤더와 비슷
- 형식 매개 변수 : 부프로그램 머리부의 매개 변수 . 매개변수 프로파일과 비슷
- 실 매개 변수 : 부프로그램 호출문에서 전달하는 매개 변수 리스트.
2. 매개변수 전달 방법
1) 의미적 모델
- 입력 모드 : 형식 매개변수는 해당 실 매개 변수로부터 데이터를 받는다.
- 출력 모드 : 형식 매개 변수는 데이터를 실 매개 변수에 전달한다.
- 입출력 모드 : 형식 매개 변수는 실 매개 변수로부터 데이터를 받고 또한 데이터를 실 매개 변수에 전달한다.
2) 구현 모델
- 값 전달(in mode) : 실 매개 변수 값에 대한 접근 패스를 전달하는 방법 : 값이 쓰기 보호 셀에 있어야하며 비용이 더 든다.
복사하는 방법 : 형식 매개 변수를 위한 부가적인 기억 장소가 할당되어야 함. 매개 변수 크기가 크면 더 큰 비용이 든다.
- 결과 전달(out mode) : 제어가 호출자에게 반환되기 바로 전에 지역변수가 호출자의 실 매개 변수로 전달 됨. 데이터 복사로 구현. (단점 : 실 매개 변수에 할당되는 순서의 문제)
- 값 결과 전달(inout mode) : 실 매개 변수의 값은 대응되는 형식 매개 변수를 초기화하는 데 사용. 그 후 형식 매개 변수는 지역 변수로 사용. 부프로그램 종료 시에 형식 매개 변수의 값은 실 매개 변수로 반환. (단점 : 매개 변수를 위한 다중 기억 장소와 값을 복사하는 시간 요구, 실 매개 변수에 할당되는 순서의 문제점)
- 참조 전달(inout mode) : 접근 패스를 피호출 부프로그램에 전달. (장점:전달 과정이 효율적. 공간 중복이 요구되지 않고, 복사도 요구되지 않음. , 단점: 형식 매개 변수 접근이 간점 주소를 요구하므로 느림, 별칭 생성으로 실 매개 변수 사이의 충돌이 생길 수 있음.)
- sub는 main으로부터 sub(w,x,y,z)로 호출. w는 값-전달, x는 결과-전달, y는 값-결과 전달, z는 참조-전달.
3. 부프로그램들
- 중복 부프로그램 : 같은 참조 환경에서 다른 부프로그램과 같은 이름을 갖는 부프로그램. 모든 중복 부프로그램은 고유한 프로토콜을 갖는다. 즉, 매개 변수의 개수, 순서, 타입, 반환타입에서 다른 보프로그램과 달라야 함.
- 포괄형 부프로그램(=다형 부프로그램) : 함수명과 매개 변수명이 같으나 매개 변수 타입이 틀림. ex) template
4. coroutines
- 코루틴 : 코루틴 자체에 의해서 제어되는 다중 진입점을 갖는 부프로그램
- 주어진 시점에서 하나의 코루틴만 실행되며, 끝까지 실행되기보다 부분적으로 실행되고 제어를 다른 코루틴으로 전달. 다시 시작하면 제어를 다른 곳으로 전달한 문장 바로 다음부터 재시작.
- 코루틴 호출을 resume이라 부름.
Chapter 10. 부프로그램의 구현
1. 단순 부프로그램의 구현
- 활성화 레코드(activation record) : 부프로그램의 비 코드부분의 형식. 즉 배치(layout)
ex) if-else구문 같이 컴파일러가 제공하는 것.
- 활성화 레코드 사례(activation record instance) : 활성화 레코드의 구체적인 예이며 활성화 레코드 형식에 존재하는 데이터의 모임.
ex) if-else 같은 거 말고 변수에 관련된 부분.
- 단순 부프로그램을 갖는 언어는 재귀 부프로그램을 지원하지 않기 때문에, 한 시점에 주어진 부프로그램의 활성화는 하나만 존재. 부프로그램의 활성화 레코드 사례도 하나만 존재.
- 단순 부프로그램의 활성화 레코드
- 단순 부프로그램을 갖는 프로그램의 코드와 활성화 레코드
2. 스택-동적 지역 변수를 갖는 부프로그램의 구현
- 재귀 부프로그램을 지원함.
- 현재 언어의 대부분이 FILO 형태의 stack-dynamic 형태이다.
(1) 복잡한 활성화 레코드
- 스택-동적 지역 변수를 갖는 언어의 활성화 레코드
- 활성화 레코드 형식은 정적이지만, 크기는 동적이다.
- 동적 링크 : 호출자의 활성화 레코드의 꼭대기에 대한 포인터.
(2) 재귀 없는 부프로그램
- fun3의 실행이 끝났을 때, fun3의 활성화 레코드 사례는 스택에서 제거되고 동적 링크는 스택 top포인터를 재설정하기 위해 사용됨.
- fun2로부터 main에 복귀된 후, 스택에는 main의 활성화 레코드 사례만 남음.
- 동적 체인 또는 호출 체인 : 주어진 시점에서 스택에 있는 동적 링크의 집합.
- 지역 오프셋 : 활성화 레코드의 시작점으로부터 지역 영역의 오프셋
- func1에서 y의 지역 오프셋은 3, func2에서 s의 지역 오프셋은 3 t의 지역 오프셋은 4
(3) 재귀
(457page 참고)
3. 동적 영역 규칙의 구현
(1) 심층 접근 (deep access)
- Link를 따라서 가장 가까운 Link에 있는 해당 값으로 접근함.
- 반드시 변수명이 있어야 함. 지역 오프셋으로 찾아갈 수 없음.
sub3의 변수 x, v의 참조.
x의 참조는 sub3의 활성화 레코드 사례에서 발견
v의 참조는 sub1의 최근 활성화 레코드 사례에서 발견
(2) 피상 접근(shallow access)
- 방법1 : 전체 프로그램에 있는 각 변수에 대해서 별도의 스택을 가짐.
- 방법2 : 각 변수 이름에 대한 엔트리를 갖는 중앙 테이블 이용
소개글