W jakim języku funkcjonalnym najlepiej nadaje się do tworzenia gier? [Zamknięte]

19

Od jakiegoś czasu mam oko na funkcjonalne języki programowania, ale waham się, czy naprawdę się w nie wpakować. Ale myślę, że już najwyższy czas, żeby przynajmniej spojrzeć w tamtą stronę, aby upewnić się, że jestem gotowy na wszystko.

Widziałem rozmowy o Haskell, F #, Scali i tak dalej. Ale nie mam pojęcia, jakie są różnice między językami i ich społecznościami, i nie obchodzi mnie to szczególnie; z wyjątkiem kontekstu tworzenia gier.

Więc z punktu widzenia rozwoju gry, który funkcjonalny język programowania ma najwięcej funkcji odpowiednich do programowania gier? Na przykład, czy są jakieś funkcjonalne biblioteki do tworzenia gier / silniki / frameworki lub silniki graficzne dla języków funkcjonalnych? Czy istnieje język, który lepiej obsługuje niektóre struktury danych, które są powszechnie używane w tworzeniu gier?

Konkluzja: jaki funkcjonalny język programowania jest najlepszy do funkcjonalnego programowania gier i dlaczego?

Wierzę / mam nadzieję, że to pytanie zadeklaruje najlepszy najlepszy język, dlatego nie zaznaczyłem go jako CW pomimo jego subiektywnej tendencji.

Ricket
źródło
2
„Co masz na myśli mówiąc o grach 2D lub grach 3D?” „Hę? Nie wiem - aieeee
Cyclops
@Cyclops co? Nie rozumiem ...
Ricket
@Ricket, częściowo była to prośba o wyjaśnienie, o jakim typie gry mówisz, 2D lub 3D (a może w czasie rzeczywistym lub turowym). Częściowo był to żart Monty-Python, który przesłaniał pierwszą część. Wups. :) I myślę, że określenie rodzaju gry jest przydatne - chyba że istnieje jeden język funkcjonalny, który jest idealny do wszystkiego , wtedy różne języki mogą być lepsze w różnych rzeczach.
Cyklop
Nie wierzę, że 2D lub 3D wpływają na wybór języka, z wyjątkiem różnorodności silników / bibliotek dostępnych dla danego języka. Osobiście interesuję się zarówno 2D, jak i 3D, więc nie pisałem o tym czy innym, pisząc to pytanie. Ale ogólnie rzecz biorąc, gry 2D i 3D mają wiele wspólnych systemów i struktur danych (np. Audio, wejście, AI, struktura programu, pętla gier) i istnieje wiele gier 3D, które można przenieść na 2D lub odwrotnie. I tak, nie widziałem Monty Pythona, dlatego w ogóle go nie rozumiałem. :)
Ricket
1
Nie wydaje mi się, aby istniała jednoznaczna odpowiedź na temat najlepszego języka.
Wei Hu,

Odpowiedzi:

12

F # będący częścią rodziny Microsofts .net ma dostęp do XNA, który jest fantastyczną bazą do budowania gier. Trochę googlingu pokazuje kilka samouczków, filmów i artykułów. Świetne dokumenty XNA również powinny pomóc.

W przypadku gier Haskell nastąpił także pewien ruch, patrz tutaj . Prawdopodobnie będziesz używać powiązań openGL.

Ponieważ Scala gra w środowisku Java, integruje się ze wszystkimi dostępnymi silnikami / powiązaniami Java, zobacz ten post SO .

Myślę, że sprowadza się to do preferencji, podczas gdy grałem tylko z Haskellem, wyobrażam sobie, że każdy funkcjonalny język ma swoje osobliwości. Warto w każdej z nich wypróbować małą grę testową i przekonać się, która z nich jest dla Ciebie lepsza.

Tak jak powiedziałem, mam tylko minimalne doświadczenie z Haskellem, więc nie mogę komentować najlepszych, ale te zasoby powinny pomóc ci zacząć.

cmjreyes
źródło
2
Pomiędzy problemami z JVM a niedojrzałością implementacji kompilatora, stwierdziłem, że wydajność Scali jest niedopuszczalna przy użyciu stylu funkcjonalnego, mimo że sam język obsługuje go dobrze. Ostatecznie jest tak szybki jak, powiedzmy, Python lub Ruby, a nie F # lub OCaml. (Szybkość Scali jest konkurencyjna dla większej liczby stylów OO / procedur.)
Tak naprawdę mam projekt F # z uruchomionym XNA (to jest puste okno XNA z błękitem chabrowym, tylko kod to F #, a nie C #.
RCIX
8

Powiedziałbym Lisp.

Był używany w grach jako język skryptowy, przynajmniej w Naughty Dog (lub tak mi się zdawało) i jest językiem bardzo dojrzałym.

Zaletą Lisp jest deserializacja, która jest główną częścią tego, co nazywamy zarządzaniem aktywami. Deserializacja lisp jest banalna, kod i dane są jednym. Ułatwia to format plików dla zasobów i zachowań. To nie tak jak ty w json / xml / yaml / bin i jeden plik F # dla AI. Możesz zapisać wszystko jako wyrażenia s, co znacznie uprości potok zasobów.

Jonathan Fischoff
źródło
TBH poleciłbym temu przeciw. Języki skryptowe są przeznaczone nie tylko dla programistów; moddery będą chciały modyfikować grę, a nic nie odstraszy ich szybciej niż (() ()))) () ((()). Ponadto, nawet jeśli chodzi o języki funkcjonalne, Lisp jest ezoteryczny.
RCIX
7
Jeśli odstraszenie modderów jest czymś, co Cię martwi, wybór funkcjonalnego języka prawdopodobnie nie jest właściwym posunięciem.
Paul Wicks
3
@RCIX & @Joe - Necro powers ACTIVATE. W każdym razie Schemat jest używany jako język nauczania. SICP to coś w rodzaju połowy stopnia CS w jednej książce i jest używany przez wiele szkół (w tym MIT do niedawna), a HTDP jest mniej hardkorowym wprowadzeniem.
Jesse Millikan,
1
@RCIX i Joe rzeczywiście. LISP i schemat są te języki wprowadzające w wielu uniwersytetach.
oberhamsi
1
Lisp nie jest czymś, czego chcesz użyć. Naughty Dog miał JEDEN, pojedynczego programistę Lisp, a kiedy zrezygnował, przenieśli wszystkie silniki do C ++. Nie mam pojęcia, dlaczego przestarzały silnik jednej firmy jest ciągnięty jako świetny przykład przez cały czas =)
Patrick Hughes
8

Po zdobyciu praktycznego doświadczenia, zagłosowałbym na Clojure - napisałem już w niej małą grę i planuję zrobić więcej.

Powody:

  • Produktywność - Clojure to dynamiczny język. Posiada świetne funkcje do interaktywnego programowania w stylu REPL, na przykład możesz użyć REPL do zapytania lub zmiany stanu w działającej instancji aplikacji do gry. Kod w Clojure jest często absurdalnie zwięzły. Wydaje mi się, że jestem 3-5 razy bardziej produktywny w Clojure niż w Javie lub C #.
  • Nieczysty - choć doceniam piękno i elegancję czysto funkcjonalnych języków, takich jak Haskell, programowanie gier to niechlujna pogoń, w której wygrywa pragmatyzm. Chcę mieć możliwość wprowadzania efektów ubocznych w moich funkcjach, kiedy ich potrzebuję, a Clojure na to pozwala. Powiedziawszy to, idiomatyczny styl Clojure ma być przez większość czasu czysto funkcjonalny .
  • Metaprogramowanie - dziedzictwo Lisp Clojure jako języka homoiconic sprawia, że ​​świetnie nadaje się do metaprogramowania / generowania kodu. Łatwo jest „rozszerzyć język”, aby tworzyć własne DSL lub wyeliminować biolerplate. Możesz łatwo używać Clojure jako własnego języka skryptowego do gier, a dynamiczna kompilacja kodu oznacza, że ​​twoje skrypty będą działały tak szybko, jak podstawowy silnik gry.
  • Dostęp do bibliotek Java . Możesz używać wszystkich bibliotek dźwiękowych / graficznych / AI / sieciowych Java, co jest ogromną zaletą w porównaniu z większością innych języków funkcjonalnych (gdzie będziesz musiał napisać je od zera lub opracować wiele trudnych kodów interfejsu). To może uratować życie.
  • Wieloplatformowy - działa za darmo na JVM, ale to niezły bonus.
  • Wydajność - w przypadku dynamicznego języka funkcjonalnego Clojure jest tak szybki, jak to tylko możliwe. Zawsze jest kompilowany w JIT, nigdy nie interpretowany. dzięki inteligentnej optymalizacji możesz dopasować prędkość czystego, niskiego poziomu kodu Java w Clojure. Na przykład można użyć pierwotnych tablic Java lub podać wskazówki dotyczące typów, aby upewnić się, że kompilator generuje wywołania funkcji o typie statycznym w kodzie krytycznym dla wydajności.
  • Współbieżność - Clojure ma świetny model zarządzania stanem współbieżnym, obsługiwany przez imponujący system pamięci transakcyjnej. Warto zobaczyć ten film, aby uzyskać więcej informacji na temat tego, jak to działa.

Jedynym momentem, w którym nie zastanawiałbym się nad Clojure, byłbym, gdybym pisał najnowocześniejszą graficznie grę, w której potrzebujesz najnowocześniejszej wydajności (gdzie nadal uważam, że potrzebujesz C / C ++).

mikera
źródło