1

我正在开发一个程序,该程序处理大量对象和数据。因为我可以通过对我的应用程序使用某种“API”来注入操作。由于应用程序本身管理对象等,我想知道如何实现。例如,Unity3D 和 Panda3D 引擎允许使用多种语言,例如 ECMA 或 Python 进行脚本编写。我不是在寻找要投入的“游戏”脚本语言,而是关于如何支持各种脚本语言的指针。

为了论证起见,假设我的程序有属于 Cube 类的对象。立方体具有诸如旋转、移动、变换等类方法和颜色、中心、大小等属性。现在,我想让我的用户可以使用例如 JavaScript 来操作对象。然而,我的“核心”程序是用 Ruby 编写的。

  1. 我是否必须编写一个完整的包来从头开始评估用户代码及其语法(如实现自己的 JavaScript 版本)?或者是否有现有的包、骨架、框架、宝石等?
  2. 我将如何实现安全性以仅将脚本语言提供给允许操作的类(例如,将类标记为“可操作”的属性)。

我一直想知道企业应用程序是如何做到这一点的(游戏引擎也是如此......),所以感谢您的帮助和反馈。

4

2 回答 2

3

如果您的核心程序是用 Ruby 编写的,那么我不明白您为什么希望您的脚本使用除 Ruby 之外的任何东西来编写——除了沙盒(见下文)。

我是否必须编写一个完整的包来从头开始评估用户代码及其语法(如实现自己的 JavaScript 版本)?

,您可以将许多软件包合并到您的程序中。如果您的程序是用 C 编写的,或者即使它提供了 C 接口,您的决定也很容易:编程语言Lua旨在轻松嵌入到 C 程序中。我至少做了几十次。

我将如何实现安全性以仅将脚本语言提供给允许被操作的类(例如,将类标记为“可操作”的属性)?

你通过设置对脚本可见的名称集合来做到这一点——作为一个编程语言的人,我会说你控制环境(一个谈论名称访问的技术术语)。例如,在 Lua 的情况下,您将向每个用户的脚本提供一个环境,该环境允许用户准确地命名您希望用户拥有的功能,仅此而已。如果脚本无法命名,则无法使用。这项工作通常称为沙盒。(例如,“将用户放入沙箱中,不要让他们离开。”)通过控制命名空间的沙箱在 Lua 之外的其他语言中很常见。

我一直想知道企业应用程序是如何做到这一点的(还有游戏引擎......)

我不知道如何简要地总结这个技巧以获得 SO 答案。但总体思路是:

  • 脚本语言有一个字节码解释器

  • 脚本和 C 之间有一个精心设计的调用协议

如需更深入的了解,请阅读 Roberto 的书Programming in Lua;较早的版本是在线免费的。

于 2010-06-22T14:25:56.183 回答
1

我不确定我是否完全符合您的要求,但是像RESTful方法这样的方法对您有用吗?REST 通常被认为是客户端/服务器术语,但我认为其中一些想法也可能适用于此。

基本概念可能是您通过 API 公开对象的表示形式(可能是 JSON 或 XML)。客户将获取这些表示,进行他们想要的任何更改,然后将修改后的版本提交回您的程序。您的程序将验证更改并(假设它们是合法的)应用它们。

这似乎可以让您完全不知道使用了哪种脚本语言,应该灵活且易于用户理解,并为您提供一个清晰的位置来实施您的安全策略。

顺便说一句,虽然我不知道这是否是可编写脚本的游戏引擎的工作方式,但我看到一些企业系统公开了与此类似的 API(尽管通常作为 Web 服务而不是接受用户编写的脚本)。

于 2010-06-22T14:24:06.123 回答