January 22, 2008

Lazy Evaluation

프로그램의 초기 구동속도를 높이기 위한 기법으로 lazy evaluation이 언급되어서, 한번 찾아보았다.

lazy evaluation (delayed evaluation) 기능의 수행을 해당 기능이 정말로 필요할 때 까지 미뤄두는 프로그래밍 기법이다. lazy evaluation을 통해 얻을 수 있는 이점은 다음과 같다:

1. 지금 당장 필요 없는 기능의 수행을 하지않음으로 얻어지는 성능 향상
2. 복잡한 expressions의 평가를 피할 수 있음
3. the ability to construct infinite data structures
4. the ability to define control structures as regular functions rather than built-in primitives

lazy evaluation을 사용하는 언어는 evaluation strategy에 따라 call-by-name과 call-by-need로 나뉘어진다. Haskell과 같이 가장 현실적인 lazy languages는 성능 상의 이유로 call-by-need 를 사용하지만, 간편함을 위해 lazy evalution의 이론적인 표현이 call-by-name을 이용하기도 한다.

lazy evaluation의 반대 기법은 eager evaluation (strict evaluation)이다.

Reference: http://en.wikipedia.org/wiki/Lazy_evaluation

몇가지 관련된 자료를 찾아본 바로는, eager evaluation 우리가 일반적으로 사용하는 방식이라고 보면 하다. 예를 들어보자.

int nResult = 10 + 9 - 12 * (3 / 4 + 5)
print nResult
print nReault * 9

위의 예에서 nResult 들어가 값이 eager evaluation에서는 직접 변수에 저장되지만, lazy evaluation에서는 수식이 저장되는 하다. 그래서 실제로 해당 값을 출력할 때와 같이 해당 수식이 계 산 되어야 할 때, 계산이 수행되는 식인 것 같다. 그리고, lazy evaluation은 대부분 functional programming language와 같은 언어에서 주로 사용되는 것 같다. 아직 직접 사용해 보지 않아서 잘은 모르지만, 몇몇 경우 (초기 구동속도를 빠르게 해야 하는 경우)에는 유용하게 사용될 듯 하다.

No comments:

Post a Comment