为动态OO程序实现现有的脚本语言

时间:2010-06-22 14:10:02

标签: javascript ruby api scripting middleware

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

为了论证,我们假设我的程序包含Cube类的对象。多维数据集具有类方法,如旋转,移动,变换以及颜色,中心,大小等属性。现在,我想让我的用户使用JavaScript来操作对象。然而,我的“核心”程序是用Ruby编写的。

  1. 我是否必须编写一个完整的软件包来评估用户代码及其语法(从实现自己的JavaScript版本开始)?或者是现有的包,骨架,框架,宝石等吗?
  2. 如何实现安全性,仅将脚本语言提供给允许操作的类(例如,将类标记为“可操作”的属性)。
  3. 我一直想知道企业应用程序如何做到这一点(以及游戏引擎......),所以感谢您的帮助和反馈。

2 个答案:

答案 0 :(得分:3)

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

  

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

否。您可以在程序中加入许多软件包。如果您的程序是用C语言编写的,或者即使它提供了C接口,您的决定也会很简单:编程语言Lua旨在以极少的精力嵌入到C程序中。我至少做过几次。

  

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

您可以通过设置脚本可见的名称集合来实现此目的 - 作为编程语言人员,我会说您控制环境(谈论访问名称的技术术语) )。例如,对于Lua,您可以为每个用户的脚本提供一个环境,该环境允许用户准确命名您希望用户拥有的功能,而不是更多。如果脚本无法命名,则无法使用。此作业通常称为沙盒。 (如,“将用户放在沙箱中,不要让他们出去。”)除了Lua之外,通过控制命名空间的沙盒通常是其他语言。

  

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

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

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

  • 在脚本和C

  • 之间有一个精心设计的协议

要获得更深入的观点,请阅读Roberto的书Programming in Lua; earlier edition免费在线。

答案 1 :(得分:1)

我不确定我是否完全遵循您的要求,但RESTful方法会为您工作吗? REST通常被认为是客户端/服务器术语,但我认为其中一些想法也适用于此。

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

这似乎可以让您对使用何种脚本语言非常不了解,应该灵活且易于用户理解,并为您提供实施安全策略的明确位置。

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