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

标签 javascript ruby api scripting middleware

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

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

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

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

最佳答案

如果您的核心程序是用 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/

相关文章:

通过 API 确认 paypal 商品已售出

database - API与数据库交互的正确方式?

php - 如何在不使用 oauth-php 库的情况下使用 OAuth 和 PHP?

javascript - 如何同步调用多次返回 promise 的函数

Javascript 文件出现语法错误

windows - 如何从 ruby​​ 将原始打印机代码写入 Windows 打印机共享?

ruby - 如何将字符串列表转换为 ruby​​ 中的一个字符串?

ruby - Jekyll 与 .erb 的兼容性

javascript - FullCalendar 仅在周 View 和日 View 中显示事件,但不在月 View 中显示事件

javascript - 如何拒绝Rails更新方法并触发JavaScript警报框?