Domanda

Sto lavorando su un programma, che gestisce un sacco di oggetti e dati. Come vorrei essere in grado di iniettare manipolazioni da avere una sorta di 'API' per la mia applicazione. Come l'applicazione stessa fa la gestione degli oggetti e così, mi chiedo come questo può essere implementato. Ad esempio, i motori Unity3D e Panda3D consentono una varietà di lingue, come ECMA o Python per lo scripting. Io non sono alla ricerca di un 'gioco' linguaggio di scripting per mettere in, ma indicazioni su come supportare vari linguaggi di scripting.

Per amor di discussione, diciamo che il mio programma ha oggetti che sono del Cubo di classe. Un cubo ha i metodi della classe, come ruotare, spostare, trasformare e immobili come il colore, il centro, le dimensioni. Ora, vorrei dare il mio all'utente la possibilità di utilizzare, ad esempio JavaScript per manipolare l'oggetto. Il mio programma 'core' però è scritto in Ruby.

  1. avrei dovuto scrivere un intero pacchetto che valuterà il codice utente e la sua sintassi (come implementare una propria versione di JavaScript) da zero? O ci sono già esistenti pacchetti, scheletri, quadri, gioielli, ecc.?
  2. Come faccio a implementare la protezione per dare il linguaggio di scripting solo per le classi a cui è consentito di essere manipolati (ad esempio, un attributo che segna la classe come 'manipolabile').

Mi sono sempre chiesto come le applicazioni Enterprise fatto questo trucco (e motori di gioco troppo ...), quindi grazie per l'aiuto e feedback.

È stato utile?

Soluzione

Se il programma di base è scritto in Ruby, non vedo il motivo per cui si vorrebbe gli script per essere scritti in qualsiasi cosa, ma Ruby-tranne forse per sandboxing (vedi sotto).

  

avrei dovuto scrivere un intero pacchetto che valuterà il codice utente e la sua sintassi (come implementare una propria versione di JavaScript) da zero?

No. Ci sono molti pacchetti è possibile incorporare nel vostro programma. Se il programma è stato scritto in C, o anche se è prevista un'interfaccia C, la vostra decisione sarebbe facile: il linguaggio di programmazione Lua è stato progettato per essere incorporato in programmi in C con il minimo sforzo. L'ho fatto almeno un paio di dozzine di volte.

  

Come faccio a implementare la protezione per dare il linguaggio di scripting solo per le classi a cui è consentito di essere manipolati (ad esempio, un attributo che segna la classe come 'manipolabile')?

A tale scopo, la creazione della collezione di nomi che è visibile a script-come un ragazzo di programmazione in lingua, direi di controllare l'ambiente di (un termine tecnico per parlare di accesso ai nomi ). Nel caso di Lua, per esempio, è necessario consegnare la sceneggiatura di ogni utente un ambiente che permette all'utente di nome esattamente le funzionalità che si desidera che l'utente abbia, e non di più. Se lo script non può nominare, esso non può essere utilizzato. Questo lavoro è generalmente chiamato sandboxing . (Come in, "mettere l'utente in una sandbox e non li lasciate fuori.") Sandboxing tramite il controllo dello spazio dei nomi è usuale in altre lingue oltre Lua.

  

Mi sono sempre chiesto come le applicazioni Enterprise fatto questo trucco (e motori di gioco troppo ...)

Non so come riassumere questo trucco abbastanza breve per una risposta SO. Ma l'idea generale è:

  • Il linguaggio di scripting ha un interprete di bytecode

  • C'è un protocollo accuratamente progettato per la chiamata tra gli script e C

Per una visione più profonda, letto il libro di Roberto Programmazione in Lua ; prima edizione è gratuita on-line.

Altri suggerimenti

Non sono sicuro che tutto seguo le vostre esigenze, ma sarebbe qualcosa di simile a un RESTful avvicinarsi lavoro per voi? REST di solito è pensato in termini client / server, ma credo che alcune delle idee potrebbero essere applicabili anche qui.

Il concetto di base potrebbe essere che si espone le rappresentazioni degli oggetti (probabilmente in JSON o XML) tramite l'API. Il cliente avrebbe prendere queste rappresentazioni, apportare tutte le modifiche che volevano, e quindi inviare le versioni modificate di nuovo al vostro programma. Il vostro programma dovrebbe confermare le modifiche e (ammesso che fossero legali) li applicano.

Questo sembra che permetterebbe di essere piuttosto agnostica su che tipo di linguaggi di scripting sono stati utilizzati, dovrebbe essere flessibile e di facile comprensione per gli utenti, e ti dà un posto chiaro per implementare i criteri di protezione.

Per inciso, mentre non ho idea se questo è come script motori di gioco di lavoro, ho visto alcuni sistemi Enterprise che API esposte simile a questo (anche se di solito come un servizio web, piuttosto che accettare gli script scritti dagli utenti).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top