본문 바로가기
Programing/Knowledge

[CS] Lazy Evaluation

by 꾸압 2022. 11. 23.

 

<설명>

  - 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 을 썼을 때, 무한 자료구조 전체를 쓰지 않고도 일부를 가져올 수 있다.

 


 

<출처 1> https://medium.com/sjk5766/lazy-evaluation%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90-411651d5227b

<출처 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

댓글