我正在开发一个处理大量对象和数据的程序。因为我可以通过对我的应用程序使用某种“API”来注入(inject)操作。由于应用程序本身负责对象等的管理,我想知道如何实现。例如,Unity3D 和 Panda3D 引擎允许使用多种语言,例如用于脚本的 ECMA 或 Python。我不是在寻找要放入的“游戏”脚本语言,而是关于如何支持各种脚本语言的指示。
为了论证,假设我的程序有 Cube 类的对象。立方体具有旋转、移动、变换等类方法和颜色、中心、大小等属性。现在,我想让我的用户可以使用 JavaScript 来操作对象。然而,我的“核心”程序是用 Ruby 编写的。
- 我是否必须从头开始编写一个完整的包来评估用户代码及其语法(如实现自己的 JavaScript 版本)?或者是否有现成的包、骨架、框架、gem 等?
- 我将如何实现安全性以仅将脚本语言提供给允许被操作的类(例如,将类标记为“可操作”的属性)。
我一直想知道企业应用程序是如何做到这一点的(游戏引擎也是……),所以感谢您的帮助和反馈。
最佳答案
如果您的核心程序是用 Ruby 编写的,我不明白为什么您希望您的脚本不是用 Ruby 编写的——除了沙盒(见下文)。
Would I have to write an entire package that will evaluate the user code and its syntax (as implement an own version of JavaScript) from scratch?
否。您可以将许多包合并到您的程序中。如果您的程序是用 C 编写的,或者即使它提供了 C 接口(interface),您的决定也会很容易:编程语言 Lua旨在轻松嵌入到 C 程序中。我至少做过几十次。
How would I implement security to give the scripting language only to the classes that are allowed to be manipulated (for example, an attribute that marks the class as 'manipulable')?
您可以通过设置脚本可见的名称集合来做到这一点——作为一名编程语言专家,我会说您控制环境(一个用于讨论名称访问的技术术语).例如,在 Lua 的情况下,您会为每个用户的脚本提供一个环境,该环境允许用户准确命名您希望用户拥有的功能,仅此而已。如果脚本无法命名,则无法使用。这项工作通常称为沙盒。 (例如,“将用户放在沙箱中,不要让他们出来。”)除了 Lua 之外,通过控制 namespace 进行沙箱化在其他语言中很常见。
I have always wondered how Enterprise applications did this trick (and Game engines too...)
我不知道如何足够简短地总结这个技巧以获得 SO 答案。但总体思路是:
脚本语言有字节码解释器
有精心设计的脚本和C之间的调用协议(protocol)
要更深入地了解,请阅读罗伯托的书 Programming in Lua ;一个earlier edition在线免费。
关于javascript - 为动态 OO 程序实现现有的脚本语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3093923/