2011-03-16 10 views
23

Aktualnie buduję serwer gry (nie silnik) i chcę, aby był on rozszerzalny, podobnie jak system wtyczek.
Rozwiązaniem, które znalazłem, jest użycie języka skryptowego. Jak na razie dobrze.Ruby vs Lua jako język skryptowy dla C++

Nie jestem pewien, czy powinienem użyć Ruby lub Lua. Lua jest łatwiejsza do osadzenia, ale Ruby ma większą bibliotekę i lepszą składnię (według mnie). Problem polega na tym, że nie ma prostego sposobu na wykorzystanie Ruby jako języka skryptowego w C++, podczas gdy z Lua jest to bardzo łatwe.

Trudności na ten temat? Sugestie dotyczące używania języka Ruby jako języka skryptowego (próbowałem SWIG, ale nie jest tak schludny jak używanie Lua)?

Dzięki.

+5

Jeśli uważasz, że Lua jest zbyt uproszczona, a Ruby zbyt trudna do osadzenia, może powinieneś rozważyć Python? – Macke

+2

Jeśli ujawniasz bazę kodu (szczególnie serwer), czy naprawdę potrzebujesz dużej biblioteki? Możesz poświęcić więcej czasu na usuwanie niebezpiecznych funkcji bibliotecznych, które użytkownicy mogą wykorzystać, jeśli chodzi o piaskownicę. –

Odpowiedz

8

Używam Lua szeroko w przeszłości.

Luabind jest naprawdę łatwy w użyciu, nie ma potrzeby stosowania zewnętrznego generatora, takiego jak SWIG, dokument jest świetny. Czasy kompilacji pozostają przyzwoite.

Największy problem jaki widziałem: lua jest głównie ... tylko do zapisu. Tak naprawdę nie masz klas, ale tylko tablice asocjacyjne z odrobiną cukru syntaktycznego (obiekt ['klucz'] można zapisać object.key), więc łatwo kończysz dodając "członka" w niezrozumiałej funkcji, całkowicie zapominając o tym i później mieć efekty uboczne.

Z tego powodu, i tylko z tego powodu, wolę Python. Boost :: Python jest podstawą Luabind, więc oba mają podobne API (Luabind był nieco łatwiejszy do zbudowania, ale już nie). Pod względem funkcjonalności są one dość równoważne.

Nie dotyczy bezpośrednio: Żadne z nich nie może być niezawodnie używane w środowisku wielowątkowym (zależy to od złożoności serwera).

  • N Nici w pythonach: GIL (Global Interpreter Lock) jest na dobrej drodze. Za każdym razem, gdy używasz zmiennej w wątku, jest ona zablokowana, więc niszczy punkt, z wyjątkiem długich operacji we/wy i wywołań funkcji C.
  • Lua ma coroutines, ale nie można ich porównywać.
  • Ruby wątki nie są naprawdę wątków, ale podobny do współprogram Lua

Należy zauważyć, że nadal można utworzyć jeden environement dla każdego wątku, ale nie będzie w stanie komunikować się (z wyjątkiem sprzętu C++) . Jest to szczególnie łatwe w Lua.

+1

Dzięki Lua, multi-threading można rozwiązać za pomocą [LuaLanes] (http://kotisivu.dnainternet.net/askok/bin/lanes/). – jpjacobs

+4

@ Calvin1602 Najnowsze wersje Ruby (1.9+) używają wątków na poziomie systemowym. Mimo to nadal posiada GIL, co stawia go na równi z Pythonem. – dunedain289

+0

@ dunedain289: Miło wiedzieć, dzięki. @jpjacobs: Jestem świadomy LuaLanes, ale nigdy tego nie próbowałem. Czuję się trochę "nienaturalnie", ale powinienem spróbować. – Calvin1602

0

Chciałbym pójść z czymkolwiek, co było najłatwiejsze do nauczenia/ma najwięcej graczy używających go. Chcesz, aby był jak najbardziej dostępny dla Twoich klientów.

+0

Dlaczego liczba graczy ma znaczenie? –

5

Być może zainteresuje Cię informacja o . Uważam, że był to język skryptowy używany przez Left 4 Dead 2. Jest bardziej zaawansowany niż lua (używa obiektów i klas) i ma być łatwo osadzony w aplikacji C++, co brzmi jak dokładnie to, czego szukasz.

+0

Dzięki. Czy są jakieś książki na temat osadzania języka Squirrel w C++? – bl00dshooter

+0

Brak o ile wiem - jest to całkiem nowy język skryptowy. Nie pozwól, aby "3.0" Cię zmyliło, jest już od 2004 roku, ale nie było używane tak jak niektóre inne języki skryptowe. Dokumentacja (linkowana na stronie głównej) wydaje się dobra. – James

10

Spojrzałem na osadzanie Rubiego w C/C++ wcześniej i wydawało się to niezwykle trudne. Istnieje wiele wyzwań będziesz twarz:

  • podając w Ruby z C/C++ wymaga 2 warstw, które mają być napisane (jedna warstwa zadzwonić, a jeden do połowu wyjątki)
  • Wywołanie powrotem C/C++ z Ruby wymaga normalną pracę SWIG typu
  • Przenoszenie danych iz powrotem wymaga utrzymanie ostrożnego utwór przydziałów, ponieważ Ruby będzie chciał śmieci zbierać wszystko może

Jestem pewien, że ten można zrobić, ale wydawało się, e bardzo trudne dla mnie, możliwe do zrealizowania tylko wtedy, gdy możesz wskoczyć do Rubiego w minimum punktów wejścia.

2

Idź na lua, choć polecam luajit, nie tylko dla prędkości, ale dla nowej biblioteki ffi, zwiększając komunikację do maksimum :). Lua ma również tony modułów, a nowe są bardzo łatwe do stworzenia, to nadrabia brak jego stdlib.

1

Jedną z rzeczy, do których dąży Lua, jest możliwość łatwego przenoszenia danych pomiędzy C++ (lub C) a samym sobą. Zasadniczo po prostu przesuwasz/popping danych na stos, aby komunikować się między nimi. Posiadanie wielu środowisk Lua uruchomionych w tym samym czasie jest również bardzo proste (jeśli potrzebujesz tej funkcji). Chociaż Lua jest językiem gromadzącym śmieci, łatwo jest temu zapobiec, jeśli chodzi o dane, które muszą pozostać w twoim kodzie C++. Stworzenie rozszerzalnego systemu wtyczek powinno być łatwe z Lua po ułożeniu podłoża. Zamiana wtyczek (w tym przypadku skryptów) do i ze środowiska wykonawczego w środowisku wykonawczym jest również dość banalna (chociaż może to być prawdą również dla Ruby, nie jestem dostatecznie zaznajomiony z tą informacją).

Jedną z rzeczy do przemyślenia jest to, jak wiele rzeczy zorientowanych obiektowo chcesz, aby twoje skrypty były w stanie obsłużyć. Lua używa funkcji, tabel, metatabeli i prototypów do implementacji programowania podobnego do OO. Niektórzy ludzie to lubią, inni nie; osobiście uważam, że jest to interesujące w użyciu, jeśli czasami nieco przylegające. Nie używając Ruby, nie mogę za nią mówić, ale możesz chcieć zważyć twoją potrzebę wsparcia obiektu/klasy.

Myślę, że w twojej sytuacji powinieneś również zastanowić się, jak szybko chcesz uruchomić swój projekt. Jak zauważyłeś ty i inni, Ruby trudno osadzić w C++, a Lua nie. Czas jest zawsze cenny i jeśli chcesz, aby coś działało JAK NAJSZYBCIEJ, Lua jest prawdopodobnie twoim najlepszym wyborem.

Powiązane problemy