~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 0E6DA44ED52E4784D8822A23C2A32698__1709260620 ✰
Заголовок документа оригинал.:
✰ eval - Wikipedia ✰
Заголовок документа перевод.:
✰ оцен — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Eval ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/0e/98/0e6da44ed52e4784d8822a23c2a32698.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/0e/98/0e6da44ed52e4784d8822a23c2a32698__translat.html ✰
Дата и время сохранения документа:
✰ 20.06.2024 07:59:01 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 1 March 2024, at 05:37 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

оцен — Википедия Jump to content

оценивать

Из Википедии, бесплатной энциклопедии

В некоторых программирования языках eval, сокращение от английского Assessment , — это функция , которая оценивает строку, как если бы она была выражением на языке, и возвращает результат ; в других случаях он выполняет несколько строк кода, как если бы они были включены вместо строки, включающей eval. Вход в evalне обязательно является строкой; это может быть структурированное представление кода, такое как абстрактное синтаксическое дерево (например, формы Lisp ), или специального типа, например code(как в Python). Аналогом оператора является exec , который выполняет строку (или код в другом формате), как если бы это был оператор; в некоторых языках, таких как Python, присутствуют оба, тогда как в других языках только один из них. eval или exec является.

Eval и apply — это экземпляры метациклических оценщиков , интерпретаторов языка, которые можно вызывать внутри самого языка. [ нужна цитата ]

Риски безопасности [ править ]

С использованием evalИспользование данных из ненадежного источника может привести к уязвимостям безопасности. Например, если предположить, что get_data() функция получает данные из Интернета, этот код Python небезопасен:

сеанс  [  'аутентифицированный'  ]   =   Ложные 
 данные   =   get_data  () 
 foo   =   eval  (  данные  ) 

Злоумышленник может передать программе строку "session.update(authenticated=True)" в качестве данных, которые будут обновлять sessionсловарь, чтобы установить для аутентифицированного ключа значение True. Чтобы исправить это, все данные, которые будут использоваться с eval необходимо экранировать или запускать без доступа к потенциально опасным функциям.

Реализация [ править ]

В интерпретируемых языках evalпочти всегда реализуется с помощью того же интерпретатора, что и обычный код. В компилируемых языках тот же компилятор, который используется для компиляции программ, может быть встроен в программы с помощью evalфункция; иногда используются отдельные интерпретаторы, однако это приводит к дублированию кода .

Языки программирования [ править ]

ECMAScript [ править ]

JavaScript [ править ]

В JavaScript , evalявляется чем-то вроде гибрида между оценщиком выражений и исполнителем операторов. Он возвращает результат последнего вычисленного выражения.

Пример в качестве средства оценки выражений:

Фу   =   2  ; 
  предупреждение  (  eval  (  'foo + 2'  )); 

Пример в качестве исполнителя оператора:

Фу   =   2  ; 
  eval  (  'foo = foo + 2;alert(foo);'  ); 

Одно из применений JavaScript evalзаключается в анализе текста JSON , возможно, как части Ajax- фреймворка. Однако современные браузеры предоставляют JSON.parse как более безопасная альтернатива для этой задачи.

ActionScript [ править ]

В ActionScript (языке программирования Flash) evalне может использоваться для вычисления произвольных выражений. Согласно документации Flash 8, его использование ограничено выражениями, которые представляют собой «имя переменной, свойства, объекта или фрагмента ролика, который необходимо получить. Этот параметр может быть либо строкой, либо прямой ссылкой на экземпляр объекта». [1]

ActionScript 3 не поддерживает eval.

Библиотека оценки ActionScript 3 [2] и API D.eval [3] были проектами развития по созданию эквивалентов eval в ActionScript 3. Оба варианта завершились, поскольку срок службы Adobe Flash Player подошел к концу .

Лисп [ править ]

Lisp был оригинальным языком, в котором использовалась eval функцию в 1958 году. Фактически, определение eval функция привела к первой реализации языкового интерпретатора. [4] Перед evalфункция была определена, функции Lisp были вручную скомпилированы в операторы языка ассемблера . Однако, как только eval Функция была скомпилирована вручную, а затем использовалась как часть простого цикла чтения-оценки-печати , который лег в основу первого интерпретатора Лиспа.

Более поздние версии Лиспа eval функции также были реализованы в виде компиляторов.

The evalФункция в Лиспе ожидает, что форма будет оценена и выполнена в качестве аргумента. Возвращаемое значение данной формы будет возвращаемым значением вызова eval.

Это пример кода на Лиспе:

;   Форма, вызывающая функцию + с числами 1,2 и 3 в качестве аргументов. 
  ;   Он возвращает 6. 
 (  +   1   2   3  ) 
 ;   В Лиспе любая форма предназначена для оценки, поэтому 
 ;   был выполнен вызов +. 
  ;   Мы можем запретить Lisp выполнять оценку 
 ;   формы, добавив к ней префикс «'», например: 
 (  setq   form1   '  (  +   1   2   3  ) ) 
 ;   Теперь form1 содержит форму, которую может использовать eval, для 
 ;   пример: 
 (  eval   form1  ) 
 ;   eval вычислил (+ 1 2 3) и вернул 6. 

Лисп, как известно, очень гибок, как и evalфункция. Например, чтобы оценить содержимое строки, ее сначала необходимо преобразовать в форму Lisp с помощью read-from-string функцию, а затем полученную форму необходимо будет передать в eval:

(  eval   (  read-from-string   "(format t \"Hello World!!!~%\")"  )) 

Одним из основных вопросов, вызывающих путаницу, является вопрос, в каком контексте будут оцениваться символы в форме. В приведенном выше примере form1 содержит символ +. Оценка этого символа должна дать функцию для сложения, чтобы пример работал так, как задумано. Таким образом, некоторые диалекты Лиспа допускают дополнительный параметр для eval чтобы указать контекст оценки (аналогично необязательным аргументам Python evalфункция – см. ниже). Пример на диалекте Scheme Лиспа (R 5 РС и позже):

;;   Определите некоторую простую форму, как в приведенном выше примере. 
  (  define   form2   '  (  +   5   2  )) 
 ;Значение: form2 

 ;;   Оцените форму в исходном контексте. 
  ;;   Контекст для оценки на сленге Scheme называется «средой». 
  (  eval   form2   user-initial-environment  ) 
 ;Значение: 7 

 ;;   Перепутайте исходное окружение, чтобы + было 
 ;;   имя функции вычитания. 
  (  среда-определить   пользовательскую-начальную-среду   '+   -  ) 
 ;Значение: + 

 ;;   Оцените форму еще раз. 
  ;;   Обратите внимание, что возвращаемое значение изменилось. 
  (  eval   form2   пользовательская начальная среда  ) 
 ; Значение: 3 

Перл [ править ]

В Перле evalФункция — это что-то вроде гибрида между оценщиком выражений и исполнителем операторов. Он возвращает результат последнего вычисленного выражения (все операторы являются выражениями в программировании на Perl) и позволяет опустить последнюю точку с запятой.

Пример в качестве средства оценки выражений:

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

Пример в качестве исполнителя оператора:

$фу   =   2  ; 
  eval  (  '$foo += 2; print "$foo\n";'  ); 

В Perl также есть eval blocks , который служит механизмом обработки исключений (см. Синтаксис обработки исключений#Perl ). Это отличается от приведенного выше использования eval со строками в этом коде внутри eval блоки интерпретируются во время компиляции, а не во время выполнения, поэтому это не означает eval используется в этой статье.

PHP [ править ]

В PHP , eval выполняет код в строке почти точно так, как если бы он был помещен в файл вместо вызова eval(). Единственным исключением является то, что ошибки сообщаются как возникшие в результате вызова eval(), а операторы return становятся результатом функции.

В отличие от некоторых языков, аргумент evalдолжна быть строкой, состоящей из одного или нескольких полных операторов, а не только выражений; однако можно получить форму «выражения» eval поместив выражение в оператор возврата, что приводит к eval чтобы вернуть результат этого выражения.

В отличие от некоторых языков, PHP eval является «языковой конструкцией», а не функцией, [5] и поэтому не может использоваться в некоторых контекстах, где могут быть функции, например функции более высокого порядка.

Пример использования эха:

<?php 
 $foo   =   "Привет, мир!  \n  "  ; 
  eval  (  'echo "$foo";'  ); 
  ?> 

Пример возврата значения:

<?php 
 $foo   =   "Прощай, мир!  \n  "  ;     // не работает в PHP5 
 echo   eval  (  'return $foo;'  ); 
  ?> 

Возьмите [ править ]

В Луа 5.1 loadstring компилирует код Lua в анонимную функцию.

Пример в качестве средства оценки выражений:

loadstring  (  "print('Hello World!')"  )() 

Пример выполнения оценки в два этапа:

a   =   1 
 f   =   loadstring  (  «return a + 1»  )   — скомпилируйте выражение в анонимную функцию 
 print  (  f  ())   — выполните (и напечатайте результат «2») 

Lua 5.2 устарел loadstring в пользу существующего loadфункция, которая была дополнена для приема строк. Кроме того, это позволяет напрямую предоставлять среду функции, поскольку среды теперь являются upvalues .

load  (  "print('Hello ' .. a)"  ,   ""  ,   "t"  ,   {   a   =   "World!"  ,   print   =   print   })() 

Постскриптум [ править ]

PostScript execОператор принимает операнд — если это простой литерал, он помещает его обратно в стек. Однако если взять строку, содержащую выражение PostScript, можно преобразовать строку в исполняемый файл, который затем может быть выполнен интерпретатором, например:

 ((Привет, мир) =)   cvx   exec 

преобразует выражение PostScript

 (Привет, мир)   = 

который извлекает строку «Hello World» из стека и отображает ее на экране, чтобы она имела исполняемый тип, а затем выполняется.

PostScript run Оператор аналогичен по функциональности, но вместо этого интерпретатор сам интерпретирует выражения PostScript в файле.

(file.ps)   запустить 

Питон [ править ]

В Python eval функция в своей простейшей форме оценивает одно выражение.

eval пример (интерактивная оболочка):

>>>  x   =   1 
 >>>  eval  (  'x + 1'  ) 
 2 
 >>>  eval  (  'x'  ) 
 1 

The eval функция принимает два необязательных аргумента, global и locals, которые позволяют программисту настроить ограниченную среду для оценки выражения.

The exec заявление (или exec функция в Python 3.x) выполняет операторы:

exec пример (интерактивная оболочка):

>>>  x   =   1 
 >>>  y   =   1 
 >>>  exec   "x += 1; y -= 1" 
 >>>  x 
 2 
 >>>  y 
 0 

Наиболее общей формой оценки операторов/выражений является использование объектов кода. Их можно создать, вызвав compile() функцию и сообщив ей, какой ввод она должна скомпилировать: " exec"заявление," eval"заявление или" single" заявление:

compile пример (интерактивная оболочка):

>>>  x   =   1 
 >>>  y   =   2 
 >>>  eval   (  compile   (  «print 'x + y = ', x + y»  ,   «compile-sample.py»  ,   «single»  )) 
 x + y = 3 

Д [ править ]

D является статически компилируемым языком и поэтому не включает в себя " eval"заявление в традиционном смысле, но включает в себя соответствующее " mixin" утверждение. Разница в том, что где " eval" интерпретирует строку как код во время выполнения с " mixin" строка статически компилируется как обычный код и должна быть известна во время компиляции. Например:

импорт   стандартный  .   стдио  ; 

  void   main  ()   { 
     int   num   =   0  ; 
      миксин  (  "num++;"  ); 
      записьln  (  число  );     // Печатает 1. 
 } 

Приведенный выше пример будет скомпилирован точно в те же инструкции языка ассемблера, как если бы « num++;" был написан напрямую, а не вмешан. Аргумент mixin не обязательно должен быть строковым литералом, это могут быть произвольные выражения, приводящие к строковому значению, включая вызовы функций, которые можно вычислить во время компиляции.

КолдФьюжн [ править ]

ColdFusion evaluate Функция позволяет оценивать строковое выражение во время выполнения.

<cfset   x   =   "int(1+1)"  > 
 <cfset   y   =   Evaluate  (  x  )  > 

Это особенно полезно, когда вам нужно программно выбрать переменную, из которой вы хотите прочитать.

<cfset   x   =   Evaluate  (  "имя_запроса.  #имя_столбца#  [номер_строки]"  )  > 

Руби [ править ]

Интерпретатор языка программирования Ruby предлагает eval функция аналогична Python или Perl, а также позволяет область действия или привязку указать .

Помимо указания привязки функции, eval также может использоваться для оценки выражения в конкретной привязке определения класса или привязке экземпляра объекта, позволяя расширять классы новыми методами, указанными в строках.

a   =   1 
 eval  (  'a + 1'  )   # (оценивается как 2) 

 # оценка в контексте 
 def   get_binding  (  a  ) 
   привязка 
 end 
 eval  (  'a+1'  ,  get_binding  (  3  ))   # (оценивается как 4, потому что ' a' в контексте get_binding равен 3) 
класс   Тест  ;    окончание 
 теста  .   class_eval  (  "def hello; return 'hello';end"  )   # добавляем метод "hello" в этот класс 
 Test  .   новый  .   hello                      # оценивается как «привет» 

Далее [ править ]

Большинство стандартных реализаций Форта имеют два варианта eval: EVALUATE и INTERPRET.

Пример кода Win32FORTH:

  S"   2 2 + .  "   EVALUATE   \ Выходы "4" 

БАЗОВЫЙ [ править ]

НАСТОЯЩИЙ базовый [ править ]

В REALbasic есть класс RBScript , который может выполнять код REALbasic во время выполнения. RBScript очень изолирован — в нем присутствуют только самые основные функции языка, и вы должны предоставить ему доступ к тому, что вы хотите. При желании вы можете назначить объект свойству контекста. Это позволяет коду RBScript вызывать функции и использовать свойства объекта контекста. Однако он по-прежнему ограничен пониманием только самых основных типов, поэтому, если у вас есть функция, возвращающая Dictionary или MySpiffyObject, RBScript не сможет ее использовать. Вы также можете взаимодействовать со своим RBScript через события печати и ввода.

VBScript [ править ]

Microsoft VBScript, который является интерпретируемым языком, имеет две конструкции. Eval— это оценщик функций, который может включать вызовы пользовательских функций. (Эти функции могут иметь побочные эффекты, такие как изменение значений глобальных переменных.) Execute выполняет один или несколько операторов, разделенных двоеточиями, которые могут изменить глобальное состояние.

И VBScript, и JScript. evalдоступны разработчикам скомпилированных приложений Windows (написанных на языках, не поддерживающих Eval) через элемент управления ActiveX, называемый Microsoft Script Control, метод Eval которого может быть вызван кодом приложения. Чтобы поддерживать вызов пользовательских функций, необходимо сначала инициализировать элемент управления с помощью метода AddCode, который загружает строку (или строковый ресурс), содержащую библиотеку пользовательских функций, определенных на выбранном языке, перед вызовом Eval. .

Visual Basic для приложений [ править ]

Visual Basic для приложений (VBA), язык программирования Microsoft Office, представляет собой язык виртуальных машин, на котором среда выполнения компилирует и запускает p-код . Его версия Eval поддерживает только вычисление выражений, где выражение может включать определяемые пользователем функции и объекты (но не имена определяемых пользователем переменных). Следует отметить, что оценщик отличается от VBS, и вызов определенных пользовательских функций может работать в VBA иначе, чем тот же код в VBScript.

Смолток [ править ]

Поскольку классы компилятора Smalltalk являются частью стандартной библиотеки классов и обычно присутствуют во время выполнения, их можно использовать для оценки строки кода.

Компилятор   оценивает:  '1 + 2' 

Поскольку определения классов и методов также реализуются посредством отправки сообщений (объектам класса), возможны даже изменения кода:

Компилятор   оценивает:  'Подкласс объекта:#Foo' 

ТКЛ [ править ]

В языке программирования Tcl есть команда под названием eval, который выполняет исходный код, предоставленный в качестве аргумента. Tcl представляет весь исходный код в виде строк с фигурными скобками, выполняющими роль кавычек, так что аргумент eval может иметь то же форматирование, что и любой другой исходный код.

set   foo   { 
	 while   {[  incr   i  ]  <  10  }   { 
		 puts   "$i в квадрате равно [expr $i*$i]" 
	 } 
 } 
 eval   $foo 

бс [ править ]

у bs есть evalфункция, принимающая один строковый аргумент. Функция является одновременно оценщиком выражений и исполнителем операторов. В последней роли его также можно использовать для обработки ошибок. Следующие примеры и текст взяты из bs man-страница , как показано в UNIX System V Release 3.2. Руководстве программиста [6]

Строковый аргумент оценивается как bsвыражение. Функция удобна для преобразования числовых строк во внутреннюю числовую форму. eval также может использоваться как грубая форма косвенного обращения, как показано ниже (обратите внимание, что в bs, _ (подчеркивание) является оператором конкатенации.):

имя   =   "xyz" 
  eval  (  "++"   _   имя  ) 

который увеличивает переменную xyz.

Кроме того, eval которому предшествует оператор запроса, ?, позволяет пользователю контролировать bsусловия ошибки. Например:

?eval  (  "open(\"X\", \"XXX\", \"r\")"  ) 

возвращает нулевое значение, если нет файла с именем «XXX» (вместо этого остановки программы пользователя).

Следующее выполняет goto на этикетку L (если он существует):

метка   =   «L» 
 , если   !   (  ?eval  (  "goto"   _label   "  ))   puterr   =   "без метки 

Интерпретаторы командной строки [ править ]

Оболочки Unix [ править ]

Команда eval присутствует во всех оболочках Unix , включая исходную «sh» ( оболочка Bourne ). Он объединяет все аргументы с пробелами, затем повторно анализирует и выполняет результат как команду. sh(1) FreeBSD по основным командам Руководство

Windows PowerShell [ править ]

В Windows PowerShell Invoke-ExpressionКомандлет служит той же цели, что и функция eval в таких языках программирования, как JavaScript, PHP и Python. Командлет запускает любое выражение Windows PowerShell, предоставленное в виде параметра команды в виде строки, и выводит результат указанного выражения. Обычно выходные данные командлета имеют тот же тип, что и результат выполнения выражения. Однако, если результатом является пустой массив, он выводит $null. Если результатом является массив из одного элемента, он выводит этот единственный элемент. Подобно JavaScript, Windows PowerShell позволяет оставлять последнюю точку с запятой.

Пример в качестве средства оценки выражений:

PS >  $foo   =   2 
 PS >  выражение вызова   '$foo + 2' 

Пример в качестве исполнителя оператора:

PS >  $foo   =   2 
 PS >  ignore-expression   '$foo += 2;   $фу' 

Микрокод [ править ]

В 1966 году IBM Conversational Programming System (CPS) представила микропрограммируемую функцию. EVAL выполнять «интерпретативную оценку выражений, записанных в модифицированной польской строковой нотации » на IBM System/360 Model 50 . [7] Микрокодирование этой функции было «существенно более» в пять раз быстрее по сравнению с программой, интерпретирующей оператор присваивания . [8]

Теория [ править ]

В теоретической информатике обычно проводят четкое различие между eval и apply . Под Eval понимается этап преобразования строки в кавычках в вызываемую функцию и ее аргументы, тогда как Apply — это фактический вызов функции с заданным набором аргументов. Это различие особенно заметно в функциональных языках и языках, основанных на лямбда-исчислении , таких как LISP и Scheme . Так, например, в Scheme различие заключается между

(  оценка   '  (  ж   x  )   ) 

где должна быть вычислена форма (fx), и

(  применить   f   (  список   x  )) 

где функция f должна вызываться с аргументом x .

Eval и apply — два взаимозависимых компонента цикла eval-apply , который составляет суть оценки Lisp, описанной в SICP . [9]

В теории категорий eval замкнутой морфизм используется для определения моноидальной категории . Так, например, категория множеств с функциями, взятыми в качестве морфизмов, и декартовым произведением , взятым в качестве произведения , образует декартову замкнутую категорию . Здесь eval (или, собственно говоря, apply ) вместе со своим правым сопряженным , currying , образуют просто типизированное лямбда-исчисление , которое можно интерпретировать как морфизмы декартовых замкнутых категорий.

См. также [ править ]

Ссылки [ править ]

  1. ^ «Flash 8 LiveDocs» . 10 октября 2006 г. Архивировано из оригинала 10 октября 2006 г.
  2. ^ Библиотека оценки ActionScript 3
  3. ^ «API D.eval» . Архивировано из оригинала 14 марта 2013 г.
  4. ^ Джон Маккарти, «История Лиспа - Реализация Лиспа»
  5. ^ «PHP: eval — Руководство» . PHP.net . Проверено 10 сентября 2015 г.
  6. ^ «Том 1 Команды и утилиты». Руководство программиста UNIX (PDF) . АТ&Т. 1986. с. 41.
  7. ^ Аллен-Бэбкок. «Проект микропрограммы EVAL» (PDF) . Bitsavers.org . Проверено 17 января 2016 г.
  8. ^ Рочестер, Натаниэль. «Отчет о ходе работы системы диалогового программирования» (PDF) . Bitsavers.org . Проверено 17 января 2016 г.
  9. ^ Метациркулярный оценщик (SICP, раздел 4.1)

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 0E6DA44ED52E4784D8822A23C2A32698__1709260620
URL1:https://en.wikipedia.org/wiki/Eval
Заголовок, (Title) документа по адресу, URL1:
eval - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)