- Lua on kerge, manustatav ja mitme paradigmaga: tabelid, funktsioonid ja korutiinid seovad kõik kokku.
- Dünaamiline tüpiseerimine, moodulid require'idega, OOP metatabelite ja korutiinidega koostööks.
- Puhas C API Lua loogika integreerimiseks natiivrakendustesse; ideaalne mängude ja asjade interneti jaoks.
- Laialdane kasutusala: mootorid, modifikatsioonid, DAW-d ja mikrokontrollerid nagu ESP8266/NodeMCU.

Lua on üks neist keeltest, mis üllatab oma tasakaalustatusega : väike, kiire ja loodud rakendustesse manustamiseks, kuid samas piisavalt väljendusrikas, et katta mitut programmeerimisstiili. Kui mõtled, mis see täpselt on, milleks seda kasutatakse ja miks nii paljud tööriistad seda valivad, on siin praktiline ja hästi dokumenteeritud juhend.
Enne detailidesse laskumist tasub selgitada kahte põhipunkti: Lua loodi 1993. aastal Brasiilias (PUC-Rio, TeCGraf grupp) eesmärgiga olla kerge ja laiendatav ning alates versioonist 5.0 on seda levitatud MIT-litsentsi all (varem BSD-laadne litsents). Selle käivitamine ei tõlgenda lähteteksti otse: see kompileeritakse baitkoodiks ja käivitatakse oma virtuaalmasinas; lisaks on olemas LuaJIT kompileerimiseks käitusajal.
Mis on Lua ja kust see pärit on?
Lua tähendab portugali keeles "kuud" ja selle lõid Roberto Ierusalimschy, Luiz Henrique de Figueiredo ja Waldemar Celes. Selle eesmärk oli algusest peale väga selge: olla manustatav, kaasaskantav ja minimalistlik keel , millel on lihtne C-st inspireeritud süntaks ja Perliga sarnane laiendatavus. Aastate jooksul on see ennast sisse seadnud skriptimismootorina videomängudele, pluginatele ja manussüsteemidele.
Algusest peale on kaasaskantavus olnud põhirõhk : see on rakendatud ISO C-s ja töötab praktiliselt kõikjal, alates suurtest serveritest kuni mikrokontrolleriteni, millel on vaid paar sada kilobaiti mälu. Varased versioonid litsentsiti BSD-stiilis litsentsi alusel ning alates Lua 5.0-st on nad kasutanud MIT-litsentsi , mis on täielikult GPL-iga ühilduv.
Filosoofia ja disain: kerge, süvistatav ja mitmekülgne
Lua seab esikohale "vähesed, väga võimsad osad". Selle kontseptuaalne raamistik on kokku võetud kolmes sambas : tabelid ainsa andmestruktuurina, funktsioonid esmaklassiliste kodanikena ja korutiinid koostööl põhinevaks voo juhtimiseks. Nende aluste abil saavad kasutajad luua kohandatud mooduleid, objekte, keskkondi ja abstraktsioone .
Seda kirjeldatakse sageli protseduurilisena, kuid see omaks loomulikult funktsionaalseid stiile (sulgurid, kõrgema taseme käsud), objektorienteeritud lähenemisviise (metatabelite ja prototüüpide kaudu) ning andmepõhist lähenemist. Selle minimalism ei tähenda jäikust: keel laieneb ja kohandub, määratledes käitumist metatabelite kaudu uuesti.
Oluline süntaks ja teostus
Lua keeles ei ole muutujatel staatilisi tüüpe ; nende väärtustele omistatakse tüübid. See pakub kaheksat põhitüüpi : nil , boolean , number , string , table , function , userdata ja thread (korutiinid). Lisaks toetab see kontrollitud sundimist arvude ja stringide vahel käitusajal.
Keel on organiseeritud tükid (kooditükid), mille kompilaator teisendab anonüümseteks funktsioonideks; see aitab riiki kapseldama nüüd töötavad ilma juhuslike "maagiliste globaalsete" muutusteta. Kommentaarid on tähistatud -- ja toetab pikkade jutumärkide või nurksulgudega stringliteraleid; operaatorid hõlmavad aritmeetilist, relatsioonilist ja lühisloogikat (and, or, not), liitmine (..) ja pikkus (#).
Voolu juhtimise osas, leidsime if/elseif/else, while, repeat until (kere vähemalt üks kord garanteeritud) ja kaks varianti for: numbriline (alguse, lõpu ja sammuga) ja üldine (iteraatorid nagu pairs o ipairs). The kohalikud avaldused piirata leksikaalset ulatust ja tagasipöördumine lubab mitut väärtust.
Andmetüübid ja sundimine
Lua on loodud dünaamiliselt tüübitud . Automaatsed teisendused toimuvad peamiselt stringi ja arvu vahel aritmeetiliste tehtete või tekstikontekstides. Tingimuslaused loevad vääraks ainult väärtusi väär ja null ; kõik muu on tõene (sh 0 ja tühi string).
Peamiste andmetüüpide hulka kuuluvad tabel (sõnastikud/assotsiatiivsed massiivid), funktsioon (esimese klassi väärtused), kasutajaandmed (C mäluplokid) ja lõim (korutiinid). Tabelid on heterogeensed , aktsepteerides mis tahes võtmetüüpi peale nil , ning moodustavad keerukate struktuuride, näiteks loendite, kirjete, puude ja hõredate massiivide aluse.
Tabelid ja metatabelid: keele tuum
Tabel on ainus andmestruktuur ja seda kasutatakse kõige jaoks: alates lihtsast massiivist ({10,20,30}) kataloogidele, objektidele, moodulitele ja keskkondadele. Juurdepääs t y t.x on samaväärne, kui võtmeks on nimi. Sulgudega konstruktorid lubavad väga kompaktsed väljendid initsialiseerimisest.
koos metatabelid se käitumist uuesti määratlema operaatorite ja juurdepääsude kohta: __add, __eq, __lt, __concat, __len, __index, __newindex, __calljne. See võimaldab ülekoormatud liitmine, võrdlemine, ühendamine või puuduvale väljale juurdepääsu saamine muuhulgas. Seega saate luua kompleksarvude klassid, puhverserverid, validaatorid või ümbrised vaid mõne reaga.
Moodulid ja keskkonnad
Funktsioon require laadib mooduli (tüki, mis käivitamisel tagastab tavaliselt tabeli funktsioonide ja konstantidega). Sisemiselt kompileerib Lua koodi funktsiooniks ja käivitab selle oma keskkond, tagastades tulemuse taaskasutamiseks. Globaalsed muutujad „asuvad” tabelis ja on ligipääsetavad järgmiselt: _G ja moodsamates versioonides funktsiooni nähtava keskkonna kaudu (_KESKKOND).
See arhitektuur hoiab binaarfaili suuruse väikesena : kõige laadimise asemel avaldab iga moodul ainult vajaliku ja arendaja otsustab, mida lisada. Leksikaalne nähtavus ja keskkonna eraldamine minimeerivad koodijuppide vahelisi kõrvalmõjusid.
Funktsioonid, sulgurid ja tükid
Lua keeles on funktsioon väärtus : see omistatakse muutujatele, antakse argumendina üle ja tagastatakse tulemusena. Jäika ariteeti pole: lisaargumente ignoreeritakse ; puuduvad argumendid täidetakse nulliga . Isegi tükke (chunk'e) käsitletakse anonüümsete funktsioonidena, mis teeb lokaalse oleku kapseldamise lihtsaks ilma globaalset keskkonda saastamata.
Süntaktilise suhkruna operaator : (koolon) võimaldab teil defineerida ja kutsuda "meetodeid", edastades self kaudselt: obj:metodo(x) on samaväärne obj.metodo(obj, x). Sulgemised Nad jäädvustavad ülesväärtusi, mis on väga võimas alus iteraatorite, tehaste ja puhaste API-de loomiseks.
Objektorienteeritud lähenemine „Lua meetodil“
Kuigi sellel pole klasse kui selliseid, Lua rakendab OOP-i tabelite ja metatabelite abilKõige levinumad mustrite kasutusviisid __index Prototüübile delegeerimiseks: Objektid salvestavad oma oleku ja otsivad oma meetodeid mallist (prototüübi tabel). Konstruktor saab metatabeli hõlpsalt määrata ja uusi eksemplare tagastada.
Kombineerimine konstruktorid, __index ja sugar:, saadakse pragmaatiline OOP: meetodid, mille puhul self, pseudopärimine (aheldatud prototüübid), ülekirjutamise võimalus ja paindlik koostisSee on lihtne ja väga tõhus lähenemisviis pluginate, mängude või konfiguratsiooniskriptide jaoks.
Korutiinid: koostööl põhinev mitme ülesande täitmine
The korutiinid Need pakuvad väga peent voolu reguleerimist: neid saab yield y resume teatud punktides, säästes akut. Nad töötavad nagu kooperatiivne mitmekeermeline, ideaalne mänguloogika, reaktiivsete süsteemide, lihtsate planeerijate või laisad iteraatoridLisaks võimaldavad need elegantset ümberlülitumist Lua ja hostkoodi (nt C/C++) vahel.
Praktikas töötab korutiin kuni selle lõppemiseni , tagastades väärtused taaskäivitajale ja jätkates seejärel sealt, kus pooleli jäi. Interaktiivsete ülesannete, olekupõhise tehisintellekti või simulatsioonide jaoks on see oma madala hinna ja selguse tõttu väga väärtuslik tööriist.
Standardteegid ja utiliidid
Lua sisaldab kompaktset, kuid väga kasulikku standardteekide komplekti: basic (assert, type, pairs, require…), string (patterns, gsub, gmatch, format), table (insert, remove, sort, concat), math (trigonomeetria, eksponentsiaalid, random), io (files), os (dates, environment, processes) ja debug (hooks, traces, inspection). Need on loodud katma 80% reaalsetest vajadustest minimaalse jalajäljega.
Süsteem nöörimustrid pakub võimsat otsingut, jäädvustamist ja asendamist ilma täielike regulaaravaldisteta; selliste funktsioonidega nagu gmatch o gsub Enamik tüüpilisi tekstitöötlusjuhtumeid lahendatakse lihtsal viisil. lühike.
C/C++ ja integratsiooni API-sse manustatud
Üks tugevaid külgi on selle API C-keelesHost loob a lua_State, laadi tükke (lua_load), käivitab funktsioone (lua_pcall kaitstud) registrite käivitamiseks kohalikud funktsioonid ligipääsetav Lua kaudu ja liigutab andmeid üle virtuaalne pinuC-maailma struktuure paljastavad veakäsitlus-, prügikoristus-, metatabelite ja „kasutajaandmete” utiliidid.
See disain teeb Luast üldotstarbelise skriptimismootori C/C++ rakenduste jaoks: loogika on delegeeritud Luale (seda on lihtne itereerida ja juurutada), säilitades samal ajal natiivse kerneli jõudluse. Selle väike jalajälg (implementatsioon ~25 000 rida C-koodi ja binaarfailid sadades KB-des) aitab seda integreerida isegi tagasihoidlikesse seadmetesse.
Lua asjade internetis ja mikrokontrollerites (ESP8266/NodeMCU)
Lua sobib oma lihtsuse ja kiire arendustsükli tõttu suurepäraselt asjade interneti jaoks. NodeMCU ESP8266 jaoks pakub püsivara, mis käitab Lua keelt, ja selliste tööriistadega nagu Lua üleslaadija o ESPlorer Saate skripte üles laadida, konsooli avada, koodijuppe testida ja veaotsingut teha lennult. Fail init.lua tavaliselt alusta loogikaga seadmest (nt LED-i vilkumine või GPIO seadistamine).
Võimalus käivitage koodi osi järk-järgultilma kõike uuesti kompileerimata muudab katsetamise väga mugavaks: deklareerida muutujaid, luua print(a+b), lülitusnõelad jne. Arduinost tulevate jaoks on see voog agiilne ja didaktilineja sageli piisab skriptide teistele ühilduvatele seadmetele portimiseks väikestest muudatustest.
Märkimisväärsed kasutusalad videomängudes ja tarkvaras
Tänu oma kergele olemusele, jõudlusele ja lubavatele litsentsimistingimustele on Lua mootorite ja modifikatsioonide seas lemmik. Platvormid nagu Roblox on reklaaminud tüübitud varianti (Luau); sellised mängud ja mootorid nagu World of Warcraft , liivakastimäng Garry's Mod (põhineb Half-Life 2-l), RTS Supreme Commander , mis on osa STALKERist , LucasArtsi seiklused nagu Grim Fandango ja Escape from Monkey Island , Worms 4: Mayhem ja raamistikud nagu LÖVE2D on näidanud oma võimsust liideste skriptimise, mänguloogika ja modifikatsioonide osas.
See esineb ka MMO-des ja platvormidel nagu Tibia (ulatusliku kohandamise võimalustega koos XML-iga), Ragnarok Online (homunculus AI), serverites ja modifikatsioonides nagu Multi Theft Auto: San Andreas või FiveM , mängudes nagu Factorio (Lua-põhised modifikatsioonid), Hedgewars , Transformice , Minetest (modifikatsioonide või tervete mängude loomine), StepMania (animatsioonid ja käsud) ja isegi pealkirjades nagu The Binding of Isaac: Rebirth (DLC Afterbirth+ lisas Lua modifikatsioonide toe).
Tööriistade ja süsteemide valdkonnas kasutavad aknahaldurid nagu Ion ja Awesome Lua konfigureerimiseks ja laiendamiseks, samas kui rakendused nagu REAPER , Rockbox ja Renoise DAW rakendavad seda skriptimiseks ja põhjalikuks kohandamiseks (kohandatud API, OSC, MIDI, menüüd, ujuvad aknad, integreeritud terminal). Seda on kasutatud ka sisendandmete töötlemiseks , rakenduste konfigureerimiseks, riistvara juhtimiseks ja ülesannete automatiseerimiseks.
Jõudlus, rakendamine ja prügikoristus
Lua kompileerub baitkoodiks ja töötab tõhusas virtuaalmasinas; nõudlike stsenaariumide jaoks lisab LuaJIT käitusaja kompileerimise. Prügikoguja on inkrementaalne, lipupuhastusega , konfigureeritav (pausi ja sammu kordaja) ning toetab finaliseerijaid (__gc) kasutajaandmete ja nõrkade tabelite (võtmed/väärtused, mis ei takista mälu vabastamist) jaoks .
See kiiruse ja kontrolli kombinatsioon tagab madala latentsustaseme, mis on vastuvõetav mängude, pluginate ja manussüsteemide jaoks. Selle minimaalne jalajälg võimaldab juurutamist väga piiratud ressurssidega seadmetes , ohverdamata väljendusvõimet.
Disaini võrdlus ja õppimine
Erinevalt raskematest keeltest seab Lua esikohale ökonoomsuse ja koostalitlusvõime . Selle eesmärk ei ole asendada Pythoni ega JavaScripti kui "täielikku ökosüsteemi", vaid pigem olla parim valik olukordades, kus C-keeles on lihtsus, kaasaskantavus ja laiendatavus võtmetähtsusega . Raamat " Programmeerimine Luas" ja tehnilised artiklid süvenevad otsustesse, mis selgitavad selle elegantset disaini.
Need, kes tulevad Pascali, C või selge süntaksiga keeltest, leiavad sujuv sisenemiskõver: klotsid koos do ... end, loetavad tingimuslaused, 20 täpselt määratletud märksõna ja muster local para piirata kõrvaltoimeidSelle „liim“ C-ga ja paindlik tabelisemantika julgustavad alt üles ehitama ainult seda, mis on hädavajalik.
Sagedased juhtumid ja anekdoodid
Kaasaskantavuse osas nõuab Lua rakenduse migreerimine operatsioonisüsteemide vahel tavaliselt minimaalseid muudatusi. Konsoolidele ja seadmetele on olemas versioonid PSP-le , Wii-le ja SEGA Saturnile (spetsiifiliste teekidega) ning koduõpilaste kogukonnad on Lua-d selle lihtsuse tõttu kasutanud.
Privaatserverites ja modifikatsioonides (näiteks Tibia ) kasutatakse Lua abil kõrgetasemelisi süsteeme, skripte ja laiendusi . Ja kui töötate loominguliste platvormidega nagu Friday Night Funkin' , kasutatakse Lua abil HUD-e, modifikatsioonide graafikuid ja stseenide kaunistusi, mis näitab selle mitmekülgsust dünaamilise koreograafia loomiseks.
Tugevused, mis selgitavad selle edu
Kerge ja kiire : väga väikesed binaarfailid, minimaalne mälukasutus ja tõhus interpreter/virtuaalmasin. Ressursside poolest piiratud seadmetel on see kokkuhoidlikkus määrava tähtsusega.
Suurepärane C API : natiivsete funktsioonide registreerimine ja struktuuride kuvamine on lihtne. Keerukate rakenduste puhul, mis on teisendatud "hostideks", on Lua ideaalne liim natiivse kerneli ja kõrgetasemelise loogika vahel.
Mitmeparadigmaline ja modulaarne : tabelite, metatabelite, funktsioonide ja korutiinide abil saate luua täpselt seda, mida vajate, mitte rohkem ega vähem. See läbimõeldud miinimum väldib tarbetut keerukust.
Kogukond ja dokumentatsioon : kokkuvõtlik teatmik, arvukalt näiteid ja materjale mitmes keeles (inglise, hispaania, portugali). „Mõista, kuidas see toimib” kultuur tähendab selget ja töökindlat koodi.
Süntaksi üksikasjad ja operaatorid, mida meeles pidada
Lühisega loogilised operaatorid mis tagastavad operande (mitte ainult tõeväärtusi): a and b y a or b saab tagastada mitte-tõeneväärtusi, mis on väga kasulik vaikeväärtuste määramiseks (x = x or {}).
Liimine koos .., pikkus koos #-ga (stringides ja massiivitüüpi tabelites) astmestamine ^-gaja C-ga sarnased pretsedendid, millel on sellised eripärad nagu parempoolne assotsiatiivsus .. y ^. ketimustrid Need pakuvad mugavat jäädvustamist ja otsingut ilma väliste sõltuvusteta.
Miks nii paljud mootorid ja tööriistad selle valivad?
Sest see vähendab hõõrdumist disaini ja teostuse vahel : Lua keeles itereerimine on kiire, skripte on lihtne levitada ja auditeerida ning natiivne kernel on kaitstud sagedaste muudatuste eest. Lisaks sobib see lubava litsentsiga vaba tarkvarana ideaalselt kommertstoodetesse ja kogukonnaprojektidesse.
Ja lisaks on oluline kultuuriline tegur: keele selgus soodustab programmeerimiskontseptsioonide (kõrgema järgu funktsioonid, sulgemised, iteraatorid) õppimist, mida saab seejärel rakendada ka teistes keskkondades. Segatud meeskondade (disain, skriptimine, mootor) puhul kiirendab see tarneid ilma kvaliteeti ohverdamata.
Pärast Lua ajaloo, disaini ja kasutusalade uurimist on lihtne mõista, miks see on pälvinud erilise koha: väike keel, mis teeb suuri asju . Alates videomängudest ja DAW-dest kuni asjade interneti ja ujuvate akendeni – selle tabelite ja metatabelite, esmaklassiliste funktsioonide ja korutiinide kombinatsioon tagab puhtad, modulaarsed ja hõlpsasti hooldatavad lahendused. Kui otsite usaldusväärset skriptimismootorit oma rakendustesse integreerimiseks või lihtsat automatiseerimiskeelt ilma võimsust ohverdamata, on Lua erakordne partner.
