Pianificazione / sospensione di interpreti incorporati

1

Diciamo che voglio incorporare un motore di scripting in qualche altro programma, per consentire agli utenti di creare comportamenti personalizzati per gli oggetti.

Ad esempio, quando si verifica un evento particolare, il server avvia un motore di scripting incorporato ed esegue uno script di risposta agli eventi fornito dall'utente da ciascun attore. Concettualmente puoi immaginarlo come un copione di un film. Un nuovo personaggio entra nella scena. Ognuno degli attori nella scena deve ora rispondere al nuovo arrivo e tale comportamento è governato dagli script forniti dall'utente.

Ora posso avviare un interprete incorporato che eseguirà gli script forniti dall'utente, ma ho bisogno in qualche modo che l'applicazione principale esegua il "timeslice" o la programmazione di tali sottoprocessi.

Ad esempio, potrebbe esistere una regola che dice che ogni attore può eseguire un'azione al secondo. Quindi, dopo che un attore ha eseguito l'unica azione, mi piacerebbe sospendere il loro interprete fino alla prossima occasione di recitare.

Un altro modo in cui pensavo di implementarlo era che gli attori rilasciassero volontariamente il controllo. per esempio. la loro sceneggiatura potrebbe andare "salutamene, dormi 1000 millis: braccia d'onda, dormi 1000 mulini"; Se avessi intenzione di farlo potrei anche dare loro un pulsante "crash me" per spingere pure.

Se dovessi distruggere o reinserire gli interpreti, avrei anche bisogno di un modo per memorizzare il contatore stato / programma in modo che potesse riprendere.

Sto anche considerando di eseguirli come thread o processi separati, ma non sono sicuro di quanto esattamente controllo avrò su di loro, di essere in grado di sospendere e riprendere un thread o sottoprocesso in questo modo. Modifica: anch'io dipenderei dal comportamento dei client per sincronizzare tutto, proprio come se dipendessi da loro per dormire.

Mi è stato detto che si tratta di un modello di progettazione di gioco comune, ma non riesco a trovare alcuna informazione utile su come implementarlo. Ho esaminato interpreti incorporati, ad esempio Nashorn JS in Java o Lua in C ++ e non sembrano supportare la sospensione dell'interprete, che sarebbe "semplice" per farlo.

Qualcuno può dare delle linee guida qui? Al momento penso che il controllo del thread o del processo potrebbe essere la soluzione migliore?

Modifica: Non voglio davvero scrivere il mio interprete ... anche se, se lo facessi, potrei ovviamente sospenderlo a volontà. Sarebbe molto lavoro anche per una macchina stack di base.

Modifica: sto iniziando a pensare che ho bisogno di un interprete personalizzato che io dica di "eseguire 100 opcode (ecc.), quindi di dormire".

    
posta gecko 16.01.2016 - 19:20
fonte

1 risposta

1

Un interprete deve essere definito specificamente per questo problema. Nello specifico, molti interpreti utilizzano lo stack di chiamate di sistema nativo per archiviare i contesti (ad esempio, si chiamano in modo ricorsivo, ad esempio per interpretare le chiamate di funzione). Un tale interprete non può essere prontamente sospeso. Invece, l'interprete dovrà memorizzare le continuazioni delle chiamate di funzione direttamente.

Python senza pila è un'implementazione di questa tecnica che è popolare nel settore dello sviluppo di giochi.

    
risposta data 18.01.2016 - 10:56
fonte

Leggi altre domande sui tag