WIPIVERSE

평가 전략 (컴퓨터 프로그래밍)

평가 전략은 컴퓨터 프로그래밍, 특히 프로그래밍 언어의 실행 모델에서 사용되는 용어로, 함수 호출이나 표현식이 언제, 어떻게 계산되는지를 정의하는 규칙을 의미한다. 이 개념은 프로그램의 실행 순서, 메모리 사용, 성능, 그리고 사이드 이펙트(부수 효과)의 발생 시점에 직접적인 영향을 미친다.

주요 유형

유형 핵심 특징 대표 언어(예)
엄격(eager) 평가 / 엄격 호출 방식 (strict evaluation) 표현식의 인자를 함수에 전달하기 전에 즉시 계산한다. C, Java, Python(기본)
느긋(lazy) 평가 / 지연 호출 방식 (non‑strict evaluation) 인자를 필요할 때만 계산한다(요구에 따라). Haskell, Miranda
값에 의한 호출 (call‑by‑value) 인자를 복사된 값으로 전달한다. 계산은 호출 전(엄격) 혹은 호출 시(느긋) 수행될 수 있다. C, Java(기본)
참조에 의한 호출 (call‑by‑reference) 인자의 메모리 주소를 전달하여, 함수 내부에서 원본을 직접 수정한다. C++(레퍼런스), Pascal
이름에 의한 호출 (call‑by‑name) 인자를 텍스트 매크로처럼 전달하여, 호출 시마다 다시 평가한다. Algol 60, 일부 함수형 언어 구현
필요에 의한 호출 (call‑by‑need) call‑by‑name과 유사하지만, 한 번 평가된 결과를 캐시하여 이후 재사용한다(느긋 평가의 최적화 형태). Haskell(기본)

평가 전략의 영향

  1. 성능

    • 엄격 평가는 메모리와 CPU 자원을 미리 소비하므로, 부바닐(부수 효과) 없는 순수 함수에서는 빠른 실행이 가능하다.
    • 느긋 평가는 불필요한 계산을 회피해 메모리 사용을 절감하고, 무한 자료 구조(예: 무한 리스트)를 다룰 수 있게 한다.
  2. 꼬리 재귀 최적화

    • 엄격 언어에서는 꼬리 호출이 스택 오버플로를 방지하도록 최적화되는 경우가 많다.
    • 느긁 언어에서는 지연된 연산이 누적되어 메모리 사용량이 증가할 위험이 있다.
  3. 부수 효과와 순서

    • 부수 효과(예: I/O, 전역 변수 변경)가 있는 언어에서는 평가 시점이 프로그램의 동작을 결정한다.
    • 엄격 평가는 부수 효과가 예측 가능한 순서대로 발생하도록 보장한다.
  4. 컴파일러와 인터프리터 설계

    • 평가 전략에 따라 중간 코드 생성 방식, 가비지 컬렉션 전략, 최적화 패스가 달라진다.
    • 예를 들어, Haskell 컴파일러(GHC)는 지연 평가를 지원하기 위해 thunk(Thunk)라는 래퍼 구조를 사용한다.

역사적 배경

  • Algol 60(1960년대 초)에서 “call‑by‑name”이 최초로 제시되었으며, 이후 LISP(1960년대)와 ML(1970년대) 등에서 다양한 평가 전략이 실험되었다.
  • 1970년대 후반부터는 함수형 언어에서 지연 평가(lazy evaluation)가 핵심 설계 원리로 채택되었으며, 1990년대 Haskell이 이를 표준화하였다.

용어의 어원

  • 평가(評價): ‘값을 매기다’, ‘연산 결과를 산출하다’는 의미의 한자어. 프로그래밍에서는 표현식이나 함수 호출의 결과를 “평가한다”고 표현한다.
  • 전략(戰略): ‘목표 달성을 위한 계획·방법’이라는 의미로, 여기서는 계산 방법을 선택하는 “전략”을 뜻한다.

따라서 평가 전략은 “표현식이나 함수 호출을 언제, 어떻게 계산할지를 정의하는 전략”이라는 의미로, 프로그래밍 언어 설계 및 구현에서 핵심적인 개념이다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기