Con quale linguaggio funzionale è più adatto creare giochi? [chiuso]


19

Ho tenuto d'occhio i linguaggi di programmazione funzionale per un po ', ma esito ad approfondirli. Ma penso che sia giunto il momento di iniziare almeno a guardare quella direzione per essere sicuro di essere pronto a tutto.

Ho visto parlare di Haskell, F #, Scala e così via. Ma non ho idea delle differenze tra le lingue e le loro comunità, né mi interessa particolarmente; tranne nel contesto dello sviluppo del gioco.

Quindi, dal punto di vista dello sviluppo del gioco, quale linguaggio di programmazione funzionale ha le caratteristiche più adatte alla programmazione di gioco? Ad esempio, ci sono librerie / motori / framework di sviluppo di giochi funzionali o motori grafici per linguaggi funzionali? Esiste un linguaggio che gestisce meglio alcune strutture di dati che vengono comunemente utilizzate nello sviluppo di giochi?

In conclusione: quale linguaggio di programmazione funzionale è il migliore per la programmazione di giochi funzionali e perché?

Credo / spero che questa domanda dichiari una lingua chiaramente chiara, quindi non l'ho contrassegnata CW nonostante la sua tendenza soggettiva.


2
"Cosa intendi con giochi 2D o giochi 3D?" "Eh? Non lo so - aieeee "
Ciclope,

@Cyclops uh, cosa? Non capisco ...
Ricket,

@Ricket, in parte è stata una richiesta per chiarire di che tipo di gioco stai parlando, 2D o 3D (e forse in tempo reale o a turni). In parte era uno scherzo di Monty-Python che oscurava la prima parte. Adottate successivamente. :) E penso che specificare il tipo di gioco sia utile - a meno che non esista un unico linguaggio funzionale che sia perfetto per tutto , allora lingue diverse potrebbero essere migliori in cose diverse.
Ciclope,

Non credo che il 2D o il 3D abbiano un impatto sulla scelta della lingua, tranne che per la varietà di motori / librerie disponibili per una lingua. Sono personalmente interessato sia al 2D che al 3D, quindi non stavo pensando all'uno o all'altro quando scrivo questa domanda. Ma nel complesso, i giochi 2D e 3D condividono molti sistemi e strutture dati comuni (ad es. Audio, input, AI, struttura del programma, loop di gioco) e ci sono molti giochi 3D che possono essere portati in 2D o viceversa. E sì, non ho visto Monty Python, quindi è per questo che non l'ho capito affatto. :)
Ricket,

1
Non credo che ci sia una risposta definitiva sulla lingua migliore.
Wei Hu,

Risposte:


12

F # fa parte della famiglia Microsofts .net ha accesso a XNA, che è una base fantastica per la costruzione di giochi. Un po 'di googling rivela alcuni tutorial, video e articoli. Anche i grandi documenti XNA dovrebbero aiutare.

C'è stato qualche movimento nei giochi anche per Haskell, vedi qui . Probabilmente utilizzerai i collegamenti openGL.

Poiché Scala suona in terra Java, si integra con tutti i motori / collegamenti Java disponibili, vedere questo post SO .

Penso che dipenda dalle preferenze, mentre ho giocato solo con Haskell, immagino che ogni linguaggio funzionale abbia le sue idiosincrasie. Potrebbe valere la pena preparare un piccolo gioco di prova in ognuno di essi e vedere quale ti fa sentire meglio.

Come ho detto, ho solo un'esperienza Haskell minima, quindi non posso commentare il meglio, ma queste risorse dovrebbero iniziare speriamo.


2
Tra i problemi con le JVM e l'immaturità dell'implementazione del compilatore, ho trovato le prestazioni di Scala inaccettabili quando si utilizza uno stile funzionale, anche se il linguaggio stesso lo supporta bene. Finisce per essere veloce come, diciamo, Python o Ruby, non F # o OCaml. (La velocità di Scala è competitiva per più OO / stili procedurali.)

In realtà ho un progetto F # che esegue XNA (che è una finestra XNA vuota con blu fiordaliso, solo il codice era F # e non C #.
RCIX,

8

Direi Lisp.

È stato usato nei giochi come linguaggio di scripting, almeno in Naughty Dog (o credo), ed è un linguaggio molto maturo.

Il vantaggio di Lisp è nella deserializzazione, che è una parte importante di ciò che chiamiamo gestione patrimoniale. Deserializzare lisp è banale, il codice e i dati sono uno. Ciò semplifica la creazione di un formato file per risorse e comportamenti. Non è come te uno in json / xml / yaml / bin e un file F # per AI. Puoi salvare tutto come espressioni s che semplificheranno molto la pipeline delle risorse.


TBH lo sconsiglio. I linguaggi di scripting non sono solo per lo sviluppatore da utilizzare; i modder vorranno modificare il gioco e non c'è nulla che li spaventerà più velocemente di (() ()))) () ((()). Inoltre, anche per quanto riguarda i linguaggi funzionali, Lisp è esoterico.
RCIX

7
Se spaventare i modder è qualcosa che ti preoccupa, scegliere un linguaggio funzionale non è probabilmente la mossa giusta.
Paul Wicks,

3
@RCIX & @Joe - I poteri Necro ATTIVANO. Comunque, Scheme è usato come lingua di insegnamento. SICP è qualcosa come mezzo grado CS in un libro ed è usato da un gruppo di scuole (incluso il MIT fino a poco tempo fa), e HTDP è un'introduzione meno hardcore.
Jesse Millikan,

1
@RCIX e Joe davvero. lisp e schema sono le lingue introduttive in molte università.
oberhamsi,

1
Lisp non è qualcosa che vuoi usare. Naughty Dog aveva UNO, singolo programmatore Lisp e quando ha smesso hanno trasferito tutti i loro motori in C ++. Non ho idea del perché un motore obsoleto di un'azienda venga trascinato sempre come un brillante esempio =)
Patrick Hughes,

8

Dopo aver acquisito un po 'di esperienza pratica, voterei per Clojure - già scritto un piccolo gioco al suo interno, e ho intenzione di fare di più.

Motivi:

  • Produttività - Clojure è un linguaggio dinamico. Ha ottime funzionalità per lo sviluppo interattivo in stile REPL, ad esempio è possibile utilizzare REPL per interrogare o modificare lo stato all'interno di un'istanza di un'applicazione di gioco in esecuzione. Anche il codice in Clojure è spesso ridicolmente conciso. Immagino di essere 3-5 volte più produttivo in Clojure che in Java o C #.
  • Impuro - mentre apprezzo la bellezza e l'eleganza di linguaggi puramente funzionali come Haskell, la programmazione del gioco è una ricerca disordinata in cui vince il pragmatismo. Voglio essere in grado di aggiungere effetti collaterali alle mie funzioni quando ne ho bisogno e Clojure lo consente. Detto questo, lo stile idiomatico Clojure deve essere puramente funzionale per la maggior parte del tempo .
  • Metaprogrammazione - L'eredità Lisp di Clojure come linguaggio omoiconico lo rende ideale per la metaprogrammazione / generazione di codice. È facile "estendere il linguaggio" per creare i propri DSL o eliminare il biolerplate. Puoi facilmente usare Clojure come proprio linguaggio di scripting di gioco e la compilazione dinamica del codice significa che i tuoi script verranno eseguiti altrettanto velocemente del tuo motore di gioco principale.
  • Accesso alle librerie Java . Puoi usare tutte le librerie audio / grafiche / AI / di rete di Java, il che è un enorme vantaggio rispetto alla maggior parte degli altri linguaggi funzionali (dove dovrai scriverli da zero o sviluppare un codice di interfaccia molto complicato). Questo può essere un salvavita.
  • Multipiattaforma : questo viene offerto gratuitamente dalla JVM, ma è un bel bonus.
  • Prestazioni : per un linguaggio funzionale dinamico, Clojure è il più veloce possibile. Viene sempre compilato JIT, mai interpretato. con l'ottimizzazione intelligente è possibile abbinare la velocità del codice Java puro di basso livello in Clojure. Ad esempio, è possibile utilizzare array primitivi Java o fornire suggerimenti sul tipo per garantire che il compilatore produca chiamate di funzione tipizzate staticamente in codice critico per le prestazioni.
  • Concorrenza - Clojure ha un ottimo modello per la gestione dello stato simultaneo, supportato da un impressionante sistema di memoria transazionale del software. Vale la pena vedere questo video per ulteriori approfondimenti su come funziona.

L'unica volta che non prenderei in considerazione Clojure sarebbe se stessi scrivendo un gioco graficamente all'avanguardia in cui hai bisogno di prestazioni all'avanguardia (dove penso ancora che tu abbia bisogno di C / C ++).

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.