9,10. subprogram

ttomy·2022년 6월 7일
0

프로그래밍 언어

목록 보기
11/11

intro

  • parameter pasing방법
    in
    out
    inout

함수에 대한 포인터 변수
포인터 만들어서 그것이 함수를 가리키게 하는 것

사이드 efffect

generic

9.2 기본

formal parameter: 함수를 정의하기 위해 사용. 지역변수처럼 취급
actual parameter:

어떻게 매치? -> positional(순서대로)
or 394p keyword parameter -> 인자이름에 할당,readability 개선

프로시저 vs function
c에선 프로시저 없앰. return타입이 void면 프로시저인 것임.

9.3 디자인 이슈

subprogram설계 관련 이슈
1. parameter passing

9.4 local referencing 환경

지역변수의 scope는 기본적으로 함수에 국한,라이프타임도 함수가 active한 동안

9.4.2 nested subprogram

c계열의 언어는 nesting이 없다.

9.5 파라미터 passing method

파라미터 패싱의 semantic 모델

  • in mode : call by value, pass by value: actual-> formal 서브프로그램이 값 넘겨주고 바로 종료
  • out mode : pass by result ,call by result: formal-> actual 종료 시에 넘김
  • inout mode : 시작 시 call by value, 종료 시 call by result로 caller로 전달.
    -> call by value result(메모리 공간,시간 적으로 비효율)
    -> call by reference(aliasing)

out, inout은 값을 실제로 바꾸기 때문에 side effect 일어날 수 있음

call by name: 기본적으로는 call by reference와 같으나
바인딩이 접근 시 일어나기 때문에 중간에 접근 인덱스가 바뀌면 바뀐 인덱스로 값이 넘어감.
바인딩이 언제 되냐의 차이

9.5.3 implementing

runtime stack을 쓴다
408p

9.5.4 call by referencing의 방법

c에서는 주소를 넘김.
reference임을 구별하는 방법 : &, ref, var... 이 파라미터는 call by ref임을 구별하는 법

9.5.5 타입 체킹 파라미터

static type checking이 주로 사용됨.
프로그램의 relibility에 영향 잇음.
formal 과 actual의 타입체크는 strong하게 하는 언어에서는 다 타입체크함.

9.6

파라미터로 함수가 들어갈 때

9.7 함수호출 INDIRECTLY

9.8

ADA에서는 FUNCTION 에서는 IN-mode만 가능
리턴타입으로 뭘 할 수 있으냐. c에서는 다 보낼 수 있다.
리턴 값의 개수: 대부분의 언어는 하나이지만, 루비 같은 것은 리턴값이 여러개 일 수 있다.

9.9 오버로디드 함수

같은 이름의 함수 여러개 존재, 파라미터만 다름.

9.10 generic

다형성의 제공방법.
제너릭을 이용하면 인스턴스를 만들 때 파라미터 타입을 정할 수 있다.
오버로드는 ad hoc 다형성.
제너릭은 parameteric 다형성-> c++에선 template

9.11 user defined overloaded operator

9.12 함수언어

9.13 coroutines

resume: 하나가 돌다 멈추면 다른 거 실행시작
ex) 카드게임의 턴

10 implementing subprogram

intro

함수를 실행하면 컨트롤이 함수의 정의부분으로 넘어감-> subprogram linkage

컨트롤이 넘어간다는 것-> pc가 이동하는 것.

함수가 실행될 떄 필요한 공간,메모리 지역변수와 파라미터 위한 공간

10.1 general sematics of calls and returns

함수가 호출되었을 떄 할당되는 공간-> activation record

초창기 언어들은 activation record를 static하게 했다.
algol60부터 dynamic하게 할당하는 것으로 바뀜
-> recursion을 지원 가능.
함수 실행 중이지 않은데 변수가 할당되면 낭비임.

그림 10.1
return address: 돌아갈 주소, 호출할 때의 pc값.

10.3

다이나믹한 할당위해서 ACTIVATION RECORD에 필드가 추가됨
->dynamic Link

스택에세 파라미터부터 할당함. -> 컴파일 할 때 그것부터 들어와서
ex) 10.3.2 449p
그림 10.5

offset(기준점부터의 거리)
지역변수의 주소는 자기 스택베이스의 offset으로 나타냄.
자기의 스택베이스를 가리키는 레지스터-> EP(environment pointer)
함수가 호출이 되면 ep값이 이동하고 이전의 ep를 저장해야 함.
-> Dynamic linkage에 이전 ep값이 저장되어 기억함.

10.3.3. recursion

재귀의 경우 똑같이 생긴 독립적인 스택들이 생김.

10.4 nested subprogram

nesting은 c에서는 없애고 대신 블록을 만들수 있게 했다.
nesting을 허용하면 non-local영역이 생기게 된다. -> 부모의 지역변수를 참조 가능해야 된다.따라서 부모의 ep값도 알아야함.
ex) 456p main,bigsub함수
그림 10.9 nesting을 위해 static link가 추가됨-> 부모 함수의 EP값저장.

depth:자기 꺼면 0 자기부모꺼면 1..
-> static link를 몇 번 타고가야 되는지의 값

0개의 댓글