Short-circuit evaluation
여러(n) 개의 msg 발생기가 있고,
1) 그들 중 하나라도 발생하면 목적 프로그램(A)을 실행
2) 그들 중 모두가 발생해야 목적 프로그램(A)을 실행
하는 두 시나리오를 생각하자.
1)과 2) 모두 bool 값(B)에 따라 A의 실행 여부를 결정하되,
1)은 n-ary Or,
2)는 n-ary And
에 의해서 bool 값이 계산되는 것이다.
주의할 것은 사실 B값은 boolean 값이 아니라 enum {Undetermined, False, True} 값이라는 것.
그리고 B값을 계산하는 데 필요한 인수들도 그렇다는 것.
2)의 경우에는 그대로 두어도 문제가 없다.
n=3인 경우에 대해 생각하면, [U/U/U]가 [T/T/T]가 되면 A를 실행하고, 하나라도 F가 나타나는 순간 실행을 포기하면 된다. 그 외의 경우에는 무한 대기한다.
1)의 경우에는 short-circuit evaluation을 지원하지 않으면 문제가 된다.
마찬가지로 n=3에 대해 생각하면, [T/U/U]가 됐을 때 A를 실행하지 않고 U가 T 또는 F로 바뀔 때까지 무한 대기하는 것이다. 이것은 처음에 목적한 "하나라도 발생하면 A 실행"에 맞지 않는다.
이것저것 기능을 추가하다 보니,
C++(null pointer를 피하는 데 유용하다)와는 전혀 다른 이유로 short-circuit evaluation이 필요하게 되었다.
위키를 보니 재미있는 내용이 있는데, &&, ||는 short-circuit operator이지만
bitwise operator인 &, |는 eager operator이다. (당연한가?)
위키를 보니 재미있는 내용이 있는데, &&, ||는 short-circuit operator이지만
bitwise operator인 &, |는 eager operator이다. (당연한가?)
Language | Eager operators | Short-circuit operators | Result type |
---|---|---|---|
ABAP | none | and , or | Boolean1 |
Ada, Eiffel | and , or | and then , or else | Boolean |
ALGOL 68 | and, &, ∧ ; or, ∨ | andf , orf (both user defined) | Boolean |
C2 | none | && , || , ? [1] | Numeric (&& ,|| ), opnd-dependent (? ) |
C++3 | & , | | && , || , ? [2] | Boolean (&& ,|| ), opnd-dependent (? ) |
Go, OCaml, Haskell | none | && , || | Boolean |
C#, Java, | & , | | && , || | Boolean |
No comments:
Post a Comment