Thursday, May 9, 2013

Short-Circuit Evaluation

Lazy evaluation과는 다르다, Lazy evaluation과는!

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이다. (당연한가?)
Boolean operators in various languages
LanguageEager operatorsShort-circuit operatorsResult type
ABAPnoneandorBoolean1
AdaEiffelandorand thenor elseBoolean
ALGOL 68and, &, ∧ ; or, ∨andf , orf (both user defined)Boolean
C2none&&||?[1]Numeric (&&,||), opnd-dependent (?)
C++3&|&&||?[2]Boolean (&&,||), opnd-dependent (?)
GoOCamlHaskellnone&&||Boolean
C#Java, &|&&||Boolean



No comments:

Post a Comment

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled   MyForm w = new MyForm IntPtr handle = wnd.Handle;   // Exception occurs here class MyFo...