Pregunta

Me parece que eval() se trata con el mismo desdén que se salta. Y por eval, me refiero a una función para ejecutar una cadena como código, como se ve en PHP, Python, JavaScript, etc. ¿Hay siempre una situación donde el uso se justifica eval() (excepto Perl)? Y si no, ¿por qué tantas lenguas ponerlo en práctica?

¿Fue útil?

Solución

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

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

Otros consejos

eval es a menudo la solución más conveniente en situaciones en las que está la generación dinámica de código. Incluso en idiomas que no son compatibles oficialmente eval, como Java, que apoyan la reflexión y la modificación de las clases en tiempo de ejecución que son similares. (Ver libros como de Stu Halloway Desarrollo de componentes para la plataforma Java )

Un uso razonable es si usted tiene un lenguaje interpretado que se ha construido en la parte superior de otro idioma, pero todavía se desea proporcionar algún tipo de "escotilla de escape" para permitir a la gente a volver a las funciones que son proporcionados por la el lenguaje subyacente. Un ejemplo está implementando Prolog en Lisp y luego definir un predicado que permite el uso directo de funciones Lisp través EVAL.

Para cortes rápidos, no hay problema porque es un rápido vistazo a la mano.

En el código de producción, lo consideran un último recurso, y aún así, intentar otra cosa, porque eval es difícil de controlar y por lo tanto peligroso. Para cualquier cosa no trivial, implementar un sublenguaje.

Lo usé una vez mientras pentesting un sitio - escribimos un pequeño script PHP que descifra y ejecuta cargas útiles criptográficamente firmados a partir de fuentes no registradas de datos HTTP sobre la marcha. Este es el mejor uso que he visto de eval () hasta el momento.

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

A primera vista pensó: eval es bueno para la implementación del compilador expresión de un hombre pobre, o cosas por el estilo. Es también un sustituto opaco, oxidado para las macros higiénicas.

Tal vez lo uso sh y perl demasiado, pero nunca he visto a nadie tratar eval por el desprecio que se goto.

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

Eval se utiliza cuando es necesario 'generar' y ejecutar código. Y por genero me refiero incluyen desde una fuente externa (un archivo, una página web, un 'agente'), así como crear sobre la marcha dentro del programa.

Y la razón que se quiere generar código, aparte de los ejemplos obvios de módulos externos y sitios de evaluación, es por lo general para hacer referencia dinámicamente los nombres de objetos y propiedades en el código.

El primer ejemplo, por cierto, ya que ocurre cuando se carga una página HTML y tiene una etiqueta de script, o en el controlador de eventos atributos de etiquetas HTML - por lo que desde el principio un desarrollador web se está aprovechando de EVAL, incluso si que es el navegador que hace la llamada.

Lo que indirectamente me lleva a la segunda razón - el acceso a los nombres de objetos .. En algunos lenguajes como Java, la capacidad de introspección reduce o elimina la necesidad de utilizar eval de java. Resulta que ya que los objetos en Javascript son completamente dinámico, un acceso a la propiedad en Javascript es comparable a la introspección en otros idiomas, donde se puede acceder y hacer referencia a los nombres creados sobre la marcha. Además, Javascript tiene la 'llamada' y 'aplicar' para llamar a funciones dinámicamente funciones con sus parámetros.

Por último, en relación con la ejecución de código, se podría utilizar eval para aumentar el rendimiento - en lugar de un acceso condicional o la propiedad de varios niveles que determina qué código se ejecute o cuál es el objeto de usar, se podría crear un fragmento de código mínimo que podría tener para ser ejecutado cientos de miles de veces, eval a una función, y luego simplemente llamar a esa función. Esto podría funcionar con métodos múltiples, por ejemplo, una vez que se determinan los los argumentos particulares en uso. Por supuesto, sin embargo, esto es a unos pocos y distantes entre sí, ya razón Javascript trata a funciones como objetos de primera clase.

Para la depuración / pruebas de una idea antes de implementar de la manera adecuada.

Por ejemplo, usted está haciendo una calculadora de juguete, y que desea trabajar en la interfaz gráfica de usuario en primer lugar, por lo que sólo tiene que utilizar eval para hacer el trabajo "back-end" en el fondo. Más tarde, se llega de nuevo a la parte posterior de gama, eval cero, y escribir un analizador de expresiones adecuado.

Al crear / pruebas de segmentos de código eval es perfecto!

Sólo construir una página web andamiaje básico con áreas de texto y un botón de eval. Poner el código en un área de texto a continuación, pulse 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

Cuando se realiza una gran cantidad de pruebas y ajustes en el código de los pasos adicionales de menor importancia pueden subir. Además es posible que se olvide de guardar crear confusión durante la prueba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top