Piszę trochę osadzonego języka dla innego projektu. Chociaż tworzenie gier nie było pierwotnym zamiarem, zaczyna wyglądać na dobre dopasowanie i myślę, że w pewnym momencie rozwinę je w tym stylu.
Nie ujawniając żadnych szczegółów (aby uniknąć stronniczości), jestem ciekawy, aby wiedzieć:
Jakie funkcje lubisz w języku skryptowym do tworzenia gier?
Jeśli używałeś Lua, Python lub innego języka osadzonego, takiego jak Tcl lub Guile, jako głównego języka skryptowego w projekcie gry, jakie aspekty uważasz za najbardziej przydatne?
Funkcje językowe (lambdy, klasy, równoległość)
Funkcje implementacji (optymalizacje wydajności, JIT, przyspieszenie sprzętowe)
Funkcje integracji (powiązania C, C ++ lub .NET)
A może coś zupełnie innego?
Odpowiedzi:
Szukam dwóch rzeczy - szybkości i integracji. Zwykle obie idą w parze i ze znajomością. Niestety, w przypadku C ++ praktycznie nie ma języków oferujących szybkość i integrację. Użyłem Lua i to było do niczego, strasznie ssące. Spędziłem cały czas na pisaniu powiązań i właściwie nie było wystarczająco dużo czasu na pisanie kodu.
Funkcje językowe? Istota osadzenia języka skryptowego nie polega na tym, że może on oferować światełka dynamiczne, których nie posiadał mój oryginalny język, lecz umożliwia interpretację w czasie wykonywania . Naprawdę mnie to nie obchodzi, o ile jest to w zasadzie funkcjonalne, to jest w porządku i pasuje do mojego języka hosta (w tym przypadku C ++). Jednak, co zadziwiające, języki zaprojektowane do integracji z aplikacjami hosta całkowicie zawodzą w części dotyczącej integracji .
Czy potrzebuję wspólnych procedur? Nie, nie potrzebuję wspólnych procedur. Czy potrzebuję dynamicznego pisania? Nie, muszę wiedzieć, jakie typy zwracają się do mnie z mojego języka skryptowego, a ponieważ cały mój istniejący kod opiera się na bardzo silnym pisaniu, naprawdę chciałbym, aby mój kod skryptowy również mógł to uszanować. Czy potrzebuję wyrzucania elementów bezużytecznych? Nie, moje typy już zarządzają własnymi zasobami i zdecydowanie chcę deterministycznego zniszczenia. Czy chcę goto? Nie, chcę wprowadzić wyjątki.
Problem, który znalazłem, polegał na tym, że zasadniczo wszystkie istniejące języki skryptowe zostały zaprojektowane w celu rozszerzenia C, a nie C ++ i nie obsługują poprawnie modelu C ++ na wiele sposobów, a ponadto mają zupełnie inną semantykę. Jak, u licha, mam zamiar przetłumaczyć
shared_ptr
, czyli automatyczne deterministyczne zniszczenie, na środowisko śmieci? Możesz pisać dowolne biblioteki owijania, nie zmienisz semantyki języka, która jest niezgodna z językiem, który próbujesz rozszerzyć. Jak mogę się upewnić, żevoid*
jest to właściwy typ? Jak poradzić sobie z dziedziczeniem? Jak rzucać i łapać wyjątki? To po prostu nie działa.Dobry język skryptowy dla C ++ byłby typowany statycznie, wartościowałby semantykę, deterministycznie zniszczony, rzucał i łapał wyjątki i szanowałby moje destruktory / konstruktory / konstruktory kopiowania, ponieważ wtedy wszystkie moje typy będą po prostu działały, ładnie i łatwo, a wynikowy język będzie szybka i wspierająca całą moją oryginalną semantykę, łatwa do powiązania.
źródło
W przypadku gier internetowych trzy ważne dla mnie czynniki to:
Szczególnie podoba mi się Perl, częściowo dlatego, że znam już język, a ponieważ moduł serwera WWW, taki jak mod_perl2, zapewnia ogromną korzyść w zakresie wydajności i integracji - mod_perl2 zachowuje skompilowaną wersję skryptów w pamięci RAM (które są interpretowane tylko na podstawie pierwsze ładowanie), co daje mu znaczną przewagę nad innymi interpretowanymi językami, które nie mają opcji kompilacji, a także integruje się z serwerem Apache HTTPd z bogatym w funkcje interfejsem API, który zapewnia dostęp do wielu bardzo zaawansowanych funkcji.
Czynniki te mogą być przydatne przy tworzeniu gier internetowych (a tam, gdzie potrzebny jest dostęp do bazy danych, buforowanie połączeń z bazą danych pomaga jeszcze bardziej skrócić czas reakcji użytkowników). Oczywiście może to nie być najbardziej idealne rozwiązanie dla wszystkiego, ponieważ każdy język ma swoje zalety (i wady), ale zawsze działał dobrze dla moich potrzeb.
źródło
Ułożone w kolejności (malejącej) ważności:
źródło