Intro
Ensi alkuun totean, että olen ohjelmoinut hyvin vähän Lua:lla. Tein tämän super yksinkertaisen pelin, ja työstän parhaillaan toista. Se on kuitenkin riittänyt saamaan minut näkemään joitakin huonoja puolia Lua-ohjelmoinnissa.
Valitukset
Tässä on kolme tärkeintä valitustani:
1) Dynaaminen ja (jokseenkin) heikko tyypitys
2) Kaikki on ajoaikavirheitä
3) Luokkien puute
Esimerkkejä
Dynaaminen tyypitys/Tyyppiannotaatioiden puute
Harkitaanpa funktiota konkreettisena esimerkkinä.
function Ent:update_state(cmd, params) if cmd == 'at' then self.x, self.y = params.x, params.y endend
Aluksi itse funktion lukeminen vaikeutuu. Mitä tämä funktio ottaa vastaan? Ja mitä se palauttaa, jos mitään? Emme saa näitä tietoja tarkastelemalla funktion allekirjoitusta. Sen sijaan meidän on luettava funktion runko läpi. Yksinkertaisten funktioiden kohdalla tämä on ok. Mutta pidemmissä ja monimutkaisemmissa funktioissa paluutyypin määrittämisestä tulee hankalampaa.
Lisäksi funktiokutsujen lukeminen/kirjoittaminen/virheenkorjaus vaikeutuu. Voimme välittää minkä tahansa tyyppisen arvon cmd
! Jos suoritamme ent:update_state(4, …)
, ent
ei päivity. Mutta sen sijaan, että ottaisimme tämän kiinni tyyppivirheenä, meidän täytyy debugata se ajonaikana.
Yleisesti ottaen kielet, joissa on dynaaminen tyypitys, ovat vaikeampia lukea. Jos haluat tietää muuttujan tyypin, sinun täytyy miettiä koodin suorituspolkua sen sijaan, että voisit vilkaista tyyppi-annotaatiota (esim. Java) tai tarkistaa tyypin REPL:stä (esim. käyttämällä ghci:tä Haskellin tyyppien tarkistamiseen). Hack-kieli on yksi poikkeus. Se on dynaamisesti tyypitetty, mutta tarjoaa silti staattisen tyypintarkistuksen. Lua tarjoaa kaikki dynaamisesti tyypitetyn kielen hyvät ja huonot puolet. Koodin kirjoittaminen on superhelppoa, mutta sen oikeellisuuden varmistaminen on yhtä vaikeaa.
Runtime/Silent Errors
function test_func(test_arg) print(test_arg)endtest_func() -- prints 'nil'
Tässä on skenaario, johon olen törmännyt usein. Minun täytyy lisätä/poistaa/muuttaa jokin funktio. Joten muutan funktiota, ja sitten menen ympäri ja muutan kaikki kutsut. Tämä ei ole kovin paha asia; voin etsiä koko projektin ja päivittää kutsut yksi kerrallaan. Mutta entä jos unohdan yhden? Tai entä jos lisään uuden kutsun ja unohdan, että olen muuttanut funktiota? Arvasit sen: suoritusaikavirhe!
Satunnainen toinen esimerkki: 4 / 0 = inf
. Se ei heitä virhettä.
Ei luokkia
On myös tämä, joka toimii ihan hyvin. Mutta siitä puuttuu silti paljon mukavia OO-ominaisuuksia: metodien näkyvyys ja rajapinnat muutamia mainitakseni. Ilman edellisiä on hyvin helppoa muuttaa objektin tilaa mistä tahansa koodissa, ja paljon vaikeampaa järkeillä objektien tilasta.
Ei kaikki ole huonosti
Okei, siinä kaikki esimerkit, joita minulla on (toistaiseksi). Opin itse asiassa kohtuullisen paljon tätä kirjoittaessani. Aioin valittaa globaalista rajauksesta, mutta löysin tämän. Aioin valittaa tyypin pakottamisesta, mutta se ei ole kovin paha (sitä tapahtuu vain merkkijonojen ja intien kanssa). Ja kävi ilmi, että Luasta on olemassa tyypitetty versio! En ole kokeillut sitä, mutta se näyttää lupaavalta. Jos luet tätä ja olet kokeillut typedlua, kerro minulle kommenteissa, miten se toimii.
Miksi valitan?
Tiedän, että kaikista näistä asioista valittaminen saattaa tuntua aika typerältä. Lua on kevyt skriptikieli; edellä mainitsemani asiat eivät aina ole haittoja. Lua ei ole suunniteltu suurten, monimutkaisten sovellusten rakentamiseen. Mutta siksi kirjoitan tämän Love2D subredditiin. Näyttää siltä, että ihmiset tekevät melko suuria ja monimutkaisia pelejä Luan ja Love2D:n avulla. Esimerkiksi Mari0, Warlock’s Tower jne. Miten he (te?) tekevät sen? En oikein osaa kuvitella tekeväni ”laillista” peliä Lua/Love2D:llä. Jos pitäisin viikon tauon, unohtaisin luultavasti puolet koodista ja tuhlaisin aivan liikaa aikaa yrittäessäni selvittää kaikkien muuttujien ja funktioiden tyyppejä. Käytetäänkö peleissä yleensä vain Luaa ”liimakielenä” ja loput toteutetaan C/C++:lla? Onko suuren pelin tekeminen helpompaa Lua-kielellä kuin muilla kielillä, vaikka edellä mainitsemani ongelmat ovatkin olemassa? Miksi ihmiset käyttävät Lua:ta suuriin peleihin, jos ylipäätään käyttävät?
Kiitos kun käytit aikaa tämän lukemiseen :D. Ja jos ymmärsin jotain väärin yllä, niin kertokaa ihmeessä!
Intensiivistä luettavaa:
Lua: Hyvät, huonot ja rumat osat
Heikko ja vahva kirjoittaminen