- Lua ir viegla, ieguljama un daudzparadigmiska: tabulas, funkcijas un korutīnas visu saista kopā.
- Dinamiskā tipizēšana, moduļi ar prasībām, darbības pārtraukums ar metatabulām un korutīnām kooperatīvai plūsmai.
- Tīra C API Lua loģikas integrēšanai vietējās lietotnēs; ideāli piemērots spēlēm un lietu internetam (IoT).
- Plašs reāls pielietojums: dzinēji, modifikācijas, DAW un mikrokontrolleri, piemēram, ESP8266/NodeMCU.

Lua ir viena no tām valodām, kas pārsteidz ar savu līdzsvaru : maza, ātra un paredzēta iegulšanai lietojumprogrammās, tomēr pietiekami izteiksmīga, lai aptvertu vairākus programmēšanas stilus. Ja jūs interesē, kas tieši tā ir, kam tā tiek izmantota un kāpēc tik daudzi rīki to izvēlas, šeit ir praktisks un labi dokumentēts ceļvedis.
Pirms iedziļināties detaļās, ir vērts precizēt divus galvenos punktus: Lua tika izveidota 1993. gadā Brazīlijā (PUC-Rio, TeCGraf grupa) ar mērķi būt vieglai un paplašināmai, un kopš 5.0 versijas tā tiek izplatīta saskaņā ar MIT licenci (iepriekš — BSD līdzīga licence). Tās izpilde tieši neinterpretē avota tekstu: tā kompilē baitkodā un izpilda to savā virtuālajā mašīnā; turklāt pastāv LuaJIT izpildlaika kompilācijai.
Kas ir Lua un no kurienes tā nāk?
Lua portugāļu valodā nozīmē "mēness" , un to izveidoja Roberto Jerusalimschy, Luiz Henrique de Figueiredo un Waldemar Celes. Tās mērķis jau no paša sākuma bija ļoti skaidrs: būt iegultai, pārnēsājamai un minimālistiskai valodai ar vienkāršu sintaksi, kas iedvesmota no C, un paplašināmību, kas līdzīga Perl. Gadu gaitā tā ir kļuvusi par skriptēšanas dzinēju videospēlēm, spraudņiem un iegultajām sistēmām.
Kopš tā pirmsākumiem galvenā uzmanība ir bijusi pievērsta pārnesamībai : ieviesta ISO C valodā , tā darbojas praktiski jebkur, sākot no lieliem serveriem līdz mikrokontrolleriem ar tikai dažiem simtiem kilobaitu atmiņas. Agrīnās versijas tika licencētas saskaņā ar BSD stila licenci, un kopš Lua 5.0 tās ir izmantojušas MIT licenci , kas pilnībā atbilst GPL prasībām.
Filozofija un dizains: viegls, iebūvēts un daudzparadigmisks
Lua prioritāri piešķir "dažiem, ļoti spēcīgiem elementiem". Tās konceptuālais ietvars ir apkopots trīs pīlāros : tabulas kā vienīgā datu struktūra, funkcijas kā pirmās klases pilsoņi un korutīnas sadarbības plūsmas kontrolei. Izmantojot šos pamatus, lietotāji var veidot pielāgotus moduļus, objektus, vides un abstrakcijas .
To bieži raksturo kā procedurālu, taču tā dabiski pieņem funkcionālus stilus (slēgumus, augstāka līmeņa komandas), objektorientētas pieejas (izmantojot metatabulu un prototipu palīdzību) un uz datiem balstītu pieeju. Tās minimālisms nenozīmē stingrību: valoda paplašinās un pielāgojas, pārdefinējot uzvedību, izmantojot metatabulu palīdzību.
Būtiskā sintakse un izpilde
Lua valodā mainīgajiem nav statisku tipu ; to vērtībām tiek piešķirti tipi. Tā nodrošina astoņus pamattipus : nil , boolean , number , string , table , function , userdata un thread (korutīnas). Turklāt tā atbalsta kontrolētu skaitļu un virkņu mijiedarbību izpildes laikā.
Valoda ir organizēta gabali (koda daļas), ko kompilators pārveido anonīmās funkcijās; tas palīdz iekapsulēt valsti tagad darbojas bez nejaušiem “maģiskajiem globālajiem efektiem”. Komentāri ir apzīmēti ar -- un atbalsta virkņu literāļus ar garām pēdiņām vai iekavām; operatoriem ietver aritmētisko, relāciju, īsslēguma loģiku (and, or, not), konkatenācija (..) un garums (#).
Runājot par plūsmas kontroli, mēs atradām if/elseif/else, while, repeat until (korpuss garantēts vismaz vienu reizi) un divi varianti for: skaitlisks (ar sākumu, beigām un soli) un vispārējs (iteratori, piemēram, pairs o ipairs). The vietējie paziņojumi ierobežot leksisko darbības jomu un atgriešanās atļauj vairākas vērtības.
Datu tipi un piespiešana
Pēc būtības Lua ir dinamiski tipizēta . Automātiskās konvertēšanas galvenokārt notiek starp virkni un skaitli aritmētiskajās darbībās vai teksta kontekstos. Nosacījuma paziņojumi par nepatiesu uzskata tikai "false" un "nil" ; viss pārējais ir "true" (ieskaitot 0 un tukšu virkni).
Galvenie datu tipi ietver tabulas (vārdnīcas/asociatīvās masīvi), funkcijas (pirmās klases vērtības), lietotāja datus (C atmiņas bloki) un pavedienus (korutīnas). Tabulas ir heterogēnas , pieņemot jebkuru atslēgas tipu, izņemot nil , un veidojot pamatu sarežģītām struktūrām, piemēram, sarakstiem, ierakstiem, kokiem un retinātiem masīviem.
Tabulas un metatabulas: valodas būtība
Tabula ir vienīgā datu struktūra un tiek izmantots visam: sākot no vienkārša masīva ({10,20,30}) katalogiem, objektiem, moduļiem un vidēm. Piekļuve t y t.x ir līdzvērtīgs, ja atslēga ir vārds. Konstruktori ar iekavām to atļauj ļoti kompaktas izpausmes inicializācijas.
ar metatabulas se no jauna definēt uzvedību operatoru un piekļuves: __add, __eq, __lt, __concat, __len, __index, __newindex, __callutt. Tas ļauj pārslogot saskaitīšana, salīdzināšana, konkatenācija vai kā reaģēt uz piekļuvi trūkstošam laukam, cita starpā. Tādējādi jūs varat veidot komplekso skaitļu klases, starpniekserveri, validatori vai apvalki tikai ar dažām rindiņām.
Moduļi un vides
Funkcija require ielādē moduli (gabalu, kas, izpildot, parasti atgriež tabulu ar funkcijām un konstantēm). Iekšēji Lua kompilē kodu funkcijā un izpilda to savā vide, atgriežot rezultātu atkārtotai izmantošanai. Globālie mainīgie “atrodas” tabulā, kas ir pieejama kā _G un modernākās versijās — caur funkcijas redzamo vidi (_ENV).
Šī arhitektūra saglabā mazu binārā faila izmēru : tā vietā, lai ielādētu visu, katrs modulis atklāj tikai nepieciešamo, un izstrādātājs izlemj, ko iekļaut. Leksiskā redzamība un vides atdalīšana samazina blakusparādības starp koda daļām.
Funkcijas, slēgumi un fragmenti
Lua valodā funkcija ir vērtība : tā tiek piešķirta mainīgajiem, nodota kā arguments un atgriezta kā rezultāts. Nav stingras aritātes: papildu argumenti tiek ignorēti ; trūkstošie argumenti tiek aizpildīti ar nulli . Pat fragmenti tiek uzskatīti par anonīmām funkcijām, kas atvieglo lokālā stāvokļa iekapsulēšanu, nepiesārņojot globālo vidi.
Kā sintaktiskais cukurs, operators : (kols) ļauj definēt un izsaukt “metodes”, nododot self netieši: obj:metodo(x) ekvivalents a obj.metodo(obj, x). Slēgšana Tie uztver augšupvērstas vērtības, kas ir ļoti spēcīgs pamats iteratoru, rūpnīcu un tīru API veidošanai.
Objektorientācija “Lua veidā”
Lai gan tajā nav tādu nodarbību, Lua īsteno OOP, izmantojot tabulas un metatabula.Visizplatītākie modeļu pielietojumi __index Lai deleģētu prototipam: objekti saglabā savu stāvokli un meklē savas metodes “veidnē” (prototipa tabulā). Konstruktors var viegli piešķirt metatabulu un atgriezt jaunas instances.
Apvienojot konstruktori, __index un sugar:, tiek iegūts pragmatisks OOP: metodes ar self, pseidomantošanu (ķēdētus prototipus), pārrakstīšanas iespēju un elastīgs sastāvsTā ir vienkārša un ļoti efektīva pieeja spraudņiem, spēlēm vai konfigurācijas skriptiem.
Korutīnas: kooperatīva daudzuzdevumu veikšana
the korutīnas Tie piedāvā ļoti smalku plūsmas kontroli: tos var yield y resume noteiktos punktos, tādējādi taupot akumulatoru. Tie darbojas kā kooperatīva daudzpavedienu apstrāde, ideāli piemērots spēļu loģikai, reaktīvām sistēmām, vienkāršiem plānotājiem vai slinki iteratoriTurklāt tie ļauj eleganti pārslēgties starp Lua un resursdatora kodu (piemēram, C/C++).
Praktiski korutīna darbojas, līdz tā beidzas , atgriežot vērtības personai, kas to restartē, un pēc tam turpinot tieši tur, kur tā tika pārtraukta. Interaktīviem uzdevumiem, stāvokļu mākslīgajam intelektam vai simulācijām tas ir ļoti vērtīgs rīks, pateicoties tā zemajām izmaksām un skaidrībai.
Standarta bibliotēkas un utilītas
Lua ir aprīkota ar kompaktu, bet ļoti noderīgu standarta bibliotēku komplektu: pamata (assert, type, pairs, require…), virknes (patterns, gsub, gmatch, format), tabulas (insert, remove, sort, concat), matemātikas (trigonometrija, eksponenciāli, nejaušība), io (faili), os (datumi, vide, procesi) un atkļūdošanas (āķi, trases, pārbaude). Tās ir izstrādātas, lai apmierinātu 80% reālās pasaules vajadzību ar minimālu resursu patēriņu.
sistēma stīgu raksti piedāvā jaudīgu meklēšanu, uztveršanu un aizstāšanu, neizmantojot pilnas regulārās izteiksmes; ar tādām funkcijām kā gmatch o gsub Tipiskākie teksta apstrādes gadījumi tiek atrisināti vienkāršā veidā. kodolīgi.
Iegults C/C++ un integrācijas API
Viena no tās stiprajām pusēm ir API C valodāSaimnieks izveido lua_State, ielādējiet fragmentus (lua_load), izsauc funkcijas (lua_pcall lai izpildītu aizsargātus), reģistrus vietējās funkcijas pieejams no Lua un pārvieto datus starp virtuālā kaudzeIr utilītas kļūdu apstrādei, atkritumu savākšanai, metatabulām un “lietotāja datiem”, kas atklāj C pasaules struktūras.
Šis dizains padara Lua par universālu skriptēšanas dzinēju C/C++ lietojumprogrammām: loģika ir deleģēta Lua (to ir viegli iterēt un izvietot), vienlaikus saglabājot vietējā kodola veiktspēju. Tā mazais izmērs (implementācija ~25 000 C rindiņu un binārie faili simtos KB) palīdz to integrēt pat pieticīgās ierīcēs.
Lua lietu internetā un mikrokontrolleros (ESP8266/NodeMCU)
Lua ir lieliski piemērota lietu internetam (IoT), pateicoties tās vienkāršībai un ātrajam izstrādes ciklam. NodeMCU priekš ESP8266 piedāvā programmaparatūru, kas darbina Lua, un ar tādiem rīkiem kā Lua augšupielādētājs o ESPlorer Varat augšupielādēt skriptus, atvērt konsoli, testēt fragmentus un atkļūdot acumirklī. Fails init.lua parasti sākt loģiku ierīces darbības (piemēram, mirgojoša gaismas diode vai GPIO konfigurēšana).
Iespēja pakāpeniski izpildīt koda daļas, nevajadzot visu pārkompilēt, ir ļoti ērti eksperimentēt: deklarēt mainīgos, izveidot print(a+b), pārslēgšanas tapas utt. Tiem, kas nāk no Arduino, šī plūsma ir veikls un didaktisks, un bieži vien nelielas izmaiņas ir pietiekamas, lai skriptus pārnestu uz citām saderīgām ierīcēm.
Ievērojami pielietojumi videospēlēs un programmatūrā
Pateicoties vieglajam svaram, veiktspējai un atļaujošajām licencēm , Lua ir iecienīta valoda spēļu dzinēju un modifikāciju jomā. Tādas platformas kā Roblox ir reklamējušas tipizētu variantu (Luau); tādas spēles un dzinēji kā World of Warcraft , smilšu kastes spēle Garry's Mod (balstīta uz Half-Life 2), RTS Supreme Commander , kas ir daļa no STALKER , LucasArts piedzīvojumi, piemēram, Grim Fandango un Escape from Monkey Island , Worms 4: Mayhem , un tādas sistēmas kā LÖVE2D ir pierādījušas savu jaudu saskarnes skriptēšanā, spēļu loģikā un modifikācijās.
Tas parādās arī MMO spēlēs un platformās, piemēram, Tibia (ar plašām pielāgošanas iespējām līdzās XML), Ragnarok Online (homunculus AI), serveros un modifikācijās, piemēram, Multi Theft Auto: San Andreas vai FiveM , spēlēs, piemēram, Factorio (uz Lua balstītas modifikācijas), Hedgewars , Transformice , Minetest (modifikāciju vai veselu spēļu izveide), StepMania (animācijas un komandas) un pat tādās spēlēs kā The Binding of Isaac: Rebirth (DLC Afterbirth+ pievienots Lua modifikāciju atbalsts).
Rīku un sistēmu jomā logu pārvaldnieki , piemēram, Ion un Awesome, izmanto Lua konfigurēšanai un paplašināšanai, savukārt tādas lietojumprogrammas kā REAPER , Rockbox un Renoise DAW to izmanto skriptu veidošanai un dziļai pielāgošanai (pielāgots API, OSC, MIDI, izvēlnes, peldošie logi, integrēts terminālis). To izmanto arī ievades datu apstrādei , lietojumprogrammu konfigurēšanai, aparatūras vadībai un uzdevumu automatizēšanai.
Veiktspēja, ieviešana un atkritumu savākšana
Lua kompilējas baitkodā un darbojas efektīvā virtuālajā mašīnā; prasīgiem scenārijiem LuaJIT pievieno izpildlaika kompilāciju. Atkritumu savācējs ir inkrementāls, ar karodziņu slaucīšanu , konfigurējams (pauzes un soļa reizinātājs) un atbalsta finalizatorus (__gc) lietotāja datiem un vājām tabulām (atslēgām/vērtībām, kas neliedz atbrīvot atmiņu).
Šī ātruma un kontroles kombinācija nodrošina zemu latentuma līmeni, kas ir pieņemams spēlēm, spraudņiem un iegultajām sistēmām. Minimālais aizņemšanas apjoms ļauj to izvietot ierīcēs ar ļoti ierobežotiem resursiem, neupurējot izteiksmes iespējas.
Dizaina salīdzinājums un mācīšanās
Atšķirībā no sarežģītākām valodām, Lua prioritāte ir ekonomija un sadarbspēja . Tās mērķis nav aizstāt Python vai JavaScript kā "pilnīgu ekosistēmu", bet gan būt par labāko variantu, ja vienkāršība, pārnesamība un paplašināmība C valodā ir galvenā . Grāmata " Programmēšana Lua valodā" un tehniskie raksti iedziļinās lēmumos, kas izskaidro tās eleganto dizainu.
Tie, kas nāk no Pascal, C vai valodām ar skaidru sintaksi, atrod vienmērīga ieejas līkne: bloki ar do ... end, lasāmi nosacītie teikumi, 20 precīzi definēti atslēgvārdi un modelis local par ierobežot blakusparādībasTās “līme” ar C un elastīgā tabulu semantika mudina veidot no apakšas uz augšu tikai to, kas ir nepieciešams.
Bieži sastopami gadījumi un anekdotes
Runājot par pārnesamību, Lua lietotnes migrēšana starp operētājsistēmām parasti prasa minimālas izmaiņas. Konsolēm un ierīcēm ir pieejamas versijas PSP , Wii un SEGA Saturn (ar īpašām bibliotēkām), un mājas alus darītāju kopienas ir izmantojušas Lua tās vienkāršības dēļ.
Privātos serveros un modifikācijās (piemēram, Tibia ) cilvēki izmanto Lua, lai izveidotu augsta līmeņa sistēmas, skriptus un paplašinājumus . Un, ja strādājat tādās radošās platformās kā Friday Night Funkin' , Lua tiek izmantota, lai mainītu HUD, modifikāciju diagrammas un ainu dekorācijas, demonstrējot tās daudzpusību dinamiskai horeogrāfijai.
Stiprās puses, kas izskaidro tā panākumus
Viegli un ātri : ļoti mazi binārie faili, minimāls atmiņas patēriņš un efektīvs interpretētājs/virtuālā mašīna. Ierīcēs ar ierobežotiem resursiem šī taupība ir ļoti svarīga.
Lielisks C API : vietējo funkciju reģistrēšana un struktūru atklāšana ir vienkārša. Sarežģītām lietotnēm, kas pārveidotas par "resursdatoriem", Lua ir ideāls savienojums starp vietējo kodolu un augsta līmeņa loģiku.
Daudzparadigmas un modulārs : ar tabulām, metatabulām, funkcijām un korutīnām jūs veidojat tieši to, kas jums nepieciešams, ne vairāk, ne mazāk. Šis pārdomātais minimums novērš nevajadzīgu sarežģītību.
Kopiena un dokumentācija : kodolīga uzziņu rokasgrāmata, daudzi piemēri un materiāli vairākās valodās (angļu, spāņu, portugāļu). Kultūra "saprotiet, kā tas darbojas" pārvēršas skaidrā un stabilā kodā.
Sintakses detaļas un operatori, kas jāatceras
Loģiskie operatori ar īsslēgumu kas atgriež operandus (ne tikai loģiskās vērtības): a and b y a or b var atgriezt nebūla vērtības, kas ir ļoti noderīgi noklusējuma piešķirjumiem (x = x or {}).
Savienošana ar .., garums ar # (virknēs un “masīva tipa” tabulās), kāpināšana ar ^un C līdzīgas precedentes ar tādām īpatnībām kā labā asociativitāte .. y ^. ķēdes raksti Tie piedāvā ērtu uztveršanu un meklēšanu bez ārējām atkarībām.
Kāpēc tik daudzi dzinēji un instrumenti to izvēlas?
Jo tas samazina berzi starp dizainu un izpildi : iterācija Lua valodā ir ātra, skriptus ir viegli izplatīt un auditēt, un iebūvētais kodols ir aizsargāts no biežām izmaiņām. Turklāt, tā kā tā ir bezmaksas programmatūra ar atļaujošu licenci , tā lieliski iederas komerciālos produktos un kopienas projektos.
Un ir vēl viens svarīgs kultūras faktors: valodas skaidrība veicina programmēšanas koncepciju (augstākas kārtas funkciju, slēgumu, iteratoru) apguvi, ko pēc tam var pielietot citās vidēs. Jauktām komandām (dizains, skriptēšana, dzinējs) tas paātrina piegādes , nezaudējot kvalitāti.
Izpētot Lua vēsturi, dizainu un lietojumu, ir viegli saprast, kāpēc tā ir ieguvusi īpašu vietu: maza valoda, kas paveic lielas lietas . Sākot ar videospēlēm un DAW līdz lietu internetam un peldošajiem logiem, tās tabulu un metatabulu, pirmklasīgu funkciju un korutīnu kombinācija nodrošina tīrus, modulārus un viegli uzturējamus risinājumus. Ja meklējat uzticamu skriptēšanas dzinēju, ko integrēt savās lietojumprogrammās, vai vienkāršu automatizācijas valodu, neupurējot jaudu, Lua ir izcils partneris.
