Intro
For at indlede dette, så har jeg programmeret meget lidt i Lua. Jeg lavede dette super simple spil, og er i øjeblikket i gang med et andet. Det har dog været nok til at få mig til at se nogle af ulemperne ved at programmere i Lua.
Klager
Her er mine tre hovedklager:
1) Dynamisk og (noget) svag typning
2) Alt er en runtime error
3) Mangel på klasser
Eksempler
Dynamisk typning/mangel på typeannotationer
Lad os se på en funktion som et konkret eksempel.
function Ent:update_state(cmd, params) if cmd == 'at' then self.x, self.y = params.x, params.y endend
Først og fremmest bliver det svært at læse selve funktionen. Hvad tager denne funktion ind? Og hvad returnerer den, hvis den returnerer noget? Vi får ikke disse oplysninger ved at kigge på funktionssignaturen. I stedet er vi nødt til at læse funktionens krop igennem. For simple funktioner er dette ok. Men for længere og mere komplekse funktioner bliver det mere besværligt at bestemme returtypen.
Dertil kommer, at det bliver vanskeligt at læse/skrive/fejlsøge funktionskald. Vi kan overdrage en værdi af en hvilken som helst type til cmd
! Hvis vi kører ent:update_state(4, …)
, vil ent
ikke blive opdateret. Men i stedet for at fange dette som en typefejl, skal vi debugge det ved kørslen.
Generelt er sprog med dynamisk typing sværere at læse. Hvis du vil kende typen på en variabel, skal du tænke på kodens udførelsesvej, i stedet for at kunne kaste et blik på en typeannotation (f.eks. Java) eller tjekke typen i en REPL (f.eks. ved at bruge ghci til at tjekke Haskell-typer). Hack-sproget er en undtagelse. Det er dynamisk typet, men giver stadig statisk typekontrol. Med Lua får du alle fordele og ulemper ved et dynamisk typet sprog. Det er super nemt at skrive kode, og lige så svært at sikre korrekthed.
Runtime/Silent Errors
function test_func(test_arg) print(test_arg)endtest_func() -- prints 'nil'
Her er et scenarie, som jeg ofte er stødt på. Jeg skal tilføje/fjernelse/ændre en funktion. Så jeg ændrer funktionen, og så går jeg rundt og ændrer alle kald. Det er ikke så slemt; jeg kan søge i hele projektet og opdatere opkaldene et for et. Men hvad nu, hvis jeg overser et? Eller hvad hvis jeg tilføjer et nyt kald og glemmer, at jeg har ændret funktionen? Du har gættet det: en runtimefejl!
Random andet eksempel: 4 / 0 = inf
. Det kaster ikke en fejl.
Ingen klasser
Der er dette, som virker helt fint. Men den mangler stadig en masse gode OO-funktioner: metodevisibilitet og interfaces for at nævne et par stykker. Uden førstnævnte bliver det meget nemt at ændre et objekts tilstand fra et hvilket som helst sted i koden, og meget sværere at ræsonnere om objekters tilstand.
Det er ikke helt skidt
Ok, det er alle de eksempler jeg har (for nu). Jeg lærte faktisk en anstændig smule, mens jeg skrev dette. Jeg havde tænkt mig at klage over global scoping, men fandt dette. Jeg ville klage over type coercion, men det er ikke så slemt (det sker kun med strings og ints). Og det viser sig, at der findes en typet version af Lua! Jeg har ikke prøvet det, men det ser lovende ud. Hvis du læser dette, og du har prøvet typedlua, så lad mig vide hvordan det er i kommentarerne.
Hvorfor brokker jeg mig?
Jeg er klar over, at det kan virke lidt dumt at brokke sig over alle disse ting. Lua er et let scriptingsprog; de ting, jeg nævnte ovenfor, er ikke altid ulemper. Lua er ikke designet til at bygge store, komplekse applikationer. Men det er derfor jeg poster dette i Love2D subreddit. Det ser ud til, at folk laver nogle ret store og komplekse spil med Lua og Love2D. For eksempel Mari0, Warlock’s Tower osv. Hvordan gør de (du?) det? Jeg kan ikke rigtig forestille mig at lave et “lovligt” spil i Lua/Love2D. Hvis jeg tog en pause i en uge, ville jeg sikkert glemme halvdelen af koden, og spilde alt for meget tid på bare at prøve at finde ud af typerne på alle mine variabler og funktioner. Bruger spil normalt bare Lua som et “lim” sprog, og implementerer resten i C/C++? Er det nemmere at lave et stort spil i Lua end i andre sprog, selv med de problemer jeg nævnte ovenfor? Hvorfor bruger folk Lua til store spil, hvis de overhovedet gør det?
Tak for at du tog dig tid til at læse dette :D. Og hvis jeg har fået noget forkert oppe ovenfor, så lad mig endelig vide det!
Interessant læsning:
Lua: Good, bad, and ugly parts
Weak and Strong Typing