호출 - actual parameter
정의 - formal parameter
Paramter Strategy
Stack Segment and Parameters
call by value - immutable arguments
Positional Parameter
argument 정한 순서대로 입력해라
Named ( or key word) Parameter
이름을 정해서 순서를 안 지켜도 가능하다
=> Mixed Keyword and Positional
Optional Parameter
*를 쳐서 무한대로 올 수 있또록
Parameter 7/8 techniques
- • 18.3 By value - C언어
- formal parameter를 호출된 메소드의 activation record 속 지역 변수로 고려함
- formal parameter가 actual parameter에 영향을 미치지 않음
- • 18.4 By result
- formal parameter를 지역 변수로 고려하나, 초기화 없이 그저 가져오는 것
- 그렇기에 무조건 lvalue 즉 메모리 주소만 넘어올 수 있다
- 즉, 3처럼 특정 값이 넘어가면 에러가 난다는 것
- 대신 최종 전달값을 어떤 변수에 넘길지 지정하는 식으로 사용함 (opencv)
void plus(int a, int b, int c_result) {
c = a+b;
}
void func() {
int x = 3;
int y = 4;
int z;
plus(x, y, z); // z에 a+b한 c의 결과가 들어간다
}
- • 18.5 By value-result == copy-in/copy-out
- actual parameter가 lvalue여야 한다
- 위와 다른 점은, 값이 든 메모리 변수를 넘겨서 value 다루듯 사용
- reference를 공유하는 식
- • 18.6 By reference
- 큰 객체를 다루기 편리함. linking만 그대로 가져옴• 18.7 By macro expansion
- •+) Aliasing: 두 개체가 같은 lvalue를 가진다. 같은 메모리 공간을 두 파라미터가 공유 - 자세히 안 보고 넘어감
- • 18.8 By macro expansion: textual substituion before compiling (in preprocessing)
- For passing parameters by macro expansion, the body of the macro is evaluated in the caller’s context. Each actual parameter is evaluated on every use of the corresponding formal parameter, in the context of that occurrence of that formal parameter (which is itself in the caller’s context).
문제점 Capture - 소스 코드에 복사했는데 다른 의미로 이미 선언된 경우 ... free...
- • 18.8 By name (이해하려고 애쓰지 마세요)
each actual parameter가 evaluation이 된다. 마치 익명 함수 처럼.
like macro expansion with capture
(비효율적이라 이제는 잘 안 써요) (굉장히 느려요)
Thunk: anonymous function
이것을 사용해서 call by name을 한다
stack에 올릴 때 anonymous function이 올라가서 nesting link
- • 18.9 By need (꼭 이해하세요)]
- Eager Evaluation VS Lazy Evaluation
- haskal - lazy: 필요할 때만 evaluation을 해서 효율적임. 정말 필요해질 때까지 기다림
- Python은 바로바로 실행
- short circuit과 비슷한데 다르다
- haskal - lazy: 필요할 때만 evaluation을 해서 효율적임. 정말 필요해질 때까지 기다림
- Eager Evaluation VS Lazy Evaluation
Generation Expression
Call by Object Reference(Sharing): Python
오른쪽 n이라는 공간이 생기지 않고 a가 가리키는 곳을 가리키려고 하는데
a가 imumutable이면 그 이전 링크를 끊고 새로 공간을 생성해서 링킹한다.
Example
왜 각각의 과정이 이 답이 나오는지 알아야 한다
call by name의 결과도 알아야 함
'CS > Programming Language' 카테고리의 다른 글
Heap Memory & Garbage Collection (0) | 2022.11.24 |
---|---|
ㄴㄹㄴㄹ (0) | 2022.11.22 |
Expression (0) | 2022.11.21 |
Stack Memory (0) | 2022.11.20 |
Semantic Analyzer: Polymorphism (0) | 2022.11.15 |