<설명>
- Compiler 는 보통 Expression(값을 도출하는 코드, ex:1+2) 를 만나면 그 값을 Evaluation(연산) 함.
==> 대부분의 언어에선 Expression을 만나면 즉시 Evaluation 하나, 함수가 전달된 Parameter를 쓰지 않는 경우엔 Compiler가 굳이 Evaluation 할 필요 없음.
==> 그런 이유로 Parameter 등이 필요할 때만 쓰는 방식이 Lazy Evaluation.
==> 주로 함수형 언어(Haskell, Python) 에서 많이 쓰이는걸로 보임.
- 요약 : Expression에 값이 필요할 때까지 연산을 hold 하는 것.
- 반복 연산 안 함. (list 형태의 parameter 중에서 원하는 것만 가져오기, list 전체 호출 말고)
<장점>
- Computation Process를 최적화함. Big Data 연산 엔진인 Spark 가 이걸 핵심으로 씀.
- 언어 Runtime이 Expression의 최종 결과와 직접 연결이 없는 Sub-Expression 을 버릴 수 있게 함.
- 임시 Computation(연산)과 Condition을 버려, Algorithm의 시간 복잡도를 줄임.
- Data 구조의 Component가 Circular Dependecies (순환 참조)에서 자유롭다면, Programmer가 그 Component를 초기화한 뒤 비순차적으로 액세스할 수 있게 함.
- 간헐적으로 접근되는 Loading Data 에 매우 잘 맞음.
- Code 를 부분 Module 로 만들기 가능.
<약점>
- Thunk를 생성함으로써, 최종 결과에 필요할 때까지 언어 Runtime가 Sub-Expression의 Evaluation을 hold하도록 강제함.
- 모든 Instruction(Operation)을 저장해야해서 Algorithm 의 공간 복잡도를 증가시킬 수 있음. (높은 확률로)
- Execution 이전에 Expression의 Thunk를 가지기에, 성능을 찾기 매우 어렵다.
- Programmer가 Program의 실행 제어를 못 하므로 Bug 찾는게 까다로울 수 있음.
- 일반적인 코딩 방식과는 대조되므로 Hard-Coding 해야함.
[활용_1]
- 아래에 무한 재귀 Code가 있다.
def addOne(n):
[n] + addOne(n + 1);
list = addOne(1); // [1, 2, 3, 4, 5, 6, ---]
==> 위 구조에서 보통의 Compiler는 해당 Function을 호출시, 메모리 부족으로 문제 발생.
==> Lazy Evaluation은 Recursive 의 모든 Depth를 계산하지 않고, 현재 실행되는 Depth만 연산하기에 문제 발생 X.
[활용_2]
- 위의 무한 재귀 Code인 list 를 다시 예시로 보자
oneToThree = list.takeFirst(3);
print(oneToThree); // [1, 2, 3]
print( range(5,10) ); // [5, 6, 7, 8, 9]
==> Print 문을 보면 Lazy Evaluation 을 썼을 때, 무한 자료구조 전체를 쓰지 않고도 일부를 가져올 수 있다.
<출처 2> https://www.tutorialspoint.com/functional_programming/functional_programming_lazy_evaluation.htm#
<출처 3> https://www.geeksforgeeks.org/scala-lazy-evaluation/
<출처 4>
'Programing > Knowledge' 카테고리의 다른 글
[CS] Thunk (0) | 2022.11.26 |
---|---|
[CS] Computation (0) | 2022.11.24 |
[CS] Invoke & Call & Trigger 차이 (0) | 2022.11.21 |
[CS] Transparancy (0) | 2022.11.19 |
댓글