2011-03-16 14 views
23

Attualmente sto creando un server di giochi (non un motore) e voglio che sia estensibile, come un sistema di plugin.
La soluzione che ho trovato è usare un linguaggio di scripting. Fin qui tutto bene.Ruby vs Lua come linguaggio di scripting per C++

Non sono sicuro se dovrei usare Ruby o Lua. Lua è più facile da incorporare, ma Ruby ha una libreria più grande e una sintassi migliore (secondo me). Il problema è che non esiste un modo semplice per utilizzare Ruby come linguaggio di scripting con C++, mentre è molto semplice con Lua.

Toughs su questo? Suggerimenti per l'utilizzo di Ruby come linguaggio di scripting (ho provato SWIG, ma non è così pulito come usare Lua)?

Grazie.

+5

Se pensi che Lua sia troppo semplicistica e Ruby troppo difficile da integrare, forse dovresti considerare Python? – Macke

+2

Se stai esponendo una base di codice (specialmente un server) vuoi davvero una grande libreria? Puoi dedicare più tempo a rimuovere le pericolose funzionalità della libreria che gli utenti possono sfruttare quando si tratta di sandboxing. –

risposta

8

Ho usato Lua ampiamente nel passato.

Luabind è davvero facile da usare, non c'è bisogno di un generatore esterno come SWIG, il doc è ottimo. I tempi di compilazione rimangono decenti.

Il più grande problema che ho visto: lua è principalmente ... di sola scrittura. In realtà non hai classi, ma solo array associativi con un po 'di zucchero sintattico (oggetto [' chiave '] può essere scritto object.key), così puoi facilmente aggiungere un' membro 'in una funzione oscura, completamente dimenticare su di esso, e hanno effetti collaterali più tardi.

Per questo motivo, e solo per questo motivo, preferirei Python. Boost :: Python è la base di Luabind, quindi entrambi hanno un'API simile (Luabind era leggermente più semplice da compilare ma non più). In termini di funzionalità, sono abbastanza equivalenti.

Non correlato direttamente: nessuno di questi può essere utilizzato in modo affidabile in un ambiente con multithreading (quindi ciò dipende dalla complessità del server).

  • N thread Python: il GIL (Global Interpreter Lock) è sulla buona strada. Ogni volta che si utilizza una variabile in una discussione, è bloccata, quindi rovina il punto, ad eccezione delle lunghe operazioni di I/O e delle chiamate alle funzioni C.
  • lua ha coroutine, ma non sono parallelizzabili.
  • discussioni di Ruby non sono realmente le discussioni, ma simile a coroutine di Lua

Si noti che è comunque possibile creare un environement per ogni thread, ma non sarà in grado di comunicare (se non con un macchinario C++) . Questo è particolarmente facile a Lua.

+1

Con Lua, la cosa multi-threading può essere risolta usando [LuaLanes] (http://kotisivu.dnainternet.net/askok/bin/lanes/). – jpjacobs

+4

@ Calvin1602 Le versioni più recenti di Ruby (1.9+) utilizzano thread di livello di sistema reali. Tuttavia ha ancora un GIL, che lo pone sullo stesso piano di Python. – dunedain289

+0

@ dunedain289: bello sapere, grazie. @jpjacobs: Sono a conoscenza di LuaLanes, ma non l'ho mai provato. Sembra un po '"innaturale", ma dovrei provarlo. – Calvin1602

0

Vorrei andare con quello che era più facile da imparare/ha il maggior numero di giocatori che lo utilizzano. Vuoi che sia il più possibile accessibile ai tuoi clienti.

+0

Perché dovrebbe essere importante il numero di giocatori? –

5

Potresti essere interessato a conoscere Squirrel. Credo che sia stato il linguaggio di scripting utilizzato da Left 4 Dead 2. È più avanzato di lua (usa oggetti e classi) ed è pensato per essere facilmente incorporato in un'applicazione C++, che suona esattamente come quello che stai cercando.

+0

Grazie. Ci sono libri sull'incorporazione del linguaggio Squirrel in C++? – bl00dshooter

+0

Nessuno, per quanto ne so, è un linguaggio di scripting abbastanza nuovo. Non lasciarti ingannare dal '3.0', è in circolazione dal 2004, ma non è stato usato tanto quanto altri linguaggi di scripting. La documentazione (collegata alla pagina principale) sembra buona. – James

10

Ho cercato di incorporare Ruby in C/C++ e mi è sembrato estremamente difficile. Ci sono un sacco di sfide che affronterai:

  • mettere in rubino da C/C++ richiede 2 strati di funzioni da scrivere (uno strato di chiamare, e uno per la cattura eccezioni)
  • Richiamo in C/C++ da Ruby richiede normale SWIG-tipo di lavoro
  • lo spostamento dei dati avanti e indietro richiede tenere traccia accurata degli stanziamenti, dal momento che rubino vorrà spazzatura raccogliere nulla può

sono sicuro che questo può fare, ma sembrava e xtremely difficile per me, solo fattibile se puoi saltare in Ruby in un minimo di punti di ingresso.

2

Vai per lua, anche se ti consiglierei luajit, non solo per la velocità, ma per la nuova libreria ffi, aumentando l'intercomunicazione al massimo :). Lua ha anche toni di moduli, e quelli nuovi sono molto facili da creare, questo compensa la mancanza del suo stdlib.

1

Una cosa che Lua sta facendo è la sua capacità di trasferire i dati tra C++ (o C) e se stesso molto facilmente. In sostanza stai solo spingendo/saltando i dati su una pila per comunicare tra i due. Anche avere più ambienti Lua attivi e in esecuzione allo stesso tempo è abbastanza semplice (se dovessi aver bisogno di quella funzionalità). Anche se Lua è un linguaggio spazzato, è facile impedirgli di farlo su dati che devono rimanere nel codice C++. Creare un sistema di plugin estensibile dovrebbe essere facile con Lua una volta che hai gettato le basi. Scambiare i plug-in (in questo caso, gli script) dentro e fuori al runtime è anche piuttosto banale (anche se questo può essere vero anche per Ruby, non ne ho abbastanza familiarità da sapere).

Una cosa a cui pensare è quanto roba orientata agli oggetti vuoi che i tuoi script siano in grado di gestire. Lua utilizza funzioni, tabelle, metacli e prototipi per implementare la programmazione di tipo OO. Ad alcune persone piace, altri no; personalmente l'ho trovato interessante da usare, a volte un po 'goffo. Non avendo usato Ruby, non posso parlare per questo, ma potresti voler valutare il tuo bisogno di supporto per oggetti/classi.

Penso che nella tua situazione dovresti anche considerare quanto velocemente vuoi che il tuo progetto sia attivo e funzionante. Come tu e altri avete notato, Ruby è difficile da incorporare in C++, mentre Lua no. Il tempo è sempre prezioso e se vuoi far funzionare qualcosa al più presto, Lua è probabilmente la soluzione migliore.

Problemi correlati