Reddit – love2d – A játékprogramozás hátrányai Lua nyelven

Intro

Elöljáróban annyit, hogy nagyon keveset programoztam Lua nyelven. Csináltam ezt a szuper egyszerű játékot, és jelenleg egy másikon dolgozom. Ez azonban elég volt ahhoz, hogy lássam a Lua-ban való programozás néhány hátrányát.

Panaszok

Itt van a három fő panaszom:

1) Dinamikus és (kissé) gyenge tipizálás

2) Minden futásidejű hiba

3) Az osztályok hiánya

Példák

Dinamikus tipizálás/Típusmegjegyzések hiánya

Mondjunk egy függvényt konkrét példaként.

function Ent:update_state(cmd, params) if cmd == 'at' then self.x, self.y = params.x, params.y endend

Először is, magának a függvénynek az olvasása nehézkessé válik. Mit vesz fel ez a függvény? És mit ad vissza, ha egyáltalán valamit? Ezeket az információkat nem kapjuk meg a függvény aláírásából. Ehelyett végig kell olvasnunk a függvény testét. Egyszerű függvények esetében ez rendben van. De hosszabb és összetettebb függvényeknél a visszatérési típus meghatározása egyre nagyobb gondot okoz.

Továbbá a függvényhívások olvasása/írása/hibakeresése is nehézkessé válik. Bármilyen típusú értéket átadhatunk a cmd! Ha a ent:update_state(4, …)-t futtatjuk, a ent nem fog frissülni. De ahelyett, hogy ezt típushibaként kapnánk el, futás közben kell majd hibakeresést végeznünk.

A dinamikus tipizálású nyelveket általában nehezebb olvasni. Ha tudni akarjuk egy változó típusát, akkor a kód végrehajtási útját kell végiggondolnunk, ahelyett, hogy rápillanthatnánk egy típus annotációra (pl. Java) vagy ellenőrizhetnénk a típust egy REPL-ben (pl. ghci segítségével a Haskell típusok ellenőrzésére). A Hack nyelv az egyik kivétel. Dinamikusan tipizált, de mégis statikus típusellenőrzést biztosít. A Lua-val a dinamikusan tipizált nyelvek összes előnyét és hátrányát megkapod. Szuper könnyű kódot írni, és ugyanilyen nehéz a helyesség biztosítása.

Runtime/Silent hibák

function test_func(test_arg) print(test_arg)endtest_func() -- prints 'nil'

Itt egy forgatókönyv, amivel gyakran találkoztam. Egy függvényt kell hozzáadnom/eltávolítanom/megváltoztatnom. Tehát megváltoztatom a függvényt, majd körbejárom és megváltoztatom az összes hívást. Ez nem túl rossz; átnézhetem az egész projektet, és egyesével frissíthetem a hívásokat. De mi van, ha kihagyok egyet? Vagy mi van, ha hozzáadok egy új hívást, és elfelejtem, hogy megváltoztattam a függvényt? Kitaláltad: futásidejű hiba!

Véletlenszerű másik példa: 4 / 0 = inf. Ez nem dob hibát.

Nincsenek osztályok

Van ez is, ami rendben működik. De még mindig hiányzik belőle egy csomó szép OO funkció: a metódusok láthatósága és az interfészek, hogy csak néhányat említsek. Az előbbiek nélkül nagyon könnyűvé válik egy objektum állapotának megváltoztatása bárhonnan a kódban, és sokkal nehezebbé válik az objektumok állapotáról következtetni.

Nem minden rossz

Oké, ennyi példám van (egyelőre). Tulajdonképpen tanultam egy tisztességes kicsit, miközben ezt írtam. A globális scopingra akartam panaszkodni, de ezt találtam. A típus kényszerítésre akartam panaszkodni, de ez nem olyan rossz (csak stringekkel és ints-ekkel történik). És kiderült, hogy van egy tipizált változata a Luának! Még nem próbáltam ki, de ígéretesnek tűnik. Ha ezt olvasod, és kipróbáltad a typedlua-t, írd meg nekem a hozzászólásokban, hogy milyen.

Miért panaszkodom?

Tudom, hogy a panaszkodás mindezek miatt elég hülyeségnek tűnhet. A Lua egy könnyű szkriptnyelv; a fent említett dolgok nem mindig hátrányok. A Lua-t nem nagy, összetett alkalmazások építésére tervezték. De éppen ezért posztolom ezt a Love2D subredditen. Úgy tűnik, hogy az emberek elég nagy és összetett játékokat készítenek Lua-val és Love2D-vel. Például a Mari0, a Warlock’s Tower, stb. Ők (ti?) hogyan csinálják? Nem igazán tudom elképzelni, hogy “legális” játékot készítsek Lua/Love2D-ben. Ha egy hét szünetet tartanék, valószínűleg elfelejteném a kód felét, és túl sok időt pazarolnék arra, hogy kitaláljam az összes változóm és függvényem típusát. A játékok általában csak “ragasztónyelvként” használják a Luát, a többit pedig C/C++-ban implementálják? Könnyebb egy nagy játékot készíteni Lua-ban, mint más nyelveken, még a fent említett problémákkal együtt is? Miért használják az emberek a Lua-t nagyméretű játékokhoz, ha egyáltalán használják?

Köszönöm, hogy időt szakítottál az olvasásra :D. És ha valamit elrontottam fentebb, kérlek, szóljatok!

Érdekes olvasmányok:

Lua: Jó, rossz és csúnya részek

Gyenge és erős tipizálás

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.