평가하다
eval일부 프로그래밍 언어에서, English evaluate의 줄임말인 는 문자열을 언어에서 표현인 것처럼 평가하고 결과를 반환하는 함수입니다; 다른 언어에서, 그것은 여러 줄의 코드를 포함하는 줄 대신에 그것들이 포함된 것처럼 실행합니다.eval
. 입력할 내용eval
반드시 문자열일 필요는 없으며, 추상 구문 트리와 같이 구조화된 코드 표현일 수도 있고 (리스프 형태와 같이), 또는 특수 유형일 수도 있습니다.code
(Python에서와 같이).문장에 대한 아날로그는 exec으로 문자열(또는 다른 형식의 코드)을 문장처럼 실행합니다. Python과 같은 일부 언어에서는 둘 다 존재하는 반면 다른 언어에서는 둘 중 하나만 존재합니다.eval
아니면exec
입니다.
평가 및 적용은 언어 자체 내에서 호출할 수 있는 언어의 해석자인 메타 순환 평가자의 인스턴스입니다.[citation needed]
보안 리스크
사용.eval
신뢰할 수 없는 소스의 데이터로 인해 보안 취약점이 발생할 수 있습니다.예를 들어, 다음과 같이 가정할 때get_data()
function은 인터넷에서 데이터를 가져오는데, 이 파이썬 코드는 안전하지 않습니다.
회기중['authentic'] = 거짓의 데이터. = get_data() 푸우 = 평가하다(데이터.)
공격자가 프로그램에 문자열을 제공할 수 있습니다."session.update(authenticated=True)"
데이터로서, 그것은 업데이트 할 것입니다.session
인증된 키를 True로 설정하는 사전.이 문제를 해결하기 위해 사용할 모든 데이터를eval
탈출해야 합니다. 그렇지 않으면 잠재적으로 유해한 기능에 접근하지 않고 실행해야 합니다.
실행
통역된 언어로,eval
는 거의 항상 일반 코드와 동일한 인터프리터로 구현됩니다.컴파일된 언어에서는 프로그램을 컴파일하는 데 사용되는 동일한 컴파일러가 프로그램에 내장될 수 있습니다.eval
function; 별도의 인터프리터가 사용되기도 하지만 코드가 중복되는 경우도 있습니다.
프로그래밍 언어
ECMA스크립트
자바스크립트
자바스크립트에서는.eval
표현식 평가자와 문장 실행자 사이의 혼합물 같은 것입니다.마지막으로 평가한 식의 결과를 반환합니다.
식 평가자로서의 예:
푸우 = 2; 경계심이 있는(평가하다('foo + 2'));
문 실행자의 예:
푸우 = 2; 평가하다('foo = foo + 2; alert(foo)';);
자바스크립트의 한가지 용도eval
JSON 텍스트를 구문 분석하는 것입니다. Ajax 프레임워크의 일부일 가능성이 있습니다.그러나 현대 브라우저는JSON.parse
이 작업에 대한 보다 안전한 대안으로.
액션스크립트
액션스크립트(Flash의 프로그래밍 언어)에서,eval
임의 식을 평가하는 데 사용할 수 없습니다.플래시 8 설명서에 따르면 사용은 "검색할 변수, 속성, 개체 또는 동영상 클립의 이름"을 나타내는 표현으로 제한됩니다.이 매개 변수는 String일 수도 있고 개체 인스턴스에 대한 직접적인 참조일 수도 있습니다."[1]
액션스크립트 3은 evalu를 지원하지 않습니다.
ActionScript 3 Eval Library와[2] D.eval[3] API는 다음과 같은 것들을 만들기 위한 개발 프로젝트였습니다.eval
액션스크립트 3에서.Adobe Flash Player의 수명이 다함에 따라 두 가지 모두 종료되었습니다.
리스프
리스프는 원래의 언어를 사용했습니다.eval
1958년에 활동을 시작합니다.사실, 그의 정의는eval
function은 언어 해석기의 첫번째 구현으로 이어졌습니다.[4]그전에eval
함수를 정의하고 Lisp 함수를 어셈블리 언어 문에 수동으로 컴파일했습니다.하지만 한번은.eval
함수는 수동으로 컴파일된 후 최초의 리스프 인터프리터의 기초를 형성한 간단한 읽기-평가-인쇄 루프의 일부로 사용되었습니다.
리스프의 이후 버전eval
함수 또한 컴파일러로 구현되었습니다.
그eval
Lisp의 함수는 인수로 평가되고 실행되는 양식을 기대합니다.지정된 양식의 반환 값은 다음으로 호출한 것의 반환 값이 될 것입니다.eval
.
다음은 리스프 코드의 예시입니다.
; 1, 2, 3을 인수로 하여 + 함수를 호출하는 형식입니다. ; 6번 돌아옵니다. (+ 1 2 3) ; 리스판에서는 어떤 형태든 평가되어야 하기 때문에, ; +로 호출이 수행되었습니다. ; 우리는 리스프가 평가를 하는 것을 막을 수 있습니다. ; 예를 들어, ""로 앞에 붙임으로써 형식의. (setq 양식1 '(+ 1 2 3)) ; 이제 form1은 eval에 의해 사용될 수 있는 양식을 포함합니다. ; 예: (평가하다 양식1) ; 평가(+1 2 3)하여 6을 반환했습니다.
리스프는 매우 유연한 것으로 잘 알려져 있습니다.eval
기능.예를 들어, 문자열의 내용을 평가하려면 먼저 문자열을 Lisp 형태로 변환해야 합니다.read-from-string
함수와 결과 형태는 다음으로 전달되어야 할 것입니다.eval
:
(평가하다 (현에서 읽은 "(format t \"Hello World!!!~%\")"))
가장 큰 혼란의 한 가지 점은 어떤 맥락에서 형태의 기호를 평가할 것인가 하는 문제입니다.위의 예에서,form1
기호를 포함+
. 이 기호를 평가하면 예제가 의도한 대로 작동하도록 추가하기 위한 함수가 산출되어야 합니다.따라서 리스프의 몇몇 방언들은 다음에 대한 추가적인 매개변수를 허용합니다.eval
평가의 컨텍스트를 지정합니다(Python의 선택적 인수와 유사함).eval
함수 - 아래 참조).리스프의 스킴 방언(RRS5 이상)의 예:
;; 위의 예제와 같이 간단한 양식을 정의합니다. (정의를 내리다 양식2 '(+ 5 2)) ;값: 양식2 ;; 초기 컨텍스트 내에서 양식을 평가합니다. ;; 평가를 위한 컨텍스트는 Scheme 은어로 "환경"이라고 불립니다. (평가하다 양식2 사용자-initial-환경) ;값: 7 ;; 초기 환경을 혼란스럽게 하면 +는 ;; 뺄셈 함수의 이름 (환경- 사용자-initial-환경 '+ -) ;값: + ;; 양식을 다시 평가합니다. ;; 반환된 값이 변경되었습니다. (평가하다 양식2 사용자-initial-환경) ;값: 3
펄
펄에서,eval
함수는 식 평가자와 식 실행자 사이의 혼합물입니다.마지막으로 평가된 식(모든 문은 Perl 프로그래밍의 식)의 결과를 반환하고, 마지막 세미콜론은 생략할 수 있습니다.
식 평가자로서의 예:
$foo = 2; 활자로 찍어내다 평가하다('$foo + 2'), "\n";
문 실행자의 예:
$foo = 2; 평가하다('$foo += 2; "$foo\n"을(를) 인쇄합니다.');
펄은 또한eval
예외 처리 메커니즘 역할을 하는 블록(Exception handling syntax#Perl 참조).이것은 위의 사용과 다릅니다.eval
그 코드 안에 줄이 들어있는eval
blocks는 런타임 대신 컴파일 타임에서 해석되므로 다음과 같은 의미는 아닙니다.eval
이 기사에서 사용됩니다.
PHP
PHP에서,eval
코드를 실행하는 것은 마치 파일에 입력된 것처럼 거의 정확하게 문자열에 저장합니다.eval()
. 유일한 예외는 에 대한 호출에서 오는 오류로 보고된다는 것입니다.eval()
, 반환문은 함수의 결과가 됩니다.
일부 언어와 달리 논쟁은eval
단순한 표현이 아닌 하나 이상의 완전한 문장의 문자열이어야 합니다. 그러나 "express온" 형태를 얻을 수 있습니다.eval
그 표현을 답례문에 넣음으로써.eval
그 표현의 결과를 돌려주는 것입니다.
일부 언어와 달리 PHP의eval
는 함수가 아닌 "언어 구성"이므로 [5]고차 함수와 같이 함수가 될 수 있는 일부 컨텍스트에서는 사용할 수 없습니다.
에코 사용 예:
<? $foo = "안녕, 세상이여!\n"; 평가하다('echo "$foo";); ?>
값 반환 예제:
<? $foo = "잘 가렴, 세상이여!\n"; //PHP5에서 작동하지 않음 메아리를 치다 평가하다('$foo를 반환합니다.'); ?>
루아
루아 5.1에서.loadstring
루아 코드를 익명 함수로 컴파일합니다.
식 평가자로서의 예:
하중 끈("print('Hello World!')")()
두 단계로 평가를 수행하는 예:
a = 1 f = 하중 끈("a + 1을 반환합니다.) -- 그 표현을 익명 함수로 편집합니다. 활자로 찍어내다(f()) -- 실행(결과 '2' 출력)
루아 5.2 감가상각loadstring
기존의 것에 찬성하여load
문자열을 허용하도록 강화된 함수입니다.뿐만 아니라, 현재는 환경이 상향식이기 때문에 기능의 환경을 직접 제공할 수 있습니다.
짐을 싣다("print('Hello' ... a)", "", "t", { a = "세상에!", 활자로 찍어내다 = 활자로 찍어내다 })()
포스트스크립트
포스트스크립트exec
연산자는 연산자를 취합니다. 간단한 리터럴이면 연산자를 다시 스택에 밀어 넣습니다.그러나 PostScript 식을 포함하는 문자열을 선택하면 문자열을 실행 파일로 변환할 수 있습니다. 예를 들어 다음과 같이 인터프리터가 실행할 수 있습니다.
((Hello World) =) cvx 중역
PostScript 식을 변환합니다.
(헬로 월드) =
스택에서 "Hello World"라는 문자열을 팝업하여 화면에 표시하여 실행 가능한 유형을 가진 다음 실행됩니다.
포스트스크립트run
operator는 기능적으로 비슷하지만 대신 인터프리터는 PostScript 식들을 파일 자체에서 해석합니다.
(file.ps ) 달려.
파이썬
파이썬에서.eval
가장 간단한 형태의 함수는 하나의 식을 평가합니다.
eval
예제(인터랙티브 셸):
>>>x = 1 >>>평가하다('x + 1') 2 >>>평가하다(x') 1
그eval
function은 두 개의 선택적 인수를 사용합니다.global
그리고.locals
, 이것은 프로그래머가 식의 평가를 위해 제한된 환경을 설정할 수 있게 해줍니다.
그exec
성명서(혹은 더)exec
(Python 3.x의 function)은 다음과 같은 문을 실행합니다.
exec
예제(인터랙티브 셸):
>>>x = 1 >>>y = 1 >>>중역 "x += 1; y -= 1" >>>x 2 >>>y 0
문/식을 평가하는 가장 일반적인 형식은 코드 개체를 사용하는 것입니다.이들은 다음을 호출하여 생성할 수 있습니다.compile()
함수와 컴파일해야 할 입력의 종류를 알려줌으로써: a"exec
" 성명서, "eval
" 성명서 또는 "single
" 문:
compile
예제(인터랙티브 셸):
>>>x = 1 >>>y = 2 >>>평가하다 (집대성하다 ("인쇄 'x + y =', x + y", compile-sample.py, "싱글")) x + y = 3
D
D는 정적으로 컴파일된 언어이므로 "를 포함하지 않습니다.eval
" 전통적인 의미의 진술, 그러나 관련된 것을 포함합니다."mixin
" 성명서다른 점은, 어디서"eval
" 실행 시 문자열을 코드로 해석합니다.mixin
" 문자열은 일반적인 코드처럼 정적으로 컴파일되며 컴파일 시에 알아야 합니다.예를 들어,
수입품 std.stdio; 공허한 주된() { 인트 숫자를 = 0; 섞다("num++;"); 휘갈겨 쓴(숫자를); // 프린트 1. }
위의 예는 "와 같이 정확히 동일한 어셈블리 언어 명령어로 컴파일됩니다.num++;
" 섞이지 않고 직접 적었습니다.mixin 인수는 문자열 리터럴일 필요는 없지만 함수 호출을 포함한 문자열 값을 생성하는 임의의 식일 필요는 없으며 컴파일 시 평가할 수 있습니다.
콜드퓨전
콜드퓨전스evaluate
함수를 사용하면 런타임에 문자열 식을 평가할 수 있습니다.
<cfset x = "int(1+1)"> <cfset y = 평가하다(x)>
이 기능은 읽기 원하는 변수를 프로그램적으로 선택해야 할 때 특히 유용합니다.
<cfset x = 평가하다("query 이름.#열명#[행 번호]")>
루비
루비 프로그래밍 언어 통역사는 다음을 제공합니다.eval
기능은 Python 또는 Perl과 유사하며 스코프 또는 바인딩을 지정할 수도 있습니다.
함수의 바인딩을 명시하는 것 외에,eval
특정 클래스 정의 바인딩 또는 개체 인스턴스 바인딩 내의 식을 평가하는 데 사용할 수도 있으므로 문자열에 지정된 새 메서드를 사용하여 클래스를 확장할 수 있습니다.
a = 1 평가하다('a + 1') # (evaluates에서 2까지) # 상황 내에서 평가하기 데프 get_binding(a) 구속력이 있는 끝. 평가하다('a+1',get_binding(3)) # (get_binding의 문맥에서 'a'는 3이므로 4까지 evaluates)
학급 시험; 끝. 시험.class_eval("def hello; 'hello'를 반환합니다; end") # 이 클래스에 메서드 'hello'를 추가합니다. 시험.신규.안녕하세요. # 평가를 "안녕하세요"로 합니다.
네번째
포스의 대부분의 표준 구현은 다음의 두 가지 변형을 가지고 있습니다.eval
:EVALUATE
그리고.INTERPRET
.
Win32FORTH 코드 예제:
S" 2 2 + ." 평가하다 \ 출력 "4"
기본의
REAL 베이직
REALbasic에는 RBScript라는 클래스가 있으며, 실행 시 REALbasic 코드를 실행할 수 있습니다.RBScript는 매우 샌드박스화되어 있으며, 가장 핵심적인 언어 기능만 제공되므로 원하는 것에 액세스할 수 있도록 해야 합니다.컨텍스트 속성에 개체를 선택적으로 할당할 수 있습니다.이렇게 하면 RBScript의 코드가 함수를 호출하고 컨텍스트 개체의 속성을 사용할 수 있습니다.그러나 여전히 가장 기본적인 유형만 이해하는 것으로 제한되어 있기 때문에 사전이나 MySpifyObject를 반환하는 기능이 있으면 RB스크립트를 사용할 수 없습니다.인쇄 및 입력 이벤트를 통해 RB 스크립트와 통신할 수도 있습니다.
VB스크립트
통역 언어인 마이크로소프트의 VB스크립트는 두 가지 구성 요소가 있습니다.Eval
는 사용자 정의 함수에 대한 호출을 포함할 수 있는 함수 평가자입니다.(이러한 함수는 전역 변수의 값을 변경하는 등의 부작용이 있을 수 있습니다.)Execute
전역 상태를 변경할 수 있는 하나 이상의 콜론 구분 문을 실행합니다.
VB스크립트와 J스크립트 모두eval
컴파일된 Windows 응용 프로그램(Eval을 지원하지 않는 언어로 작성됨)의 개발자는 Microsoft Script Control이라는 ActiveX 컨트롤을 통해 Eval 메서드를 응용 프로그램 코드로 호출할 수 있습니다.사용자 정의 함수의 호출을 지원하려면 먼저 AddCode 메서드로 컨트롤을 초기화해야 합니다. AddCode 메서드는 선택한 언어로 정의된 사용자 정의 함수 라이브러리를 포함하는 문자열(또는 문자열 리소스)을 로드한 다음 Eval을 호출합니다.
애플리케이션용 비주얼 베이직
Microsoft Office의 프로그래밍 언어인 VBA(Visual Basic for Applications)는 런타임 환경이 p-code를 컴파일하고 실행하는 가상 머신 언어입니다.Eval의 맛은 식 평가만 지원하며, 식에는 사용자 정의 함수 및 객체(사용자 정의 변수 이름은 포함되지 않음)가 포함될 수 있습니다.특히 평가자는 VBS와 다르며, 특정 사용자 정의 함수의 호출은 VBA에서 VBScript의 동일한 코드와 다르게 작동할 수 있습니다.
잡담
Smalltalk의 컴파일러 클래스는 표준 클래스 라이브러리의 일부이며 보통 런타임에 제공되므로 코드 문자열을 평가하는 데 사용할 수 있습니다.
컴파일러 평가:'1 + 2'
클래스 및 메서드 정의는 메시지 전송(클래스 개체로)을 통해 구현되기 때문에 코드 변경도 가능합니다.
컴파일러 평가:'개체 하위 클래스:#Foo'
Tcl
Tcl 프로그래밍 언어에는 다음과 같은 명령이 있습니다.eval
, 인수로 제공된 소스 코드를 실행합니다.Tcl은 모든 소스 코드를 문자열로 나타내고, 인수가 다음과 같이 따옴표 역할을 합니다.eval
다른 소스 코드와 동일한 형식을 가질 수 있습니다.
{[incri]<10} {puts "$i 제곱은 [expr $i*$i]"} 평가 $foo인 동안 설정
bs
bs는.eval
문자열 인수 하나를 사용하는 함수입니다.함수는 식 계산기이면서 문장 실행기입니다.후자의 역할에서는 오류 처리에도 사용할 수 있습니다.다음 예제와 텍스트는bs
UNIX System V Release 3.[6]2 Programmer's Manual에 나와 있는 것과 같은 man page.
string 인수는 다음과 같이 평가됩니다.
bs
표현.이 함수는 숫자 문자열을 숫자 내부 형태로 변환하는 데 유용합니다.eval
다음과 같이 조잡한 형태의 지시로도 사용할 수 있습니다. (참고:bs
,_
(밑줄)은 연결 연산자입니다.):name = "xyz" eval ("++" _ name)이것은 변수를 증가시킵니다.
xyz
.게다가.
eval
심문 조작자에 앞서서?
, 사용자가 제어할 수 있도록 합니다.bs
오차 조건예를 들어,?eval("open(\"X\", \"XXX\", \"r\"))사용자의 프로그램을 중지하는 대신 "XXX"라는 이름의 파일이 없는 경우 값 0을 반환합니다.
다음은 A를 실행합니다.
goto
꼬리표에 꼬리표까지L
(존재하는 경우):label = if ! (?eval (" go to " _ label )) 퍼터 = "label 없음"
명령줄 인터프리터
유닉스 셸
eval 명령어는 원래 "sh"(본 셸)를 포함한 모든 유닉스 셸에 존재합니다.모든 인수를 공백으로 연결한 다음 결과를 다시 구문 분석하여 명령으로 실행합니다.– FreeBSD 일반 명령 매뉴얼
윈도우 파워쉘
Windows PowerShell에서Invoke-Expression
Cmdlet은 자바스크립트, PHP, 파이썬과 같은 프로그래밍 언어에서 eval 함수와 같은 목적으로 사용됩니다.Cmdlet은 문자열 형태의 명령 매개 변수로 제공되는 모든 Windows PowerShell 식을 실행하고 지정된 식의 결과를 출력합니다.일반적으로 Cmdlet의 출력은 식을 실행한 결과와 같은 유형입니다.그러나 결과가 빈 배열이면 출력됩니다.$null
. 결과가 단일 요소 배열인 경우 해당 단일 요소를 출력합니다.자바스크립트와 마찬가지로 윈도우 파워쉘은 마지막 세미콜론을 생략할 수 있게 해줍니다.
식 평가자로서의 예:
PS >$foo = 2 PS >호출 express온 '$foo + 2'
문 실행자의 예:
PS >$foo = 2 PS >호출 express온 '$foo += 2; $foo'
마이크로코드
1966년 IBM CPS(Conversational Programming System)는 마이크로프로그래밍 기능을 도입하였습니다.EVAL
IBM System/360 Model 50에서 "수정된 폴란드 문자열 표기법으로 작성된 표현식의 해석적 평가"를 수행합니다.[7]이 함수를 마이크로코딩하는 것은 할당 문장을 해석하는 프로그램에 비해 "상당히" 5배 이상 빨랐습니다.[8]
이론.
이론 컴퓨터 과학에서, 평가와 적용 사이에 신중한 구분이 일반적으로 내려집니다.eval은 따옴표를 붙인 문자열을 호출 가능한 함수와 그 인수로 변환하는 단계로 이해되는 반면 apply는 주어진 인수 집합을 가진 함수의 실제 호출입니다.특히 기능 언어와 LISP 및 Scheme과 같은 람다 미적분학 기반 언어에서 구별이 두드러집니다.따라서, 예를 들어, 스킴(Scheme)에서 다음과 같은 구분이 있습니다.
(평가하다 '(f x) )
(fx) 형식을 평가해야 하는 곳, 그리고
(적용합니다. f (목록. x))
여기서 함수 f는 인수 x와 함께 호출됩니다.
평가 및 적용은 SICP에서 설명하는 리스프 평가의 핵심인 평가 적용 주기의 두 가지 상호 의존적인 구성 요소입니다.[9]
범주 이론에서, 이벨모피즘은 닫힌 모노이드 범주를 정의하는 데 사용됩니다.따라서, 예를 들어, 함수를 형태소로, 데카르트 곱을 곱으로 하는 집합의 범주는 데카르트 닫힌 범주를 형성합니다.여기서 오른쪽 인접인 카레링과 함께 평가(또는 적절하게 말하면 적용)하여 간단히 유형화된 람다 미적분학을 형성합니다. 이는 데카르트 닫힌 범주의 형태로 해석할 수 있습니다.
참고문헌
- ^ "Flash 8 LiveDocs". 2006-10-10. Archived from the original on 2006-10-10.
- ^ 액션스크립트 3 이벨 라이브러리
- ^ "The D.eval API". Archived from the original on 2013-03-14.
- ^ 존 매카시, "리스프의 역사 - 리스프의 구현"
- ^ "PHP: eval - Manual". PHP.net. Retrieved 2015-09-10.
- ^ "Volume 1 Commands and Utilities". UNIX Programmer's Manual (PDF). AT&T. 1986. p. 41.
- ^ Allen-Babcock. "Draft EVAL Microprogram" (PDF). Bitsavers.org. Retrieved Jan 17, 2016.
- ^ Rochester, Nathaniel. "Conversational Programming System Progress Report" (PDF). Bitsavers.org. Retrieved Jan 17, 2016.
- ^ 메타순환 평가자(SICP 섹션 4.1)