함수에 대한 포인터 변수
포인터 만들어서 그것이 함수를 가리키게 하는 것
사이드 efffect
generic
formal parameter: 함수를 정의하기 위해 사용. 지역변수처럼 취급
actual parameter:
어떻게 매치? -> positional(순서대로)
or 394p keyword parameter -> 인자이름에 할당,readability 개선
프로시저 vs function
c에선 프로시저 없앰. return타입이 void면 프로시저인 것임.
subprogram설계 관련 이슈
1. parameter passing
지역변수의 scope는 기본적으로 함수에 국한,라이프타임도 함수가 active한 동안
c계열의 언어는 nesting이 없다.
파라미터 패싱의 semantic 모델
out, inout은 값을 실제로 바꾸기 때문에 side effect 일어날 수 있음
call by name: 기본적으로는 call by reference와 같으나
바인딩이 접근 시 일어나기 때문에 중간에 접근 인덱스가 바뀌면 바뀐 인덱스로 값이 넘어감.
바인딩이 언제 되냐의 차이
runtime stack을 쓴다
408p
c에서는 주소를 넘김.
reference임을 구별하는 방법 : &, ref, var... 이 파라미터는 call by ref임을 구별하는 법
static type checking이 주로 사용됨.
프로그램의 relibility에 영향 잇음.
formal 과 actual의 타입체크는 strong하게 하는 언어에서는 다 타입체크함.
파라미터로 함수가 들어갈 때
ADA에서는 FUNCTION 에서는 IN-mode만 가능
리턴타입으로 뭘 할 수 있으냐. c에서는 다 보낼 수 있다.
리턴 값의 개수: 대부분의 언어는 하나이지만, 루비 같은 것은 리턴값이 여러개 일 수 있다.
같은 이름의 함수 여러개 존재, 파라미터만 다름.
다형성의 제공방법.
제너릭을 이용하면 인스턴스를 만들 때 파라미터 타입을 정할 수 있다.
오버로드는 ad hoc 다형성.
제너릭은 parameteric 다형성-> c++에선 template
resume: 하나가 돌다 멈추면 다른 거 실행시작
ex) 카드게임의 턴
함수를 실행하면 컨트롤이 함수의 정의부분으로 넘어감-> subprogram linkage
컨트롤이 넘어간다는 것-> pc가 이동하는 것.
함수가 실행될 떄 필요한 공간,메모리 지역변수와 파라미터 위한 공간
함수가 호출되었을 떄 할당되는 공간-> activation record
초창기 언어들은 activation record를 static하게 했다.
algol60부터 dynamic하게 할당하는 것으로 바뀜
-> recursion을 지원 가능.
함수 실행 중이지 않은데 변수가 할당되면 낭비임.
그림 10.1
return address: 돌아갈 주소, 호출할 때의 pc값.
다이나믹한 할당위해서 ACTIVATION RECORD에 필드가 추가됨
->dynamic Link
스택에세 파라미터부터 할당함. -> 컴파일 할 때 그것부터 들어와서
ex) 10.3.2 449p
그림 10.5
offset(기준점부터의 거리)
지역변수의 주소는 자기 스택베이스의 offset으로 나타냄.
자기의 스택베이스를 가리키는 레지스터-> EP(environment pointer)
함수가 호출이 되면 ep값이 이동하고 이전의 ep를 저장해야 함.
-> Dynamic linkage에 이전 ep값이 저장되어 기억함.
재귀의 경우 똑같이 생긴 독립적인 스택들이 생김.
nesting은 c에서는 없애고 대신 블록을 만들수 있게 했다.
nesting을 허용하면 non-local영역이 생기게 된다. -> 부모의 지역변수를 참조 가능해야 된다.따라서 부모의 ep값도 알아야함.
ex) 456p main,bigsub함수
그림 10.9 nesting을 위해 static link가 추가됨-> 부모 함수의 EP값저장.
depth:자기 꺼면 0 자기부모꺼면 1..
-> static link를 몇 번 타고가야 되는지의 값