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