Subprograms
- 각 subprogram에는 단일 진입점(single entry point)이 있다.
- subprogram 이 호출되면 호출 프로그램은 중단(suspended)된다.
- 호출된 subprogram 의 실행이 종료되면 항상 호출자에게 제어권이 반환된다.
☑️ 매개변수 대응
1. positional binding
: 실제 매개변수와 형식 매개변수의 바인딩은 위치에 따라 결정됨을 의미한다.
ABC (x , y)
ABC (int a, int b)
위의 코드를 예시로 들자면 x는 a로 가고, y는 b로 감을 의미한다.
C, C++, Java, Python 모두 지원 가능하다.
특징으로는 안전하고 효과적이라는 것이다.
2. keyword binding
: 실제 매개변수를 바인딩할 형식 매개변수의 이름이 실제 매개변수와 함께 지정됨을 의미한다.
ABC (b = x, a = y)
키워드 바인딩을 지원하는 언어는 Python뿐이다.
- 장점: 파라미터는 임의의 순서로 나타날 수 있으므로 파라미터 대응 오류를 방지할 수 있다.
- 단점: 사용자는 매개 변수의 이름을 알아야 한다.
➕ 추가로 디폴트 값을 줄 수 있는 언어는 C++과 Python이다.
ABC (int a = 10, int b = 20)
☑️ Procedures and Functions
1. Procedures
: 매개변수화된 계산을 정의하는 statement의 집합이다.
2. function
: 리턴값이 있는 명령어의 모음이다.
☑️ Local Referencing Environments
로컬 변수는 stack-dynamic 일 수 있다.
- 장점: 재귀를 지원한다, 로컬을 위한 저장소가 일부 하위 프로그램 간에 공유된다.
- 단점: 할당/할당해제에 대한 시간이 걸린다, 간접 주소 방식이다.
☑️ Semantic Models
1. Pass-by-Value (In Mode)
: 실제 매개변수의 값은 해당 형식 매개변수를 초기화하는 데 사용된다.
특징
- 일반적으로 복사에 의해 구현된다.
- access path(주솟값 전달)를 전송하여 구현할 수 있지만 권장되지 않는다. (write protection을 강화하는 건 쉽지 않다)
void fun(const int *ptr1, int *ptr2);
변수 ptr1의 경우, const 키워드를 통해 write protection을 걸었다.
변수 ptr2의 경우, 주솟값을 이용하여 변경이 가능하므로 pass-by-reference처럼 사용될 수 있다.
단점
- physical move에 의한 경우: 추가 저장소가 필요한 경우(2회 저장), 실제 이동에는 비용이 많이 들 수 있다.(큰 매개 변수의 경우)
- access path method 방식인 경우: 호출된 서브 프로그램에서 write protection 해야 하며, 더 많은 액세스 비용이 든다.(간접 주소 지정)
2. Pass-by-Result (Out Mode)
: 매개변수가 전달되면 서브 프로그램에 값이 전달되지 않고, 해당 매개변수가 로컬 변수 역할을 하며, 물리적 이동에 의해 제어가 발신자에게 반환될 때 해당 값이 발신자의 실제 매개변수로 전달된다.
추가 저장 위치 및 복사 작업이 필요할 것이다.
sub(p1, p1);
위 코드에서 어떤 형식의 파라미터를 뒤로 복사하든 p1의 현재 값을 나타낸다는 잠재적 문제도 존재한다.
3. Pass-by-Value-Result (Inout Mode)
: pass-by-value와 passby-result의 조합을 의미한다.
즉, 서브 프로그램이 시작될 때 pass-by-value로 값을 전달해주고, 서브 프로그램이 종료될 때 pass-by-reference로 값을 반환해준다.
4. Pass-by-Reference (Inout Mode)
: Pass an access path
* pass-by-sharing이라고 불리기도 한다.
- 장점: 복사 및 중복 저장이 없기 때문에 효율적이다. (메모리를 아낄 수 있다)
- 단점: 매개 변수에 접근해야 할 때 느리다. (메모리를 두 번 접근해야 value에 접근할 수 있다.)
☑️ Coroutines
- symmetric control 라고도 불린다. (caller와 called가 동등한 기준에 있기 때문)
- 코루틴 호출은 resume이라고 부른다.
- 코투린의 첫 번째 resume은 처음부터 시작하지만 이후의 호출은 코루틴에서 마지막으로 실행된 문 바로 뒤에 지점에서 입력한다.
'3-1 학기 > Programming Languages' 카테고리의 다른 글
[프로그래밍언어] Ch 10 Implementing Subprograms (0) | 2024.06.01 |
---|---|
[프로그래밍언어] Ch6 Concepts of Programming Languages (0) | 2024.04.16 |
[프로그래밍언어] Ch5 Names, Bindings, and Scopes (0) | 2024.04.14 |
[프로그래밍언어] Ch4 Lexical and Syntax Analysis (0) | 2024.04.13 |
[프로그래밍언어] Ch3 Describing Syntax and Semantics (0) | 2024.04.13 |