Cosa cerchi in un linguaggio di scripting? [chiuso]


10

Sto scrivendo un po 'di linguaggio incorporato per un altro progetto. Mentre lo sviluppo del gioco non era il suo intento originale, sta iniziando a sembrare una buona scelta, e immagino che lo svilupperò in quella vena ad un certo punto.

Senza rivelare alcun dettaglio (per evitare distorsioni), sono curioso di sapere:

Quali caratteristiche ami in un linguaggio di scripting per lo sviluppo di giochi?

Se hai utilizzato Lua, Python o un altro linguaggio incorporato come Tcl o Guile come linguaggio di scripting principale in un progetto di gioco, quali aspetti hai trovato più utili?

  • Caratteristiche del linguaggio (lambda, classi, parallelismo)

  • Funzionalità di implementazione (ottimizzazioni delle prestazioni, JIT, accelerazione hardware)

  • Funzionalità di integrazione (collegamenti C, C ++ o .NET)

  • O qualcosa di completamente diverso?


2
Offuscamento: perché se può essere offuscato, probabilmente è anche abbastanza flessibile. Prendiamo Perl, ad esempio, che può essere offuscato nella misura in cui sembra l'uscita causata dal rumore di linea da un modem a 300 bps (quando qualcun altro ha preso un telefono dall'altra parte della casa) nei giorni in cui questi erano veloce. ;-P
Randolf Richardson,

1
@Randolf: buon punto. L'unico problema dell'offuscamento è che tende a fare affidamento su una lingua stabile, che le lingue giovani non lo sono. Un offuscatore che funziona con 0.10 potrebbe non funzionare con 0.11.
Jon Purdy,

@Jon Purdy: è corretto (+1 per te). C'è anche l'aspetto del codice offuscato che è più difficile da mantenere. La cosa importante da notare, tuttavia, è che l'offuscamento può fornire una misura interessante di quanto sia flessibile una lingua.
Randolf Richardson,

5
@Randolf: quando il perl non sembra così?
Ken,

1
@Joe Wreschnig Sta dicendo 'quale dovrei scegliere', questo è più 'quali funzionalità sono buone in un linguaggio di scripting'.
Il comunista Duck il

Risposte:


4

Sto cercando due cose: velocità e integrazione. Di solito i due vanno insieme e con familiarità. Sfortunatamente, per C ++, non ci sono praticamente linguaggi che offrono velocità e integrazione. Ho usato Lua e ha fatto schifo, in modo orribile. Ho passato tutto il tempo a scrivere collegamenti e in nessun posto abbastanza vicino a scrivere codice.

Caratteristiche del linguaggio? Il punto di incorporare un linguaggio di scripting non è che possa avere caratteristiche di linguaggio dinamico sibilante che la mia lingua originale non aveva, è che possa essere interpretato in fase di esecuzione . Non mi interessa davvero, purché sia ​​sostanzialmente funzionale, quindi va bene e si adatta al mio linguaggio host (in questo caso C ++). Tuttavia, sorprendentemente, i linguaggi progettati per essere integrati nelle applicazioni host falliscono completamente nella parte relativa all'integrazione .

Ho bisogno di co-routine? No, non ho bisogno di co-routine. Ho bisogno di una digitazione dinamica? No, ho bisogno di sapere quali tipi mi stanno tornando dal mio linguaggio di scripting e poiché tutto il mio codice esistente è basato su una tipizzazione molto forte, mi piacerebbe davvero che anche il mio codice di script fosse in grado di rispettarlo. Ho bisogno della raccolta dei rifiuti? No, i miei tipi gestiscono già le proprie risorse e sicuramente voglio la distruzione deterministica. Voglio andare? No, voglio fare eccezioni.

Il problema che ho riscontrato è che sostanzialmente tutti i linguaggi di scripting esistenti sono stati progettati per estendere C, non C ++, e non supportano correttamente il modello C ++ in molti modi, e inoltre hanno una semantica totalmente diversa. Come posso tradurre shared_ptr, che è la distruzione deterministica automatica, in un ambiente raccolto dalla spazzatura? Puoi scrivere qualunque libreria di wrapping tu voglia, non cambierai la semantica della lingua sottostante essendo incompatibile con la lingua che stai cercando di estendere con essa. Come posso assicurarmi che questo void*sia il tipo giusto? Come posso gestire l'eredità? Come faccio a lanciare e catturare le eccezioni? Semplicemente non funziona.

Un buon linguaggio di scripting per C ++ verrebbe tipizzato staticamente, valorizzando la semantica, deterministicamente distrutto, gettando e catturando le eccezioni e rispettando i miei distruttori / costruttori / costruttori di copie, perché allora tutti i miei tipi funzioneranno semplicemente, bene e facilmente, e il linguaggio risultante sarà veloce e supporta tutta la mia semantica originale, facile da associare.


Dovresti provare qualcosa come questa libreria wrapper che ho scritto di recente per risolvere alcuni degli stessi problemi che stavi riscontrando. Puoi usare shared_ptrs e cose con esso bene, è sicuro (per quanto possa essere comunque), puoi decidere se vuoi la vita di qualcosa controllata dal tuo codice o dall'ambiente Lua, supporta l'ereditarietà ed è estremamente simile alla normale API Lua. Non sono sicuro di ricevere il reclamo di creare associazioni, ma uso solo frammenti di VIM per rendere le associazioni il 99% delle volte.
Alex Ames,

2

Per i giochi basati sul Web, tre fattori importanti per me sono:

  • Familiarità
  • Velocità
  • Integrazione

Mi piace particolarmente Perl, in parte perché ho già familiarità con la lingua e perché con un modulo web server come mod_perl2 si ottengono enormi vantaggi in termini di prestazioni e integrazione - mod_perl2 mantiene una versione compilata degli script nella RAM (che sono solo interpretati primo caricamento) che gli dà un vantaggio di velocità maggiore rispetto ad altri linguaggi interpretati che non hanno opzioni di compilazione, e si integra anche nel server HTTPd Apache con un'API ricca di funzionalità che fornisce l'accesso a molte funzionalità molto potenti.

Questi fattori possono essere utili per lo sviluppo di giochi basati sul web (e dove è necessario l'accesso al database, la memorizzazione nella cache delle connessioni al database aiuta a ridurre ulteriormente i tempi di risposta per gli utenti). Naturalmente, questa potrebbe non essere la soluzione più ideale per ogni cosa poiché ogni lingua ha i suoi vantaggi (e svantaggi), ma ha sempre funzionato bene per le mie esigenze.


2

Organizzato in ordine di importanza (decrescente):

  • Leggibile a colpo d'occhio. In realtà, questo è un requisito per qualsiasi lingua che voglio usare, ma per lo script è probabilmente più importante: gli script, per definizione, cambiano più spesso del codice "core". Quindi, nessun LISP o PERL.
  • Concisione. Gli script vengono costantemente scritti e riscritti e la digitazione di un sacco di codice "boilerplate" è inefficiente.
  • Debug semplice. Preferibilmente con punti di interruzione, passaggio ecc.
  • Facile integrazione con la mia tecnologia "core" prescelta. Se sto usando C ++ per il mio gioco, avrei bisogno di buoni collegamenti C ++, come in LUA. Se il gioco è in C #, sceglierei un linguaggio basato sulla CLI: C #, IronPython, Boo.
  • Caratteristiche del linguaggio: semplici array associativi, coroutine, forse lambda. In realtà, questo dipende principalmente da cosa userò gli script. Gli script AI sono diversi, ad esempio, dagli script di inizializzazione.
  • Buona documentazione C # ha un intero MSDN dedicato ad esso e Boo ha solo fonti. ecco perché C # è molto meglio.
  • Buon ambiente di sviluppo. VS o Eclipse batte Notepad ogni volta.

+1 Questo mi aiuta parecchio, grazie. Aspetterò di vedere se ci sono ulteriori discussioni, ma penso che tu l'abbia coperto bene.
Jon Purdy,
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.