gpt4 book ai didi

eval - eval() 的威力有多大?

转载 作者:行者123 更新时间:2023-12-02 04:25:35 29 4
gpt4 key购买 nike

最近我遇到了eval()函数在几个地方(一些 D 和 JavaScript 代码)。这次经历让我意识到我并没有理解有或没有eval()的语言之间的区别。 。

事实上,我在不使用它的情况下也能生存(尽管有时很诱人:))。

你知道实现 eval() 的语言之间有什么根本区别吗?以及一种不实现它的语言(即使是在编译时)?如果没有根本差异,是否存在表达能力差异?

您是否知道有任何论文或引用文献解释 eval() 提供的额外计算能力/表达能力?这就是,我们可以用 eval() 来实现什么?没有它我们就无法实现(或以更高的成本)?

最佳答案

具有 eval 的语言和不具有 eval 的语言在功能上没有区别。您始终可以用没有 eval 的语言自己实现 eval,尽管它在某些语言 (Lisp) 中更容易,而在其他语言 (C) 中更难。这就是为什么我们知道它不会为语言添加任何新功能。

Eval 通常被认为“强大但危险且在生产代码中不必要”。如果您审查过源代码,并且它使用了eval,那么您将不得不习惯人们告诉您不要使用eval。通常,如果您使用eval,则有一种更直接、更安全的方法来完成相同的任务。

安全漏洞

eval 函数通常会导致安全漏洞,例如在 Web 应用程序中。例如,在 Python 中:

i = input('Enter a number> ')

3.x 之前的 Python 中的 input 函数会评估用户输入,从而导致安全问题:

Enter a number> __import__('os').system('rm -rf $HOME') # DO NOT TRY THIS

在完全沙盒运行时(例如 JavaScript、Lua、CLI 等)中可以避免这种情况。但是,在未沙盒的代码中,安全地使用 eval 太困难了。

REPL

eval 的一个出色用途是 REPL,它是一种有用的软件开发工具。在 Google Chrome 中,您现在可以通过按 Ctrl+Shift+I 来启动 REPL - 只需在出现的框中开始输入 JavaScript 即可。 Firefox 和 Safari 也都有 REPL。

为什么不包含eval

eval 函数通常非常复杂。将其包含在标准库中意味着库或运行时必须包含该语言的完整编译器或解释器,这是一大块代码。这就是为什么您通常会在通常解释或 JIT 的语言中看到 eval —— Lisp、Python 和 JavaScript 运行时通常已经包含完整的编译器,因此 eval 并不是额外的负担.

C 的 eval 实现是真正的野兽,因此它们是可选的并被插入库中。

关于eval - eval() 的威力有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13320940/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com