Lua (programozási nyelv)

A Lua egy gyors és egyszerűen használható scripting programozási nyelv. Egyesít egy egyszerű eljárási szintaxist a rugalmas adatleírási konstrukciókkal az asszociatív tömbök és a bővíthető szemantika alapján. A Lua dinamikusan íródik és értelmezhető. A tolmács a forráskódot a regiszter virtuális gépének byte-kódjává alakítja, és szabadon elosztott, nyílt forráskódú C programokkal. A standard Lua virtuális gép a memóriaelosztást a szemétgyűjtéssel (Java vagy .NET-hez hasonlóan) használja.

A teremtés története

Lua 1.0 úgy terveztük, hogy annak célja a konstruktőrök benne SOL szintaxis (innen a név Lua: portugál sol - «Sun» Lua - «Moon"). Ellenőrző Lua konstrukciókat vettünk Modula (ha, míg a, ismételje / ig), CLU (párhuzamos hozzárendelés, többes visszatérési értéke a funkciót, mint egy egyszerűbb alternatív, az nem adja át a link vagy explicit mutató paraméterek), a C ++, SNOBOL nyelven és AWK (asszociatív tömbök).

A Lua verziói 5,0-ig a BSD licencéhez hasonló licensz alatt álltak ki. Az 5.0-s verziótól és a magasabb verziótól kezdve a Lua az MIT licenc alatt kerül forgalomba. Mindkét engedély engedékeny és szinte azonos.

műszerek

Az offline tolmács (más néven lua.c a forrásfájl nevével, vagy egyszerűen csak a lua a végrehajtható) egy kis program, amely lehetővé teszi a Lua közvetlen használatát. Amikor a tolmács egy fájlt tölt be, akkor figyelmen kívül hagyja az első sort, ha "számjelzéssel" kezdődik ("#"). Ez a funkció lehetővé teszi a Lua számára, hogy parancssori értelmezőként használja a Unix rendszereket. Ha a kódot előtagolja a formanyomtatványon

(feltételezve, hogy az önálló tolmács a / usr / local / bin -ban található), vagy

akkor közvetlenül hívhatja (végrehajthatja) a programot, anélkül, hogy előzetesen le kellene futtatnia a Lua tolmácsot.

Minden paraméter választható. Ahogy láttuk, amikor a lua argumentumok nélkül indul, a tolmács online lesz. A -e kapcsoló lehetővé teszi a kód beírását közvetlenül a parancssorba.

(Unix, meg kell adnia idézőjelek között külön shell parancsokat a tényleges végrehajtható kódot.) Mint már említettük, -l kapcsoló letölti a fájlt és az -i alakítja a tolmács interaktív módban történő kezelés után más billentyűkkel (opció). Például egy hívást

betölti az a.lua fájlt, majd végrehajtja az x = 10 hozzárendelést, és végül megadja a parancsot a bemenet számára.

A nyelvben lévő parancsfájlok a .lua kiterjesztéssel vannak jelölve. Az időigényes feladatokhoz Lua-LuaJIT JIT fordító van. fordító LLVM-lua is kialakítva, hogy a kódot a LLVM virtuális gép, ami lehetőséget ad arra, hogy kövesse nyomon a válogatás egy nagyon hatékony gépi kódot egy másik processzor.

Alapelvek

Lexikai egyezmények

A Lua nevek (azonosítók) bármilyen betűk, számjegyek és aláhúzások lehetnek, amelyek nem kezdődnek számjegyekkel. A következő kulcsszavak vannak fenntartva, és nem használhatók a nevekben:

A Lua a karakterek esetében érzékeny a kis- és nagybetűkre: és - egy kulcsszó, míg And és AND két különböző érvényes azonosítóval rendelkezik. Az aláírással kezdődő és nagybetűvel írt nevek (például _VERSION) a Lua által használt belső globális változóként használhatók. Az irodalmi húrokat egyetlen vagy kettős idézetek közé kell zárni, és C-szerű escape szekvenciákat tartalmazhatnak.

Típusok és változók

A Lua nyolc fő típusa van: nulla (nem specifikált), logikai (logikai), szám (numerikus), string (karakterlánc) függvény (function), userdata (felhasználói adatok), menet (thread), és az asztali (tábla).

  1. Nil az érték típusa nil [üres érték]. Fő tulajdonsága, hogy eltér az összes többi értéktől, és jelzi a megfelelő érték hiányát.
  2. A Boole-féle típus hamis (hamis) és true (igaz). A null és a hamis értékek hamisak, minden más érték igaznak tekinthető. A szám típus a valós számokra vonatkozik (dupla pontosságú lebegőpont).
  3. A karakterlánc karaktereket tartalmaz. A Lua karakterláncok bármelyik 8 bites karaktert tartalmazhatnak, beleértve a nulla értéket is ('\ 0').
  4. A felhasználói adatok (felhasználói adatok) típus lehetővé teszi, hogy minden adatot C-ből tárolj a Lua változókban. Az ilyen típusú érték a fizikai memóriablokkra való hivatkozás, és nincs előre meghatározott művelete a Lua-ban, kivéve a hozzárendelés és az egyenlőség tesztelését. Azonban a metatables használatával a programozó meghatározhatja az ilyen típusú értékek műveleteit.
  5. A téma típusa (menet) a végrehajtás független folyamatát jelöli, és a coroutine mechanizmus végrehajtása során használják. Nem tudja azonosítani a Lua szálakat az operációs rendszer szálakkal. A Lua támogatja a szubrutinokat olyan rendszerekben is, ahol az operációs rendszer szintjén lévő szálak nem támogatottak.
  6. Az asztaltípus az asszociatív tömböket határozza meg. Ezeket a tömböket nem csak számok, hanem bármilyen értékek is indexelhetik (a null kivételével). A táblázat tartalmazhat többféle értéket (kivéve a nulla értéket). A táblák az egyetlen mechanizmus az adatok strukturálására a Lua-ban; egyszerű tömbök, szimbólum táblák, készletek, rekordok, fák és így tovább. A szótárak megjelenítéséhez a Lua a mező nevét használja a táblázat indexeként. Az a.name formátumú ábrázolás megegyezik a ["név"] ábrázolásával. Mivel a funkciók a beépített típus értékei, a táblaterületek tartalmazhatnak funkciókat. Így a táblák módszertani módszereket tárolhatnak.

A változók, mint például a táblázat, a függvény, a szál és a felhasználói adatok nem tartalmazzák az adatokat, csak a megfelelő objektumra utalnak.

A Lua háromféle változója létezik: globális. helyi és asztal mezők. Bármely változó akkor tekinthető globálisnak, ha nem kifejezetten helyi. A lokális változók lexikális környezetben léteznek: a helyi változók az ebben a kontextusban definiált függvények számára állnak rendelkezésre.

A Lua-ban egy általánosan elfogadott deklaráció-készletet támogatunk, szinte hasonlóan a Pascal vagy a C-hoz. A hozzárendelési operátorok, áramlásvezérlő operátorok, függvényhívások és változó leírásokból áll.

Az alábbiak az alapvető műveletek:

Az egyenlőséghez viszonyítva a típusátalakítást nem hajtja végre. A különböző típusú objektumokat mindig különbözőnek tekintik. Egy érték kiszámításakor rövidzárat használunk - a második argumentumot csak akkor értékeljük ki, ha szükséges. A következő prioritási táblázat és műveletek asszociatív jellege működik:

Lua-nak nincs külön funkciója, amely elindítja a program végrehajtását. A tolmács egymás után végrehajtja a fájlból vagy a vezérlőprogramból kapott állításokat. Ezzel előkészíti a programot bináris ábrázolásra, amely szintén menthető.

Minden kódblokk névtelen funkcióként működik, így helyi változókat határozhat meg, és visszaadhat egy értéket abból.

Az operátorok lehetnek (de nem feltétlenül) a ";" szimbólummal.

Az alábbiakban a főbb szereplők:

A blokk nem. a végén egy utasítássorozatot fordít egy kezelőre, és új területet nyit meg, amelyben helyi változókat határozhat meg.

Ha az állítások. miközben és ismételjük meg a kifejezés összes értékét, kivéve a hamis és null értékeket, igaznak tekintjük. A visszatérési utasítás nem tartalmazhat visszatérési értékeket, és nem tartalmazhat egy vagy több kifejezést (lista). A visszatérési és szünetkifejezéseknek az utolsó mondatoknak kell lenniük a blokkban (vagyis az utolsó mondatoknak kell lenniük a kódblokkban vagy éppen a vége előtt).

Az utasítás utasítás végrehajtásra kerül a ciklus minden változójának értékére a kiindulási értéktől kezdődően, végül a végső értékkel együtt. A harmadik értéket, ha megadjuk, a loop változó módosításának lépéseként használjuk. Mindezeknek az értékeknek numerikusnak kell lenniük. Csak a ciklus végrehajtása előtt értékelik őket. A hurokváltozó helyi ebben a hurokban, és nem áll rendelkezésre a testén kívül. A hurokváltozó értéke nem változtatható meg a hurok testen belül. Itt van egy pszeudo kód, amely bemutatja a for utasítás végrehajtását.

A függvénydefiníció egy végrehajtható kifejezés (függvény-konstrukció), amelynek eredménye a típusú függvény egyik objektuma:

A függvény-argumentumok listája (esetleg üres) zárójelbe kerül. A függvények argumentumainak listája ellipszisszel végződhet - ebben az esetben a függvény változó számú argumentummal rendelkezik. A záró zárójel és a végkifejezés között helyezkedik el a funkciótest.

A funkció konstruktorának kivitelezésének pillanatában egy lezárást is létrehozunk - egy táblázatot a függvényben rendelkezésre álló összes helyi változóról és annak külső vonatkozásában. Ha a függvény visszatérési értékként van átadva, akkor hozzáférést biztosít a lezárásba lépő összes változóhoz. Minden alkalommal, amikor egy függvény-konstruktor végrehajtásra kerül, új záróelemet készítenek.

A függvényhívás funkcionális hivatkozásból és zárójeles listából áll (esetleg üres). Egy függvény hivatkozása bármilyen kifejezés lehet, amelynek eredménye egy függvény. A funkció referenciája és a nyitó zárójel között nem lehet soros betáplálás.

Ha a függvény egyetlen argumentumot vesz fel, és egy táblázatot kezel, amelynek elemeit a függvény formális paramétereinek nevei indexelik, ebben az esetben a nevezett argumentumok mechanizmusára való hívást ténylegesen végrehajtják:

A meta-asztalok

Minden asztal és userdata objektum típusát lehet meta-asztal - rendszeres asztal, mezők, amelyek meghatározzák a viselkedés a forrás objektum amikor rá vonatkozó speciális műveleteket. Például, ha az objektum hozzáadása operandus, az értelmező megkeresi a meta-table nevű mező __add és ha ezen a területen jelen van, akkor használja érték függvényében elvégzésére kívül. A meta-táblák indexei (terepi nevek) nevezhetők eseményeknek, és a megfelelő értékek (eseménykezelők) metametódok.

Alapértelmezés szerint az újonnan létrehozott táblázatnak nincs meta-táblája. Bármely táblázatot tt táblázatok meta-táblázata készíthet. a setmetatable (t, mt) függvény hívása. A getmetatable (t) függvény a t vagy nil táblázat meta-tábláját adja vissza. ha a táblázatban nincs meta-táblázat.

Lua meghatározza a következő eseményeket:

Példák meta táblák használatára

A következő példában a meta-táblák alapértelmezett értéket rendelhetnek hozzá a hiányzó táblázatelemekhez:

Íme egy nem triviális megoldás, amely nem használ külön meta-táblázatot minden véletlen értékre:

Ennek a meta-táblázat meta-metszete __index lekapcsolja a hiányzó táblaterületeket, és visszaadja a táblázatban tárolt értéket a kulcsmutatóval.

A csomagok a fő módja annak, hogy definiálják egymással összefüggő funkciók sorát anélkül, hogy a globális hatókört szennyeznék. Jellemzően egy csomag egy különálló fájl, amely a globális hatókörben egyetlen táblát határoz meg, amely tartalmazza a csomag összes funkcióját:

Az összes funkciót helyi és külön is elkészítheti az exportált funkciók táblázata alapján:

A csomag betöltése a require () függvény használatával történik. és a rendszerindításkor a név átkerül ebbe a függvénybe (ez nem tartalmazhat automatikusan hozzáadott kiterjesztést) a _REQUIREDNAME változón keresztül érhető el.

Osztályok és tárgyak

Itt az osztályfüggvény egy üres táblát hoz létre, amely készen áll arra, hogy az objektum meta-táblázatává váljon. Az osztálymódszerek a táblaterületek, pl. Az osztály egy olyan táblázat, amely egyidejűleg tartalmazza az objektum és meta-metódusainak módszereit.

Az object () függvény létrehozza a megadott osztály objektumát - egy táblát, amely a megadott osztályt meta-táblázatként tartalmazza. A második argumentumban egy táblázat adható meg, amely tartalmazza az objektum inicializált mezőit.

Szabványos könyvtárak

A standard Lua könyvtárak gyakran használt funkciókat tartalmaznak, amelyeket közvetlenül a C API-ban hajtanak végre. Néhány ilyen funkció fontos nyelvi szolgáltatásokat nyújt (pl. Típus és getmetatable); mások hozzáférést biztosítanak a "külső" szolgáltatásokhoz (például input / output); részben a Lua-ban kerülnek bevezetésre, bár gyakran használják és kritikus végrehajtási időt hajtanak végre C-ben (például rendezés).

Minden könyvtárat a hivatalos C API segítségével hívnak le, és külön C modulként futnak. Jelenleg a Lua a következő standard könyvtárakkal rendelkezik:

  • alapkönyvtár;
  • csomag könyvtár;
  • szalagokkal dolgozni (string manipuláció);
  • asztalokkal való munka (asztali manipuláció);
  • matematikai funkciók (bűn, napló stb.);
  • bemenet / kimenet;
  • operációs rendszer (operációs rendszer);
  • hibakeresési lehetőségek.

Minden könyvtár, az alapkönyvtár és a csomagkönyvtár kivételével, minden funkciót globális táblázatmezőként vagy objektummódszerekként jelenít meg.

Irodalom

Kapcsolódó cikkek