eval()和 exec()这类语句存在的意义是什么?

2021-11-14 16:57:14 +08:00
 MiketsuSmasher
4924 次点击
所在节点    程序员
27 条回复
ipwx
2021-11-14 17:19:20 +08:00
通过可信 dsl 产生程序然后运行吧。。。
ipwx
2021-11-14 17:20:07 +08:00
直接字符串拼接然后运行容易被注入,但是你可以自己实现一套简单的编译器,然后编译成 host 语言运行
eason1874
2021-11-14 17:34:12 +08:00
写个稍微复杂一点的模板引擎你就知道了

动态输入代码可以提供很高的灵活性
pythonee
2021-11-14 17:46:55 +08:00
@ipwx 你是指自举?
Mac
2021-11-14 17:48:46 +08:00
我用在给客人自定义模版上,内网环境下还是挺好用的
ch2
2021-11-14 17:54:42 +08:00
用二进制或者脚本创建子进程
ipwx
2021-11-14 18:02:27 +08:00
@pythonee 不是自举。

模板引擎、动态执行代码,etc 。
ipwx
2021-11-14 18:03:17 +08:00
很多需要繁琐的 if-else factory 设计模式的,用动态代码生成,有时候就很容易解决了。

退一万步,JIT 这东西知道吧?相当于它根据 JVM bytecode 产生了机器码。某种意义上也算是 CPU 的 eval 了。
wanguorui123
2021-11-14 18:21:26 +08:00
元编程
rayhy
2021-11-14 21:14:24 +08:00
只要执行的字符串可控还是挺有用的,用来实现一些黑魔法。
djFFFFF
2021-11-14 21:16:33 +08:00
举个例子,自己写一个 github action ,肯定就要用到 eval ,exec 这些方法
ClericPy
2021-11-14 22:12:40 +08:00
exec 日常模版解析传入 UDF...

eval 的话, 有时候动态传入参数想保留数据类型, 又懒得用 JSON...
GeruzoniAnsasu
2021-11-14 22:22:20 +08:00
自古以来,程序是程序,数据是数据,程序处理数据但数据不能变成程序的一部分。

eval 打破了这个限制
dangyuluo
2021-11-15 00:52:10 +08:00
没说语言,C++的话没有 exec 估计现在计算机体系不复存在了
ysc3839
2021-11-15 00:54:04 +08:00
@GeruzoniAnsasu 自古以来就没有这样的限制,图灵机是不分程序和数据的,冯诺依曼结构也不分程序存储和数据存储,哈佛结构有这种限制,但是长期以来就不是主流。现代 CPU 为了安全性加入了内存权限,但也和哈佛结构有本质区别。
morewe
2021-11-15 01:00:07 +08:00
比如给自己本地用的 web 工具等不需要考虑安全,只需要考虑方便的特殊场景。
GeruzoniAnsasu
2021-11-15 01:44:56 +08:00
@ysc3839 怎么说呢,理论模型从理论上已经是完备的,所以体现不出来我想表达的点,就比如我想说「图灵机并不能把自己的状态喂给另一个图灵机」但作为理论,图灵机完全可以按照纸带的要求把上一个状态写到纸带上。

dany813
2021-11-15 09:02:53 +08:00
eval 大法好啊
Shazoo
2021-11-15 09:31:04 +08:00
eval 可以将 repr 序列化的数据结构还原。持久化数据结构蛮好用的。只要把控住数据源,不用脏数据,就没问题。
cairnechen
2021-11-15 09:35:21 +08:00
昨天安装 homebrew 的时候发现用到了 eval

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/815305

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX