Czego szukasz w języku skryptowym? [Zamknięte]

10

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?

Jon Purdy
źródło
2
Zaciemnianie: ponieważ jeśli można go zaciemnić, to prawdopodobnie jest również dość elastyczny. Weźmy na przykład Perla, który może być zaciemniony w takim stopniu, w jakim wygląda na sygnał wyjściowy spowodowany szumem linii z modemu 300 bps (gdy ktoś inny odebrał telefon na drugim końcu domu) w czasach, gdy były szybki. ;-P
Randolf Richardson
1
@Randolf: Dobra uwaga. Jedynym problemem związanym z zaciemnianiem jest to, że zwykle polega on na stabilnym języku, którym nie są młode języki. Obfuscator, który działa z wersją 0.10, może nie działać z wersją 0.11.
Jon Purdy
@Jon Purdy: Zgadza się (+1 dla ciebie). Istnieje również aspekt trudniejszego utrzymania zaciemnionego kodu. Należy jednak zauważyć, że zaciemnianie może dostarczyć jednej interesującej miary elastyczności języka.
Randolf Richardson
5
@Randolf: kiedy Perl tak nie wygląda?
Ken
1
@Joe Wreschnig To znaczy „który powinienem wybrać”, a bardziej „jakie cechy są dobre w języku skryptowym”.
Kaczka komunistyczna,

Odpowiedzi:

4

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ć, że void*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.

DeadMG
źródło
Powinieneś spróbować czegoś takiego jak ta biblioteka opakowań, którą ostatnio dla siebie napisałem, aby rozwiązać niektóre z tych samych problemów, które miałeś. Możesz używać share_ptrs i innych rzeczy z nim w porządku, jest to typ bezpieczny (w każdym razie może być), możesz zdecydować, czy chcesz życie czegoś kontrolowanego przez twój kod czy środowisko Lua, obsługuje dziedziczenie, i to jest bardzo podobny do normalnego Lua API. Nie jestem jednak pewien, czy otrzymuję skargę na tworzenie powiązań, po prostu używam fragmentów vim, aby tworzyć wiązania w 99% przypadków.
Alex Ames
2

W przypadku gier internetowych trzy ważne dla mnie czynniki to:

  • Znajomość
  • Prędkość
  • Integracja

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.

Randolf Richardson
źródło
2

Ułożone w kolejności (malejącej) ważności:

  • Czytelny na pierwszy rzut oka. W rzeczywistości jest to wymóg dla każdego języka, którego chcę używać, ale w przypadku skryptów jest to prawdopodobnie ważniejsze: skrypty z definicji zmieniają się częściej niż kod „podstawowy”. Więc nie ma LISP ani PERL.
  • Jędrność. Skrypty są ciągle pisane i przepisywane, a pisanie wielu kodów „bojlerów” jest nieefektywne.
  • Łatwe debugowanie. Najlepiej z punktami przerwania, przejściami itp.
  • Łatwa integracja z moją wybraną technologią „core”. Jeśli używam C ++ do mojej gry, potrzebowałbym dobrych powiązań C ++, jak w LUA. Jeśli gra jest w C #, wybrałbym język oparty na CLI: C #, IronPython, Boo.
  • Funkcje językowe: proste tablice asocjacyjne, coroutines, może lambdas. W rzeczywistości zależy to głównie od tego, do czego zamierzam użyć skryptów. Skrypty AI różnią się od, powiedzmy, skryptów inicjujących.
  • Dobra dokumentacja C # ma dedykowany cały MSDN, a Boo ma tylko źródła. dlatego C # jest znacznie lepszy.
  • Dobre środowisko programistyczne. VS lub Eclipse biją Notatnika za każdym razem.
Nieważne
źródło
+1 To mi trochę pomaga, dziękuję. Poczekam, aby zobaczyć, czy jest jakaś dalsza dyskusja, ale myślę, że dobrze ją omówiłeś.
Jon Purdy,