Intro
För att inleda detta har jag programmerat väldigt lite i Lua. Jag har gjort det här superenkla spelet och jobbar för närvarande på ett annat. Det har dock varit tillräckligt för att få mig att se några av nackdelarna med att programmera i Lua.
Klagomål
Här är mina tre huvudklagomål:
1) Dynamisk och (något) svag typning
2) Allt är ett runtime error
3) Brist på klasser
Exempel
Dynamisk typning/Missnöje med typannotationer
Låtsas oss betrakta en funktion som ett specifikt exempel.
function Ent:update_state(cmd, params) if cmd == 'at' then self.x, self.y = params.x, params.y endend
För det första blir det svårt att läsa själva funktionen. Vad tar den här funktionen in? Och vad returnerar den, om något? Vi får inte denna information genom att titta på funktionssignaturen. Istället måste vi läsa igenom funktionens kropp. För enkla funktioner är detta okej. Men för längre och mer komplexa funktioner blir det mer besvärligt att bestämma returtypen.
Fortfarande blir det svårt att läsa/skriva/bugga funktionsanrop. Vi kan skicka ett värde av vilken typ som helst till cmd
! Om vi kör ent:update_state(4, …)
kommer ent
inte att uppdateras. Men istället för att fånga upp detta som ett typfel måste vi felsöka det vid körning.
I allmänhet är språk med dynamisk typning svårare att läsa. Om du vill veta vilken typ en variabel har måste du tänka på kodens exekveringsväg, istället för att kunna kasta en blick på en typannotation (t.ex. Java) eller kontrollera typen i en REPL (t.ex. genom att använda ghci för att kontrollera Haskell-typer). Språket Hack är ett undantag. Det är dynamiskt typat, men erbjuder fortfarande statisk typkontroll. Med Lua får du alla för- och nackdelar med ett dynamiskt typat språk. Det är superlätt att skriva kod och lika svårt att säkerställa korrekthet.
Runtime/Silent Errors
function test_func(test_arg) print(test_arg)endtest_func() -- prints 'nil'
Här är ett scenario som jag ofta har stött på. Jag behöver lägga till/ta bort/ändra en funktion. Så jag ändrar funktionen och sedan går jag runt och ändrar alla anrop. Detta är inte så farligt; jag kan söka i hela projektet och uppdatera anropen en efter en. Men vad händer om jag missar ett? Eller vad händer om jag lägger till ett nytt anrop och glömmer att jag ändrat funktionen? Du har gissat det: ett körtidsfel!
Random annat exempel: 4 / 0 = inf
. Det ger inget fel.
Ingen klasser
Det finns det här, som fungerar bra. Men det saknar fortfarande många trevliga OO-funktioner: metodsynlighet och gränssnitt för att nämna några. Utan de förstnämnda blir det mycket lätt att ändra ett objekts tillstånd från var som helst i koden, och mycket svårare att resonera om objektens tillstånd.
Det är inte bara dåligt
Ok, det är alla exempel jag har (för tillfället). Jag lärde mig faktiskt en hygglig bit när jag skrev det här. Jag tänkte klaga på global scoping, men hittade det här. Jag tänkte klaga på type coercion, men det är inte så farligt (det händer bara med strings och ints). Och det visar sig att det finns en typad version av Lua! Jag har inte provat den, men den ser lovande ut. Om du läser detta och har provat typedlua, låt mig veta hur det är i kommentarerna.
Varför klagar jag?
Jag inser att det kan verka lite dumt att klaga på alla dessa saker. Lua är ett lättviktigt skriptspråk; de saker jag nämnde ovan är inte alltid nackdelar. Lua är inte utformat för att bygga stora, komplexa program. Men det är därför jag postar detta i Love2D subreddit. Det verkar som om folk gör ganska stora och komplexa spel med Lua och Love2D. Till exempel Mari0, Warlock’s Tower osv. Hur gör de (du?) det? Jag kan inte riktigt föreställa mig att göra ett ”lagligt” spel i Lua/Love2D. Om jag tog en paus i en vecka skulle jag förmodligen glömma halva koden och slösa alldeles för mycket tid på att försöka lista ut typerna för alla mina variabler och funktioner. Brukar man i spel bara använda Lua som ett ”limspråk” och implementera resten i C/C++? Är det lättare att göra ett stort spel i Lua än i andra språk, även med de problem som jag nämnde ovan? Varför använder folk Lua för stora spel, om de gör det överhuvudtaget?
Tack för att du tog dig tid att läsa detta :D. Och om det är något som är fel ovan, säg till!
Interessant läsning:
Lua: Bra, dåliga och fula delar
Svaga och starka typer