CS/Programming Language

Parameter Passing

WakaraNai 2022. 11. 25. 20:58
728x90
반응형

호출 - 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

C는 포인터로 따로 표시해서 reference하기에 정확히 따지면 call By value다.

  • •+) 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

 

b=i이므로 i=5 -> b=a이므로 a=i+1  -> i는 6이 된다 

  • • 18.9 By need (꼭 이해하세요)]
    • Eager Evaluation VS Lazy Evaluation
      • haskal - lazy: 필요할 때만 evaluation을 해서 효율적임. 정말 필요해질 때까지 기다림
        • Python은 바로바로 실행
      • short circuit과 비슷한데 다르다

 

 

Generation Expression

 

Call by Object Reference(Sharing): Python

오른쪽 n이라는 공간이 생기지 않고 a가 가리키는 곳을 가리키려고 하는데

a가 imumutable이면 그 이전 링크를 끊고 새로 공간을 생성해서 링킹한다.

 

 

Example

왜 각각의 과정이 이 답이 나오는지 알아야 한다

call by name의 결과도 알아야 함

 

 

728x90
반응형

'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