我正在设计/原型(prototype)化领域特定语言……至少目前是在 Python 中。设计很简单 - 但需要支持指定任意函数(其域是从标签到整数的映射 - 范围是整数。)在许多情况下,该函数只会选择域中的标签以产生结果...但我希望允许使用通用编程语言轻松(高效)实现的任何函数的规范。
需要注意的是,我希望该函数是“安全的”...我的意思是:
- “纯”函数:确定性且无副作用。 (即没有外部状态;没有与文件、I/O、设备等的交互)
- 终止 - 成功终止,或在特定(小规模)分配的计算资源到期后终止。
我很希望这个功能能够高效地实现——我希望不经常提供定义——并且非常频繁地进行评估。我还希望使用熟悉的语法定义函数。
我考虑过支持在 python 中实现函数...我知道我可以 impose restrictions using the eval() function ,我找到了 AST module - 建议一种涉及解析为 AST,然后解释(或在评估之前验证)AST 树的方法。我也读过 pyparse并考虑实现一种定制的、解释性的语言。
我忍不住认为,试图从 eval() 中阻止不良行为是在“向后”解决问题(试图事后阻止不良功能),而实现定制语言将涉及重新发明轮子.
Python 是否已经有了安全、高效、可嵌入的表达式解释器?
最佳答案
如果您在 Web 浏览器中运行它(不可信代码问题的通常位置),请考虑使用类似 Brython 的客户端运行它.没有人关心用户是否破解了他自己的机器。
如果您确实实现了定制解释器,则不必重新实现 所有 轮子。在不受信任的代码上使用 compile()
被认为是相对安全的,但要注意大常量会占用时间和内存。在您可以终止的单独进程中运行编译器。然后你只需要编写一个无法访问任何重要内容的 Python 字节码解释器。
关于python - 嵌入式用户定义表达式的安全实现策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40692619/