2010-06-22 27 views
1

我正在處理一個處理大量對象和數據的程序。因爲我可以通過爲我的應用程序提供某種'API'來注入操作。由於應用程序本身對對象等進行管理,我不知道如何實現。例如,Unity3D和Panda3D引擎允許使用各種語言,例如ECMA或Python進行腳本編寫。我不是在尋找一種'遊戲'腳本語言來投入,而是指出如何支持各種腳本語言。爲動態OO程序實現現有的腳本語言

爲了討論起見,我們假設我的程序具有類Cube的對象。立方體具有諸如旋轉,移動,變換和諸如顏色,中心,大小等屬性的類方法。現在,我想讓我的用戶可以使用例如JavaScript來操作對象。然而,我的'核心'程序是用Ruby編寫的。

  1. 我需要編寫一個整體包,從頭開始評估用戶代碼及其語法(如實現自己的JavaScript版本)嗎?還是有現有的軟件包,框架,框架,寶石等?
  2. 我該如何實現安全性,以便僅將腳本語言賦予允許操作的類(例如,將類標記爲「可操作」的屬性)。

我一直想知道企業應用程序如何做到這一點(以及遊戲引擎......),所以感謝您的幫助和反饋。

回答

3

如果你的核心程序是用Ruby編寫的,我不明白爲什麼你會希望你的腳本除了可能用於sandboxing(見下面)之外的任何東西,除了Ruby —之外。

我需要編寫一個整體包,從頭開始評估用戶代碼及其語法(如實現自己的JavaScript版本)嗎?

編號有很多軟件包可以加入到你的程序中。如果您的程序是用C語言編寫的,或者即使它提供了C語言接口,您的決定也很容易:編程語言Lua旨在以很少的努力嵌入到C程序中。我做了至少幾十次。

我該如何執行安全措施,僅將腳本語言賦予允許操作的類(例如,將類標記爲「可操作」的屬性)?

您可以通過設置名稱的集合,是對腳本—作爲一種編程語言的人看到這樣做,我會說你控制環境(技術術語,談及訪問名稱)。例如,在Lua的情況下,您應該爲每個用戶的腳本提供一個允許用戶正確命名用戶擁有的功能的環境,而不是更多。如果腳本無法命名,則無法使用。這項工作通常被稱爲沙盒。 (例如,「將用戶放在沙箱中,不要讓他們出去」)通過控制名稱空間的沙盒在除Lua之外的其他語言中通常是通用的。

我一直想知道的企業應用程序是如何做到這招(和遊戲引擎太...)

我不知道該怎麼總結這招夠簡單地爲SO回答。但總的思路是:

  • 腳本語言有一個字節碼解釋器

  • 有一個精心設計的協議,用於腳本和C

之間的調用進行更深層次的看法,閱讀羅伯託的書Programming in Lua; earlier edition免費在線。

+0

大聲笑,我同意。我更喜歡Ruby的一切。然而,我從經驗中知道,學習面嚮對象語言並不是在24小時內獲得專業知識的東西。我的目標受衆很可能已經知道JavaScript。謝謝您的回答。它非常具有描述性和細節性。 – Shyam 2010-06-22 14:34:29

+0

我以爲人們喜歡Ruby,因爲你可以在其中創建有限的DSL(特定領域的語言)。你可以讓腳本寫在特定於你的應用程序的Ruby的有限子集中嗎? – FrustratedWithFormsDesigner 2010-06-22 15:21:48

+0

其實我喜歡Ruby,因爲代碼很有意義。它更像是我想擴展應用程序的一部分,用戶可以在應用程序中進行調整和集成。由於這是一個普遍的問題,我不會限制任何東西。 – Shyam 2010-06-22 18:13:07

1

我不確定我完全按照您的要求,但會像RESTful方法爲您工作? REST通常以客戶端/服務器術語思考,但我認爲其中的一些想法也可能適用於此。

基本概念可能是您通過API暴露了對象的表示形式(可能是JSON或XML)。客戶將獲取這些表示,進行他們想要的任何更改,然後將修改後的版本提交回您的程序。您的程序將驗證這些更改並(假設它們是合法的)應用它們。

這似乎可以讓你對使用什麼類型的腳本語言非常不明確,應該靈活且易於理解,併爲你提供了一個明確的地方來實現你的安全策略。順便提一下,雖然我不知道這是如何編寫腳本的遊戲引擎的工作方式,但我看到一些企業系統公開了與此類似的API(儘管通常作爲Web服務而不是接受用戶編寫的腳本)。

+0

謝謝你的回答。這是否意味着我的對象應該以某種可訪問的格式生活?有沒有一個例子,我可以讀到的這種實現方法? – Shyam 2010-06-22 14:29:32

+0

好吧,我的想法是基於Rails附帶的標準ActiveResource庫(http://api.rubyonrails.org/classes/ActiveResource/Base.html)。如我所說,它通常用於網絡服務,但我沒有理由不採用類似的方法來與用戶提供的腳本進行交互。特別是如果你使用Rails3的一些新的ActiveModel模塊,我認爲它應該是非常簡單的(http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord /)。儘管如此,我不知道有哪些示例正在做你想要的。 – 2010-06-22 20:31:13