Lua | |
---|---|
Jazyková třída | funkční programovací jazyk , objektově orientovaný programovací jazyk , skriptovací jazyk , multiparadigmatický programovací jazyk , imperativní programovací jazyk , procedurální programovací jazyk , prototypově orientovaný programovací jazyk [d] , interpretovaný programovací jazyk , kompilovaný programovací jazyk , svobodný software a formát souborů |
Objevil se v | 1993 [2] |
Autor |
Roberto Jeruzalimski , Valdemar Selish, Luis Enrique de Figueiredo |
Vývojář | Robert Jeruzalimsky [1] |
Přípona souboru | .lua[3] [4] ,.luna,.lunairenebo.anair |
Uvolnění | 5.4.4 (26. ledna 2022) |
Typový systém | dynamický , silný , kachní |
Byl ovlivněn | C++ , Clu , Simple Object Language [d] , DEL , Snobol , Modula , Modula-2 a Scheme |
ovlivnil | JavaScript |
Licence | licence MIT [5] [6] |
webová stránka | lua.org ( angličtina) ( port) |
OS | multiplatformní [7] |
Mediální soubory na Wikimedia Commons |
Lua ( lua , port. - „měsíc“ [8] ) je skriptovací programovací jazyk vyvinutý v divizi Tecgraf ( Computer Graphics Technology Group ) Katolické univerzity v Rio de Janeiru ( Brazílie ). Jazykový tlumočník je bezplatný tlumočník jazyka C s otevřeným zdrojovým kódem .
Z hlediska ideologie a implementace je jazyk Lua nejblíže JavaScriptu , konkrétně také implementuje model prototypu OOP , liší se však syntaxí podobnou Pascalu a výkonnějšími a flexibilnějšími konstrukcemi. Charakteristickým rysem Lua je implementace velkého množství softwarových entit s minimem syntaktických prostředků. Všechny složené uživatelsky definované datové typy ( pole , struktury , množiny , fronty , seznamy ) jsou tedy implementovány prostřednictvím mechanismu tabulek a mechanismů objektově orientovaného programování , včetně vícenásobné dědičnosti , pomocí metatabulek , které jsou také zodpovědné za přetížení operací a množství dalších funkcí.
Lua je určen pro uživatele, kteří nejsou profesionálními programátory, v důsledku čehož je věnována velká pozornost jednoduchosti designu a snadnému učení. Jazyk je široce používán k vytváření replikovatelného softwaru (je v něm například napsáno grafické rozhraní balíčku Adobe Lightroom ). Také získal výtečnost jako programovací jazyk pro úrovně a rozšíření v mnoha hrách (včetně Garry's Mod ) [9] .
Jazyk byl vyvinut divizí Tecgraf (skupina počítačových grafických technologií) Katolické univerzity v Rio de Janeiru v Brazílii, historie jazyka sahá až do roku 1993. Autory jazyka jsou Roberto Jeruzalimski , Luiz Henrique de Figueiredo a Waldemar Celes . Lua je volně distribuovaný, open source v jazyce C.
Jak poznamenal Luis Enrique de Figueiredo, Lua je jediný programovací jazyk vyvinutý v rozvojové zemi , který získal celosvětové uznání, což bylo vyjádřeno zejména v pozvání na konferenci HOPL [10] .
Historickými rodiči jazyka byly jazyky pro konfiguraci a popis dat SOL (Simple Object Language) a DEL (Data-Entry Language) [11] , které byly nezávisle vyvinuty v Tecgraf v letech 1992-1993, aby dvěma samostatným projekty (oba byly interaktivní grafické aplikace pro potřeby designu ve společnosti Petrobras ). SOL a DEL postrádaly jakékoli řídicí konstrukce a Petrobras cítil rostoucí potřebu přidat k nim plné programování.
Jak píše autor jazyka v The Evolution of Lua : [12]
V roce 1993 byl jediným skutečným uchazečem Tcl , který byl speciálně navržen pro zabudování do aplikací. Tcl však měl neznámou syntaxi, postrádal dobrou podporu popisu dat a běžel pouze na platformách Unix . Neuvažovali jsme o Lisp nebo Scheme kvůli jejich nepřívětivé syntaxi. Python byl stále v plenkách. V kutilské atmosféře, která v Tecgrafu tehdy vládla, bylo zcela přirozené, že jsme se rozhodli vyvinout vlastní skriptovací jazyk. Vzhledem k tomu, že většina uživatelů nebyli profesionální programátoři, jazyk se musel vyhýbat spletité syntaxi a sémantice. Implementace nového jazyka musela být snadno přenosná , protože klienti Tecgrafu měli velmi různorodé platformy. A konečně, protože jsme očekávali, že další produkty Tecgraf budou také potřebovat vestavěný skriptovací jazyk, měl by nový jazyk následovat příklad SOL a být poskytován jako knihovna s C API .
Lua 1.0 byla navržena tak, že konstruktéři objektů, tehdy mírně odlišný od současného lehkého a flexibilního stylu, zahrnovali syntaxi jazyka SOL (odtud název Lua: v portugalštině sol - "slunce", lua - "měsíc") . Řídicí konstrukty Lua jsou většinou vypůjčeny z Modula-2 (if, while, repeat/until), i když jsou také ovlivněny Clu ( paralelní přiřazení , návratová hodnota více funkcí jako jednodušší alternativa k předávání parametrů odkazem nebo explicitními ukazateli ), C++ ( "Je to skvělý nápad deklarovat místní proměnné pouze tehdy, když je potřebujete"), Snobol a awk ( asociativní pole ). Tvůrci Lua také uznávají, že jediný všudypřítomný mechanismus strukturování dat v Lisp a Scheme ( propojený seznam ) měl velký vliv na jejich rozhodnutí zvolit tabulky jako primární datovou strukturu pro Lua [13] .
Verze Lua až do 5.0 byly vydány pod licencí podobnou BSD licenci . Od verze 5.0 je Lua distribuována pod licencí MIT . Obě licence jsou permisivní a prakticky totožné.
Lua je určen k použití jako samostatný skriptovací jazyk nebo zabudovaný do aplikace. Původně byl navržen tak, aby byl dostatečně jednoduchý a kompaktní, aby se vešel na různé platformy a poskytoval přijatelný výkon. Také při návrhu byly zohledněny požadavky na snadnost učení a možnost použití neprofesionálními programátory.
Lua je procedurální dynamicky typovaný modulární jazyk s automatickou správou paměti . Zahrnuje základní prvky pro podporu funkčních a objektových programovacích stylů. Lua lze tedy nazvat jazykem s více paradigmaty . Vestavěné nástroje pro paralelní programování vám umožňují psát vícevláknové programy pouze pomocí jazykových nástrojů, aniž byste se odvolávali na rozhraní API operačního systému nebo externí knihovny. Protože hlavním účelem Lua je inlining, má efektivní interoperabilitu mezi jazyky, zaměřenou především na volání knihoven C a práci v prostředí C.
Jazyk podporuje malý počet vestavěných datových typů: booleany, čísla, řetězce, funkce, proudy. Neexistují žádné typické kombinované datové struktury, jako jsou pole , sady , seznamy a záznamy , místo všech je použita jedna základní struktura Lua, tabulka (viz níže). Samostatný typ userdataje navržen speciálně pro nízkoúrovňové programování a výměnu dat s externím kódem v jiných jazycích. Funkce v Lua jsou objekty první třídy a lze je přiřadit a předávat jako parametry. Podporovány jsou uzávěry, je možné vytvářet funkce vyšších řádů. Objektový systém je prototypový, neexistuje žádná explicitní podpora dědičnosti , ale lze jej snadno implementovat pomocí metatabulek .
Obecně si Lua klade za cíl poskytovat flexibilní metafunkce, které lze podle potřeby rozšiřovat, spíše než poskytovat sadu funkcí specifických pro konkrétní programovací paradigma. Výsledkem je, že základní jazyk je jednoduchý a snadno přizpůsobitelný většině aplikací. Tím, že poskytuje minimální sadu základních zařízení, se Lua snaží najít rovnováhu mezi výkonem a velikostí.
Syntaxe Lua je většinou postavena na jazycích podobných pozdnímu Pascalu, jako je Modula-2 nebo Oberon . Formát zadávání textu je libovolný, příkazy v textu programu jsou odděleny libovolnými mezerami. Je povoleno, ale není vyžadováno, používat k oddělení operací středník.
V rozhovoru s Robertem Jeruzalimskim poznamenal, že syntaxe Lua byla kompromisem, který musel udělat, aby usnadnil neprofesionálním programátorům naučit se jazyk. Syntaxi popsal jako „docela rozvláčnou“ a poznamenal, že on osobně by dal přednost stručnějšímu zápisu [10] .
Hlavní abecedou jazyka je angličtina, znaky jiných jazyků lze použít v řetězcových literálech. Identifikátory se mohou skládat z písmen, číslic a podtržítek, ale nemohou začínat číslem ani odpovídat jednomu z klíčových slov. Jazyková příručka nedoporučuje používat identifikátory začínající podtržítkem, protože takové identifikátory se používají pro systémové účely.
Jazyk rozlišuje velká a malá písmena, všechna klíčová slova jsou psána malými písmeny, identifikátory, které se liší pouze v případě písmen, jsou považovány za odlišné. Následujících 22 klíčových slov nelze použít pro jména [14] :
a break do elseif end false goto pro funkci if v local nil not nebo repeat return then true do while _Komentáře používají následující syntaxi, podobnou Ada , SQL a VHDL :
-- Jednoduchý jednořádkový komentář v Lua začíná dvojitým mínusem a pokračuje až do konce řádku. dim = { "jeden" , "dva" , "tři" } -- Řádkový komentář nemusí začínat na začátku řádku -- může následovat po konstrukcích jiných jazyků -- aby je vysvětlil. ---[[Víceřádkový komentář začíná dvěma po sobě jdoucími otevíracími hranatými závorkami následovanými dvěma mínusy a pokračuje dvěma po sobě jdoucími uzavíracími hranatými závorkami. Jako tady: ]] -- Zajímavého efektu lze dosáhnout kombinací vkládaných a víceřádkových komentářů: ---[[ Chcete-li odkomentovat níže uvedený kód, stačí do tohoto řádku přidat mezeru mezi mínusy a závorky. for i=1,#dim do print(dim[i]) end -- Pokud je mezi znaménka mínus a závorky výše přidána mezera, pak --]] -- zde se konec víceřádkového komentáře změní na normální čáraLua je jazyk s implicitní definicí dynamického datového typu . Jazyková proměnná může obsahovat hodnoty libovolného typu. Všechny hodnoty v Lua mohou být uloženy v proměnných, použity jako argumenty pro volání funkcí a vráceny jako výsledek jejich provedení.
V Lua je osm hlavních typů:
nil je hodnotový typ nil [prázdná hodnota], jehož hlavní vlastností je být odlišná od všech ostatních hodnot a označovat absenci použitelné hodnoty.
Booleovský typ zahrnuje hodnoty false (false) a true (true).
Typ čísla obvykle zahrnuje reálná čísla (double). V prvních verzích Lua nebyla celá čísla oddělena do samostatného typu; toto rozhodnutí je motivováno skutečností, že skutečná reprezentace umožňuje přesně reprezentovat poměrně široký rozsah celých čísel. Od verze 5.3 byla přidána možnost explicitně definovat formát celého čísla nebo reálného čísla. Vnitřní reprezentaci čísel lze změnit při sestavování interpretu.
Typ řetězce označuje pole znaků. Lua řetězce mohou obsahovat libovolný 8bitový znak, včetně nuly ('\0'). Řetězce jsou neměnné. Řetězcové literály lze psát v jednoduchých nebo dvojitých uvozovkách, obslužné znaky jsou v nich umístěny ve standardní notaci C s úvodním zpětným lomítkem. Víceřádkové literály jsou ohraničeny dvěma po sobě jdoucími otevíracími a dvěma po sobě jdoucími uzavíracími hranatými závorkami.
V jazyce není zabudována podpora Unicode, i když je povoleno použití znaků UTF-8 v řetězcových literálech a samotný reprezentační systém UTF-8 umožňuje zadávat, vydávat a částečně zpracovávat řetězce v tomto kódování pomocí standardních systémových nástrojů. . Nejnovější verze Lua zahrnují knihovnu utf8, která poskytuje pokročilejší podporu pro UTF-8, a existují knihovny třetích stran, které poskytují nástroje pro práci s řetězci Unicode v různých kódováních.
Funkce v Lua jsou plnohodnotné objekty, které lze přiřadit, předat jako parametr funkci a vrátit jako jednu z hodnot. Typ vlákna má korutiny, typ uživatelských dat je navržen tak, aby reprezentoval externí data přijatá nebo poskytnutá z/do kódu v jiném jazyce (hlavně C/C++).
Všechny aritmetické operátory podporují skutečné operandy a poskytují předvídatelné výsledky. Například x^0.5vrátí druhou odmocninu z x, x^(-1/3) převrácenou hodnotu odmocniny z x. Operátor %je definován jako: a % b = a - math.floor(a / b) * b, kde se funkce math.floor()vyhodnotí jako celočíselná část svého argumentu. U celočíselných argumentů je jeho výsledek zcela normální. Pro skutečnou dividendu mějte na paměti, že operace neprovádí žádné dodatečné zaokrouhlování ani vyřazení zlomkové části, takže ve výsledku zůstane zlomková část dividendy. Například math.pi % 2nevrátí 1, ale 1.1415926535898. Tato implementace poskytuje některé další funkce. Například ke zkrácení xna tři desetinná místa stačí vzít výrazx - x % 0.001
Tabulka v Lua je dynamické heterogenní asociativní pole , tj. sada párů " ключ-значение". Klíče mohou být hodnoty libovolného typu Lua kromě nil. Klíče mohou být také literály Lua (identifikátory). Zápis nildo prvku tabulky je ekvivalentní smazání tohoto prvku.
Tabulky jsou jediným složeným datovým typem v Lua. Jsou základem pro všechny uživatelem definované datové typy, jako jsou struktury , pole , sady a další:
-- Obecná tabulka: prázdná = {} -- Prázdná tabulka prázdná [ 1 ] = "první" -- Přidání prvku s celočíselným indexem prázdný [ 3 ] = "druhý" -- Přidání prvku s celočíselným indexem prázdný [ "třetí" ] = "třetí" -- Přidat prvek na index řetězce prázdný [ 1 ] = nula -- Odebrat prvek z tabulky -- Klasické pole – řetězce jsou ve výchozím nastavení indexovány celými čísly od 1 dne1 = { "Pondělí" , "Úterý" , "Streda" , "Čtvrtek" , "Pátek" , "Sobota" , "Neděle" } -- Pole s libovolným indexováním dnů2 = {[ 0 ] = "neděle" , [ 1 ] = "pondělí" , [ 2 ] = "úterý" , [ 3 ] = "středa" , [ 4 ] = "čtvrtek" , [ 5 ] = "pátek" , [ 6 ] = "sobota" } -- Záznam (struktura) - hodnoty různých typů jsou indexovány podle literálů osoba = { tabnum = 123342 , -- Osobní číslo fio = "Ivanov Stepan Vasilyevich" , -- Celé jméno post = "nástrojař" , -- Plat na pozici = 25800,45 , -- Plat sdate = " 23. 10. 2013" , -- Datum nástupu do zaměstnání = "08/08/1973" } -- Datum narození pfio = osoba . fio --Odkaz na prvek struktury. -- Set - indexy se používají k ukládání hodnot workDays = {[ "pondělí" ] = true , [ "úterý" ] = true , [ "středa" ] = true , [ "čtvrtek" ] = true , [ "pátek" " ] = true } workDays [ "Saturday" ] = true -- Přidejte sobotu k počtu pracovních dnů workDays [ "Wednesday" ] = nula -- Ve středu již nepracujeme -- Zkontrolujte, zda d je pracovní den , pokud pracovní dny [ d ] pak vytiskněte ( d .. " - pracovní den " ) jinak tiskněte ( d .. " - den volna " ) konecMultisety (množiny, které mohou obsahovat více než jednu instanci stejného prvku) jsou implementovány podobně jako v posledním příkladu, pouze hodnoty nejsou logické, ale celá čísla - čítače počtu odpovídajících prvků v sadě. Propojené seznamy mohou být reprezentovány jako pole dvouprvkových polí obsahujících hodnotu a odkaz na další prvek. Vícerozměrná pole lze implementovat jako pole polí. Složitější struktury jako fronty, grafy, sítě jsou také realizovány na základě tabulek, konkrétní způsob implementace je určen zadáním.
Lua podporuje koncept uzávěrů , například:
function makeaddfunc ( x ) -- Vrátí novou anonymní funkci , která přidá x ke svému argumentu return function ( y ) -- Když odkazujeme na proměnnou x , která je mimo aktuální rozsah -- a jejíž životnost je kratší než tato anonymní funkce -- - - Lua vytvoří uzávěr. return x + y end end plustwo = makeaddfunc ( 2 ) -- tj. plustwo = function(y) return 2 + y end print ( plustwo ( 5 )) -- Prints 7Při každém volání makeaddfuncse pro proměnnou vytvoří nový uzávěr x, takže každá vrácená anonymní funkce bude odkazovat na svůj vlastní parametr x. Jako každý jiný objekt Lua je životnost uzávěru řízena sběračem odpadu.
Mechanismus metatable poskytuje mnoho funkcí, které poskytují jiné jazyky zavedením samostatných syntaktických mechanismů. Metatabulky jsou strukturou obyčejné Lua tabulky, na které se vztahují všechna pravidla a omezení jazyka. Jejich zvláštnost spočívá v jejich aplikaci. Metatabulka ukládá další metadata pro typy a objekty, tedy informace o parametrech a funkcích s nimi spojených. Informace uložené v metatabulkách využívá Lua interpret, jejich použití umožňuje měnit či rozšiřovat funkcionalitu programových objektů.
Metatabulka v Lua může být spojena s hodnotou jakéhokoli typu. Skalární datové typy (všechny kromě uživatelských dat a tabulek) mají společné metatabulky pro každý typ. Tabulky a hodnoty typu userdatamají v každé instanci samostatné odkazy na metatabulky. Úpravy metatabulek všech typů kromě tabulek lze provést pouze prostřednictvím externího kódu C. Přímo z Lua jsou přístupné pouze metatabulky tabulek.
Tabulka Lua vytvořená od začátku nemá metatabulku (její reference na metatabulku je nulová). Ale metatabulku pro něj lze vytvořit kdykoli nebo získat z jiné tabulky. Vestavěná funkce getmetatable(t)vrátí metatabulku tabulky t a funkce setmetatable(t, m)nastaví tabulku t na metatabulku m.
U metatabulek je zdokumentována sada polí, která může jazykový tlumočník použít. Aby byla označena zvláštní role těchto polí, bylo pro ně přijato zvláštní pravidlo pro pojmenování: jejich identifikátory začínají dvěma podtržítky. Některá z těchto polí obsahují informace o specifických vlastnostech objektu, na který metatabulka odkazuje. Například volba __mode, je-li dána, může oslabit tabulku , tedy tabulku, jejíž odkazy na objekty jsou všechny slabé reference . Ale hodnoty většiny možných metatabulkových polí jsou takzvané metametody , tedy odkazy na funkce, které interpret za určitých podmínek volá. Obecná logika používání metametod interpretem je následující: když interpret narazí v programu na operaci, která není definována pro objekt operandu, přistoupí k metatabulce přidružené k operandu, najde v ní odpovídající metametodu a zavolá ji.
--- [[ Operace vytvoření sčítání pro tabulky ]] -- Operandy t1 = { 1 , 2 , 3 } t2 = { 10 , 20 , 30 } -- Vytvořit metatabulku mt = {} -- Zapsat metametodu "__add" mt do metatabulky . __add = funkce ( a , b ) local res = {} pro k v párech ( a ) do res [ k ] = a [ k ] + b [ k ] end return res end -- Svázat metatabulku s tabulkou t1 setmetatable ( t1 , mt ) -- Přidání tabulky je nyní platnou operací t3 = t1 + t2 -- spojit metatabulku s t3 pomocí metametody __tostring setmetatable ( t3 , { __tostring = funkce ( t ) local res = " \ n " pro _ , v v párech ( t ) do res = res .. tostring ( v ) .. "-" end return res .. " \n " end }) -- Tím se vytiskne: "11-22-33-" pro _ , v v ipairs ( t3 ) do io.write ( v , "," ) end print ( tostring ( t3 )) -- vytiskne "11,22,33,"Lua podporuje metametody pro všechny aritmetické a porovnávací operace, takže je lze použít k implementaci aritmetiky pro jakékoli objekty vytvořené programátorem. Kromě standardních můžete využít tzv. „knihovnické“ metametody, které jsou podporovány nikoli jádrem jazyka, ale konkrétními knihovnami. Ve výše uvedeném příkladu se jedná o metametodu __tostringpodporovanou knihovnou řetězců; tato metoda převede tabulku na řetězec.
O obor je největší zájem __index. Volá se, když se interpret pokusí přečíst prvek tabulky, ale nenajde jej. Pole __indexmůže odkazovat na tabulku nebo metodu. V prvním případě interpret, který nenalezne požadovanou hodnotu v hlavní tabulce, ji bude hledat v tabulce __index. Ve druhém se místo přístupu k tabulce zavolá tato metoda. Zadáním tabulek nebo metametod pro dané pole může Lua implementovat dědičnost, skrýt data objektů, sledovat operace s daty tabulek a mnoho dalšího.
Základem pro OOP v Lua jsou tabulky. V zásadě je tabulka objektem ve smyslu OOP, protože může mít pole pojmenovaná identifikátory a ukládat do těchto polí libovolné hodnoty (vlastnosti objektu) a funkce pro implementaci chování objektu (metody objektu). Některé syntaktické cukry poskytované Luou umožňují programátorům zkušeným v tradičních OOP jazycích lépe porozumět popisování a manipulaci s objekty. V Lua neexistuje žádný koncept „ třídy “, proto je popsán samostatný objekt a všechna pole a metody se na něj konkrétně vztahují. Vlastnosti jsou popsány podobně jako prvky tabulky s identifikačními klíči, metody jsou popsány jako funkční pole. Stejně jako klasický Oberon obsahuje popis metod výslovnou indikaci v prvním parametru tzv. "přijímače" - parametru, který při volání metody odkazuje na objekt, pro který je volána. Ale kromě standardního odkazu na pole tabulky prostřednictvím tečky, která vyžaduje explicitní uvedení příjemce ve volání metody, Lua podporuje další syntaxi: když je hlavička Объект:методmetody ve volání nebo popisu metody zapsána ve tvaru " " , pak příjemce není určen. Zároveň je v těle metody stále k dispozici pod názvem self:
-- Object Account = { -- Object "account" id , name , balance = 0 , -- object properties: number, name, balance credit = function ( self , v ) -- method "expense" - description inside the object with explicitní určení příjemce , pokud je vlastní . zůstatek < v pak chyba "Nedostatečný zůstatek" end self . rovnováha = sebe . zůstatek - v konec } function Account : debet ( v ) -- "incoming" metoda - externí zkrácený popis (self neuvedeno) self . rovnováha = sebe . zůstatek + v konec Účet . debet ( Účet , 10000 ) -- metoda volání - dlouhá verze Účet : kredit ( 5000 ) -- volání metody - krátká verzeDědičnost, včetně vícenásobné dědičnosti, je implementována pomocí metatabulek a metametod. Pomocí metametod můžete také implementovat skrytí dat a řízený přístup k polím objektu tabulky. Pokud porovnáte tento přístup s jinými jazyky, kde je vše výše uvedené implementováno pomocí speciálních jazykových nástrojů, můžete vidět, že implementace Lua je komplikovanější a vyžaduje pečlivější kódování, ale poskytuje větší flexibilitu a zjednodušuje interpret.
Klasický program " Ahoj, světe!" » v Lua vypadá takto:
tisk ( "Ahoj svět!" )Faktorial je příkladem rekurzivní funkce:
funkce faktoriál ( n ) if n == 0 pak vrátí 1 jinak vrátí n * faktoriál ( n - 1 ) end end pro i = 1 , 5 do -- instrukce/operace končíPráce s funkcemi jako prvotřídními objekty je demonstrována v následujícím příkladu, který upravuje chování funkce tisku:
do local oldprint = print -- Uložit aktuální tiskovou funkci jako funkci oldprint print ( s ) -- Předefinovat funkci tisku if s == " foo " then oldprint ( " bar " ) else oldprint ( s ) end end endJakékoli budoucí volání printbude nyní přesměrováno na novou funkci a díky podpoře Lua pro lexikální kontext bude stará funkce tisku přístupná pouze prostřednictvím nové, upravené funkce tisku. Lua také podporuje uzávěry , jak je popsáno výše v související části.
Klíčovým rysem Lua je jeho rozšiřitelná sémantika a mechanismus metatable dává velký prostor pro přizpůsobení jedinečného chování pro tabulky Lua. Následující příklad ukazuje "nekonečnou" tabulku. For any dá -té Fibonacciho číslo pomocí memoizace . fibs[n]
fibs = { 1 , 1 } -- Počáteční hodnoty pro fibs[1] a fibs[2]. setmetatable ( fibs , { __index = function ( name , n ) -- Volání funkce, pokud fibs[n] neexistuje. name [ n ] = name [ n - 1 ] + name [ n - 2 ] -- Výpočet a zapamatování fibs [n] .návratové jméno [ n ] konec })Lua také umožňuje používat logické operátory andpro orzadávání ternárních konstrukcí , jako například v C# , nebo pro odkazování na jeden z existujících objektů.
do local num = tonumber ( io.read ()) -- Zapište do proměnné informace zadané z konzole a převeďte je na tisk typu celé číslo ( num == 1 a "Zadali jste správné číslo" nebo "Zadali jste chybné číslo" ) -- Pokud je proměnná num rovna 1, pak text za a bude zobrazen v konzole, ve všech ostatních případech za nebo endPřístup k existující tabulce a získání hodnoty na prvním indexu:
do local tbl = nil local tbl2 = { 1 } print ( ( tbl nebo tbl2 )[ 1 ] ) -- Číslo 1 bude vytištěno , protože tabulka tbl2 má tuto hodnotu na konci indexu 1Volání funkce z jedné z existujících tabulek:
do local tbl = nil local tbl2 = {} tbl2 . DoSomething = funkce () print ( "Udělej něco" ) end ( tbl nebo tbl2 ). DoSomething () konecStejně jako mnoho interpretovaných programovacích jazyků má implementace Lua samostatný kompilátor ze zdrojového jazyka do spustitelného bajtového kódu a virtuální stroj pro provádění generovaného bajtového kódu. Bajtkód navíc nejsou příkazy zásobníku, ale příkazy určitého virtuálního procesoru s několika registry, což zvyšuje efektivitu provádění. Standardní virtuální stroj Lua využívá alokaci paměti s garbage collection (podobně jako Java nebo .NET).
Lua používá fond s jedním řetězcem , což snižuje nároky na paměť při ukládání řetězců.
Pro časově kritické úlohy existuje JIT - Lua kompilátor - LuaJIT [15] . Byl vyvinut také kompilátor llvm-lua [16] , který generuje kód pro virtuální stroj LLVM , což poskytuje možnost následné kompilace do velmi efektivního strojového kódu pro procesory různých architektur.
V současné době se používá v různých projektech, kde je vyžadováno zabudování poměrně rychlého a snadno naučitelného skriptovacího programovacího jazyka - například ve vývoji her , kde se Lua často používá jako vrstva mezi herním enginem a daty pro skriptování. chování a interakce objektů. Díky své kompaktnosti je použitelný i v přenosných zařízeních, konkrétně jedna z grafických kalkulaček Texas Instruments používá jazyk namísto BASICu , tradičního pro tuto třídu zařízení .
LucasArts byl první, kdo zavedl jazyk Lua do vývoje počítačových her, počínaje hrou Grim Fandango [17] . Autoři jazyka ve své zprávě na konferenci HOPLvzpomeňte si, že v lednu 1997 obdrželi zprávu od Breta Mogilefského, hlavního vývojáře Grim Fandango, kde napsal, že poté, co si přečetl o jazyce v článku z roku 1996 v Dr. Dobb's Journal , plánuje nahradit jejich domácí skriptovací jazyk SCUMM jazykem Lua [18] . V důsledku toho vytvořil herní engine GrimE , který je také používán v pozdějším questu od LucasArts - Escape from Monkey Island .
V roce 2003 průzkum GameDev.net zařadil Lua jako nejoblíbenější skriptovací jazyk pro vývoj her [9] .
Příkladem hry naprogramované pomocí Lua je World of Warcraft [19] [20] . Úrovně logické hry Enigma [21] jsou popsány v jazyce Lua .
K dispozici je řada bezplatných herních enginů, programovatelných v Lua, jako je Defold [22][ význam skutečnosti? ] , arkádový engine LÖVE [23] [24] , herní designér Novashell [25] a MÍSTO questů ( většinou textové ) [ 26] .
Používá se také v leteckém simulátoru X-Plane, v motoru X-Ray pro STALKER [27] .
Pro populární hru Minecraft byly vytvořeny modifikace ComputerCraft a jeho pokročilejší analogové OpenComputers, které přidávají počítače naprogramované v jazyce Lua [28] .
Slavná hra Garry's Mod je naprogramovaná a podporuje i úpravy napsané v Lua.
Tým Croteamu (vývojáři Serious Sam a The Talos Principle ) používá Lua ve skriptování od Serious Engine 3.5 [29] .
Pro hru GTA: San Andreas jsou vytvořeny modifikace napsané v jazyce Lua a podporované pluginem Moonloader. [30] Multi Theft Auto také podporuje skriptování Lua.
Herní platforma Roblox používá Lua jako svůj herní kódovací jazyk a správu herního prostředí [31] .
Mod Ficsit-Networks byl vytvořen herní komunitou Satisfactory , což umožňuje naprogramovat jakékoli akce v jazyce Lua [32] .
Factorio používá Lua k vytváření modů. [33] [34]
Hra Dual Universe se používá pro mechaniky ve hře a programování herních bloků
Počítačový sazeč LuaTeX , rozšířená verze pdfTeXu , používá Lua jako svůj vestavěný skriptovací jazyk [35] .
Správce balíčků RPM obsahuje vestavěný interpret Lua [36] .
Pro Lua existují alespoň dvě „nativní“ vývojová prostředí , jsou to:
Kromě toho je Lua podporována některými univerzálními IDE, zejména:
Pro prostředí NetBeans existoval modul podpory Lua , ale v roce 2013 byl ukončen a je k dispozici pouze pro NetBeans 7.4 a starší. Plugin není podporován v NetBeans 8.
Lua | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Programovací jazyky | |
---|---|
|