2009-12-01 29 views
23

Me parece que eval() es tratado con el mismo desdén que goto. Y por eval, me refiero a una función para ejecutar una cadena como código, como se ve en PHP, Python, JavaScript, etc. ¿Alguna vez se justifica el uso de eval() (excepto perl)? Y si no, ¿por qué tantos idiomas lo implementan?¿Alguna vez hay una buena razón para usar eval()?

+12

Esta pregunta no puede ser ** independiente del idioma ** debido a la función especial del bloque 'eval' en Perl como mecanismo principal de manejo de excepciones. Por lo tanto, le presento que no puede haber una respuesta correcta a esta pregunta: hay una muy buena razón para usar 'eval' si está programando en Perl, y probablemente no sea una buena razón si está programando en JavaScript. Especifique los idiomas a los que se aplica esta pregunta o conviértala en CW. –

+1

Es cierto que no sabía cómo funcionaba eval() en Perl. – GSto

+1

¿Está incluyendo la función 'eval' en Lisp? Es esencial en el funcionamiento normal (el ciclo leer-evaluar-imprimir), pero en mi experiencia casi nunca se usa fuera de eso. Cada vez que tuve la tentación, parecía que las macros Common Lisp eran una mejor idea. –

Respuesta

25

Sí, cuando no hay otra manera de lograr la tarea dada con un nivel de claridad razonable y dentro de un número razonable de líneas de código.

Esto elimina el 99% de los casos en que se usa eval, en todos los idiomas y contextos.

3

Para hacks rápidos, no hay problema porque es una práctica salida rápida.

En el código de producción, considéralo un último recurso, e incluso entonces, prueba con otra cosa, ya que eval es difícil de controlar y, por lo tanto, peligroso. Para cualquier cosa no trivial, implemente un sublenguaje.

1

¿Escribir un buen ejemplo de libro de texto sobre lo fácil que es implementar una "calculadora" en el lenguaje X? =)

2

Pensamiento improvisado: eval es bueno para implementar el compilador de expresiones de un pobre, o cosas por el estilo. También es un sustituto aburrido y oxidado de las macros higiénicas.

3

Lo usé una vez mientras pentesting un sitio - escribimos un pequeño script php que descifra y ejecuta carga útil firmadas criptográficamente de fuentes de datos HTTP no registradas sobre la marcha. Este es el mejor uso que he visto de eval() hasta ahora.

(En otras palabras: no, nunca he visto un buen uso de eval)

2

Tal vez lo uso sh y perl demasiado, pero nunca he visto a nadie tratar eval con el desdén que obtiene goto .

Así que mi respuesta es: 'eval es adecuado cuando está escribiendo perl 5 y sh'. El bloque eval es el mecanismo primario try/catch en Perl y es difícil escribir código seguro sin él.

+0

tienes razón, tal vez no es tan independiente del idioma como yo pensaba. Mi experiencia es con PHP & Python, y el consenso general parece ser que si quieres usar eval, no lo hagas. – GSto

+1

corolario: no etiquete nada como "independiente del idioma" a menos que se sienta cómodo con al menos una docena de idiomas – Javier

9

eval es a menudo la solución más conveniente en situaciones donde está generando código dinámicamente. Incluso en lenguajes que oficialmente no soportan eval, como Java, soportan la reflexión y modificación de clases en tiempo de ejecución que son similares. (Consulte libros como Stu Halloway's Component Development for the Java Platform)

+0

+1, solo un buen ejemplo real que he visto hasta ahora. –

4

Un uso razonable es si tiene un lenguaje interpretado que ha creado sobre otro idioma, pero aún desea proporcionar algún tipo de "ventana de escape" para permitir que las personas para volver a las funciones proporcionadas por el lenguaje subyacente. Un ejemplo es implementar Prolog en Lisp y luego definir un predicado que permita el uso directo de las funciones de Lisp a través del EVAL.

0

Para depurar/probar una idea antes de implementarla de la manera correcta.

Por ejemplo, usted está haciendo una calculadora de juguetes, y desea trabajar primero en la interfaz gráfica de usuario, por lo que simplemente usa eval para hacer el trabajo de "back-end" en segundo plano. Más tarde, regresa al back-end, rasca eval y escribe un analizador de expresiones apropiado.

0

¡Al crear/probar segmentos de código eval es PERFECTO!

Solo crea una página web básica de andamios con áreas de texto y un botón de evaluación. Coloque el código en un área de texto y luego presione el botón eval. Es más rápido que el cambio de ida y vuelta entre su editor de texto y un navegador

eval

edit code 
press eval button 

método de conmutación

edit code 
press save   extra step 
switch to browser extra step 
press reload 

Al hacer un montón de pruebas y ajustes en el código de los pasos adicionales de menor importancia puede realmente agregar. Además, es posible que se olvide de guardar creando confusión cuando realice la prueba.

+0

O presione f12 y use la consola? – ShrekOverflow

+0

¿Usa la consola para editar muchas líneas de código? No parece práctico. – user3015682

0

Eval se usa cuando necesita 'generar' y ejecutar código. Y al generar me refiero a incluir desde una fuente externa (un archivo, un sitio web, un 'agente') y crear sobre la marcha dentro del programa.

Y la razón por la que desea generar código, aparte de los ejemplos obvios de módulos externos y sitios de evaluación, suele ser hacer referencia dinámica a los nombres de objetos y propiedades en el código. El primer ejemplo, por cierto, ya ocurre cuando una página HTML está cargada y tiene una etiqueta de script, o en los atributos del controlador de eventos de las etiquetas HTML, así que desde el principio un desarrollador web aprovecha EVAL, incluso desde el principio. si es el navegador que realiza la llamada.

Lo que indirectamente me lleva a esa segunda razón: acceder a los nombres de los objetos .. En algunos idiomas, como Java, la capacidad de introspección reduce o elimina la necesidad de utilizar la evaluación de Java. Resulta que, dado que los objetos en Javascript son totalmente dinámicos, un acceso a la propiedad en Javascript es comparable a la introspección en otros idiomas, donde puede acceder y consultar los nombres creados sobre la marcha. Además, Javascript tiene las funciones 'llamar' y 'aplicar' para llamar dinámicamente funciones con sus parámetros. Por último, en relación con la ejecución del código, se puede usar eval para aumentar el rendimiento: en lugar de un acceso condicional o de propiedades multinivel que determina qué código ejecutar o qué objeto usar, se podría crear un fragmento de código mínimo que podría tiene que ejecutarse cientos de miles de veces, evaluarlo para una función y luego llamar a esa función. Esto podría funcionar con multimétodos, por ejemplo, una vez que se determinan los argumentos particulares en uso. Sin embargo, esta es una razón muy remota ya que javascript trata las funciones como objetos de primera clase.

Cuestiones relacionadas