. Spaghetti Code
. Fortran
. Assembly와 거의 1:1로 mapping된다.
. CONTINUE statement
. 아무일도 하지 않고 goto의 label로만 사용함.
. GOTO를 매우 남발하고 있어서 코드 읽기가 어렵다.
. block내로 뛰어드는 일도 가능(과거 변수값 재활용 등)
. Structured Control
. GOTO는 이해하기 어렵기 때문에 다른 것을 PL이 제공해보자
. Dijkstra - "Goto considered hamful"
. Control flow(structure jumps)
. if then else end
. while do end
. for { }
. case
. Can't jump into the middle of a block
. Activation Record 처리에 명확한 답이 없고 이상해지므로 compiler가 배제함
. Exceptions
. Purpose
. Jump out of a block or function invocation
. Block내에서 문제를 해결할 수 없을 때 밖으로 나간다.
. 여러 단계의 block을 한번에 나간다.(non-local goto와 비슷)
. Pass data as part of the jump
. 벗어날 때 parameter를 jump
. Return to a program point that was set up to continue the computation
. 정해진 곳으로 return
. Memory Management
. Unnecessary activation record may be deallocated
. raise = throw = abort part = jump
. handler = catch
. Static scope와 dynamic scope
. variable은 static scope가 이해하기 쉽지만
handler는 dynamic scope가 더 의미가 있다.
. Static scope로 하게되면 library작성자나 callee가 결정해야 하는 데
dynamic scope로 하면 library user나 caller가 뭘 할지 정할 수 있다.
. ML : handle이 pattern match, type이 아닌 다른 특별한 것으로 취급됨
. C++ : 어떤 type이든 throw하고 type에 따라 handle
ex) overflow일 때
. Numerator는 0, Denominator는 1을 return
ex) Computing the inverse of a matrix
. determinant가 0이 아닐 때만 inverse가 존재한다.
. determinant를 먼저 구해 볼수도 있지만 inverse만큼 cost가 크다.
. 따라서 inverse를 구하는 중간에 determinant가 0이면 raise exception
. Exception은 언제 쓰나?
. Error conditions에 쓴다.
. Efficiency를 위해 쓴다.
ex) short-circuit
ex) 많은 값을 곱할 때
. 중간 값이 0이면 더 이상 계산하지 않아도 된다.
. 심지어 마지막 원소가 0이라도 stack pop시간을 아껴준다.
. Typing
. Exception은 무슨 type으로 할까?
ML에서는 그냥 아무 type(type variable)이 되게 한다.
. Resource allocation
. Stack은 그냥 pop한다.
. Heap은 ML에서는 garbage collector가 챙긴다.
C에서는 user의 책임이다.
. Lock, Thread등에서는 문제가 매우 골치아프다.
(잘 챙기든지, 포기하든지 알아서해라.)
. Continuation
. http://en.wikipedia.org/wiki/Continuation
. 현재 value를 바탕으로 remaining work를 기록해둠.
. Program optimization등에 이용됨.
. upcall
. callback
http://en.wikipedia.org/wiki/Callback_%28computer_science%29
. the rest of the computation to be performed after it.
. Continuation으로 error(exception) handling도 가능하다.
. CPS(continuation-passing-style)
. http://en.wikipedia.org/wiki/Continuation-passing_style
. control이 continuation이라는 형식으로 통해 explicit하게 pass됨
. k(Kappa) : continuation argument
. continuation-passing-form
. function이나 operation이 continuation으로 pass되는 것
. return 할 필요가 없다.
. tail call과도 관련 지을 수 있다.
. ex) fact(9)에서
fact(8)의 continuation : lx.9*x
fact(7)의 continuation : ly.(lx.9*x) (8*y)
fact(6)의 continuation : lz.(ly.(lx.9*x) (8*y)) (7*z)
. initial continuation : the identity function
. TCO(Tail call optimization)
. http://en.wikipedia.org/wiki/Tail_call_optimization
. Recursive call을 iterative로 바꿀 general한 방법은 없다.