Linguaggi specifici del dominio per gli script [chiuso]


12

Come molti di voi sanno, gli interpreti incorporati per linguaggi come Lua e Python sono ampiamente usati per la logica dei giochi di scripting, ma non ho visto molte informazioni su persone che usano linguaggi specifici del dominio per i loro script, ad esempio costruendo un dialetto di script di logica "in cima al linguaggio usato per il resto del gioco, usando macro o una programmazione fluente o quant'altro.

Quindi le mie domande sono le seguenti:

  • Quali esempi di tali DSL hai visto nei giochi del mondo reale?
  • Quali problemi sono stati riscontrati?
  • Consiglieresti questo percorso ad altri sviluppatori di giochi e in quali circostanze?
  • Ritieni che questo diventi più comune mentre lo sviluppo del gioco si sposta verso linguaggi più amichevoli alla metaprogrammazione, ad esempio Boo?

Per rispondere alla domanda reale sull'utilizzo di DSL Battlefield 1942 li usò. Sebbene siano apparse molte mod; dal punto di vista dei programmatori (la mia) è stato orribile e ho perso interesse molto rapidamente.
Jonathan Dickinson,

Risposte:


6

Il mio consiglio sarebbe "non".

Ho usato un linguaggio di markup specifico del dominio per i dati di gioco. È stato un dolore. Ho passato giorni a progettarlo, e poi ogni settimana o due dovevo modificarlo per aggiungere altre funzionalità. A un certo punto mi sono reso conto che dovevo generare automaticamente alcuni dei miei dati di gioco e ho finito per scrivere un piccolo programma per analizzare i file di input nel linguaggio di markup, massaggiarli e produrre file diversi anche nel linguaggio di markup.

Onestamente non ho idea di cosa stavo pensando. L'intera cosa sarebbe stata più semplice, più efficiente, meno vulnerabile e molto meno dispendiosa in termini di tempo se avessi appena usato Lua.

Se stai lavorando su un sistema così limitato che non puoi avviare un ambiente Lua, allora forse dovresti usare un DSL, ma essere pronto per l'agonia. Altrimenti credo fermamente che dovresti semplicemente usare Lua. Lua è stato originariamente progettato come un semplice linguaggio di markup dei dati ed è ancora estremamente favorevole all'uso come tale, e quando (non se) ti rendi conto di aver bisogno di qualcosa di più complicato, ce l'hai già. Tutto il mio attuale sviluppo del gioco è fatto in Lua e non sono mai stato più efficiente o meno soggetto a bug.

Non posso raccomandare abbastanza contro DSL abbastanza forte.


Ehm, perché no? Hai appena usato Lisp, penso che sarebbe stata un'esperienza molto più piacevole. :) Starcraft II ha il linguaggio di scripting Galaxy, che in effetti è un linguaggio specifico del dominio rivolto a ragazzi / ragazze non tecnologici.
jacmoe,

3
Lisp non sarebbe un DSL più di Lua o Python. Sarebbe un linguaggio pienamente formato che qualcun altro ha trascorso molto tempo a progettare, tempo che puoi evitare di spendere te stesso.
coderanger

2

Non ho visto molte informazioni su persone che usano linguaggi specifici del dominio per i loro script, ad esempio costruendo un po 'di dialetto di script logico in cima al linguaggio usato per il resto del gioco, usando macro o una programmazione fluente o quant'altro.

I linguaggi di scripting tendono ad essere una proposta costosa nei giochi. Anche Lua, che è abbastanza veloce, è ancora molto più lento del codice nativo. Le squadre di gioco sono in genere disposte a subire quel colpo solo perché in cambio offre loro due enormi vantaggi:

  1. La possibilità di modificare gli script senza dover ricompilare e ricaricare il gioco.
  2. La capacità per i non programmatori di scrivere script.

I DSL non ti danno questo, sfortunatamente.


Direi che 2) è un'aringa rossa. Per qualsiasi script sufficientemente interessante, un non-programmatore avrà bisogno di più aiuto di gestione manuale o di debug di quanto ne valga la pena. Ci sono bravi programmatori-designer là fuori che non hanno bisogno di aiuto, ma non puoi schiaffeggiare Lua For Dummies sulla scrivania di un designer di livello regolare e aspettarti che si divertano.
tenpn,

Sono d'accordo. Non credo che il n. 2 funzioni bene nella pratica, ma l'ho visto usato come una ragione apparente per integrare un linguaggio di scripting.
munificente

Ci sono molte persone con buone idee di gioco che sanno scrivere gli script di Lua ma non mi fiderei mai vicino a malloc / sprintf / in qualsiasi posto dovevano scegliere una struttura di dati / ecc. Questo è davvero ciò che significa # 2: "La capacità per i programmatori malvagi di causare danni minimi e continuare a lavorare".

Potrebbero non causare perdite di memoria con uno script, ma un cattivo programmatore può ancora scrivere codice errato, non mantenibile e lento. Programmatori errati non dovrebbero essere ammessi in prossimità del gioco. Assumi designer con comprovata esperienza di scripting e starai bene.
dieci

2

Trovo curioso che la tua domanda si limiti ai DSL interni , dal momento che preferirei raccomandare l'uso di un DSL esterno al fine di ottenere la possibilità di caricare script in fase di esecuzione e soprattutto per consentire ai non sviluppatori di scrivere la logica di gioco nel DSL .

Ad esempio, il mio progetto attuale utilizza un (per ora) semplice DSL esterno per specificare parte della logica di gioco che consente ai progettisti di effettuare test di bilanciamento principalmente senza intervento di sviluppo.

Ovviamente dovrai scrivere un parser; a tal fine, penso che lo strumento più raccomandato sia ANTLR che si rivolge a parecchie lingue . Nel mio progetto, però, abbiamo seguito la strada del combinatore parser con jParsec (il nostro backend è Java, ci sono varianti in altre lingue) che è abbastanza bello per la sua stretta relazione con BNF ma forse meno ben documentata.


2

Il mio consiglio sarebbe: fare !

Ma solo se ne hai bisogno.

Non è necessario creare un DSL se lo utilizzerai da solo, internamente.

Galaxy è il linguaggio di scripting utilizzato dall'editor Startcraft II. È un ottimo esempio di una lingua specifica del dominio.

Si rivolge ai progettisti di giochi piuttosto che ai programmatori:

Timer - Start Raise Lava Timer as a One Shot timer that will expire in 20.0 Game Time seconds
Variable - Set Raise Lava Timer = (Last started timer)
Timer - Create a timer window for (Last started timer), with the title "Lava will raise in: ", using Remaining time (initially Visible)
Variable - Set Lava Timer Window = (Last created timer window)
Timer - Show (Last created timer window) for (All players)
Variable - Set Lava Death? = false

Tutorial di esempio

Lisp è il linguaggio perfetto da usare per creare linguaggi specifici del dominio, ma ovviamente ci sono altre opzioni. Come Boo.

In questo modo i tuoi designer / modder non devono imparare la programmazione, anche se è solo Lua, continua a programmare.

Modifica: vorrei aggiungere che un DSL può essere implementato in un linguaggio di scripting - non è sinonimo di non utilizzare un linguaggio di scripting. Soprattutto se stai usando Lisp o simili, dal momento che si presta molto bene per creare linguaggi specifici di dominio.


1

I dsls interni sono solo zucchero sintattico su una buona API. L'API è la cosa più importante. Dopo avere una buona API creare un dsl è banale e non è così importante.


0

Probabilmente UnrealScript è un DSL. Sembra che abbia fatto il suo lavoro, anche se penso che sia possibile rendere i linguaggi di script di gioco ancora più "specifici del dominio". Consiglierei di fare un DSL se c'è qualcosa di specifico nel dominio che trarrà beneficio dalle modifiche della lingua - ho alcune idee in questo settore ma nulla è stato completamente formata al momento.

Ritieni che questo diventi più comune mentre lo sviluppo del gioco si sposta verso linguaggi più amichevoli alla metaprogrammazione, ad esempio Boo?

Tuttavia, non credo che un motore abbastanza nuovo che supporti una lingua sia la prova dello sviluppo del gioco che si muove in una determinata direzione. Sono ancora i primi giorni.


0

Se ciò di cui hai veramente bisogno è un linguaggio di programmazione per scopi generici, far rotolare il tuo è quasi certamente un errore. Se la tua lingua sembra aver bisogno di variabili, valutazione delle espressioni, loop, condizionali, classi, funzioni e simili, allora attenersi meglio a un linguaggio noto come Lua, Lisp, Python, JavaScript, ecc. [Unreal ha abbandonato il loro.]

Ma se ciò di cui hai bisogno riguarda principalmente la definizione dei dati; è forse dichiarativo piuttosto che imperativo; forse definisce stati e regole (come GDL); e non ha bisogno della maggior parte di ciò che un linguaggio GP fa bene, quindi considera un DSL.

Ma attenzione: la creazione di lingue e compilatori può essere molto difficile e l'esperienza precedente è di grande aiuto. Vorrei raccomandare un parser PEG (esso stesso un DSL) basato su una grammatica EBNF (un altro DSL), e se è una domanda troppo grande, allora meglio non provare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.