Eval

eval 함수는 일부 프로그래밍 언어에서 제공하는 함수의 일종이다. 문자열을 입력 받아 그 문자열을 expression으로 처리한 후 결과값을 반환하는 함수이다. eval에 대한 입력은 반드시 문자열일 필요는 없다. 추상 구문 트리(리스프 형식과 같은) 또는 코드(파이썬과 같은)와 같은 특수 유형의 구조화된 코드 표현일 수 있다. 명령문과 유사한 것은 exec로, 마치 명령문인 것처럼 문자열(또는 다른 형식의 코드)을 실행한다. 파이썬과 같은 일부 언어에서는 둘 다 존재하지만 다른 언어에서는 eval 또는 exec 중 하나만 존재한다.

eval 및 apply는 언어 자체 내에서 호출할 수 있는 언어 해석기인 메타 순환 평가기(meta-circular evaluators)의 인스턴스이다.

 보안 위험 
신뢰할 수 없는 장소로부터 온 데이터에 eval을 사용할 때는 특별히 주의해야 한다. 이를테면, get_data() 함수는 인터넷으로부터 데이터를 가져온다고 할 때, 이 파이썬 코드는 안전하지 않다:
session['authenticated'] = False
data = get_data()
foo = eval(data)
공격자가 프로그램에 "session.update(authenticated=True)" 문자열을 데이터로 공급하면 session 디렉터리를 업데이트하여 인증 키를 True로 설정한다. 이를 해결하려면 eval을 사용하는 모든 데이터를 회피하거나 잠재적으로 유해한 기능에 대한 접근이 없는 상태에서 실행하여야 한다.

 프로그래밍에서의 이용 
 PHP 
$name = 'John Doe';
$greeting = 'Hello';
$template = '"$greeting,  $name! How can I help you today?"';
print eval("return $template;");

 자바스크립트 
이때의 결과는 12+34의 결과인 46으로 alert창이 뜨게 된다.foo = 12+34;
alert(eval(foo));

 펄 
$foo = 2;
print eval('$foo + 2'), "\n";

 루비 
a = 1
eval('a + 1') #  (evaluates to 2)

# evaluating within a context
def get_binding(a)
  binding
end
eval('a+1',get_binding(3)) # (evaluates to 4, because 'a' in the context of get_binding is 3)

 외부 링크 
  ANSI and GNU Common Lisp Document: eval function
  Python Library Reference: eval built-in function
  Jonathan Johnson on exposing classes to RBScript

분류:제어 흐름