Lua | |
---|---|
Sprog klasse | funktionelt programmeringssprog , objektorienteret programmeringssprog , scriptsprog , multiparadigme programmeringssprog , imperativt programmeringssprog , proceduremæssigt programmeringssprog , prototypeorienteret programmeringssprog [d] , fortolket programmeringssprog , kompileret programmeringssprog , fri software og filformat |
Dukkede op i | 1993 [2] |
Forfatter |
Roberto Jeruzalimski , Valdemar Selish, Luis Enrique de Figueiredo |
Udvikler | Robert Jeruzalimsky [1] |
Filtypenavn _ | .lua[3] [4] ,.luna,.lunaireeller.anair |
Frigøre | 5.4.4 (26. januar 2022) |
Type system | dynamisk , stærk , and |
Blev påvirket | C++ , Clu , Simple Object Language [d] , DEL , Snobol , Modula , Modula-2 og Scheme |
påvirket | JavaScript |
Licens | MIT-licens [5] [6] |
Internet side | lua.org ( engelsk) ( havn) |
OS | tværplatform [7] |
Mediefiler på Wikimedia Commons |
Lua ( lua , port. - "måne" [8] ) er et scripting programmeringssprog udviklet i Tecgraf ( Computer Graphics Technology Group ) division af det katolske universitet i Rio de Janeiro ( Brasilien ). Sprogtolken er en gratis , open source C -sprogstolk .
Med hensyn til ideologi og implementering er Lua-sproget tættest på JavaScript , især implementerer det også OOP - prototypemodellen , men adskiller sig i Pascal-lignende syntaks og mere kraftfulde og fleksible konstruktioner. Et karakteristisk træk ved Lua er implementeringen af et stort antal softwareenheder med et minimum af syntaktiske midler. Så alle sammensatte brugerdefinerede datatyper ( arrays , strukturer , sæt , køer , lister ) implementeres gennem tabelmekanismen og objektorienterede programmeringsmekanismer , inklusive multipel nedarvning , ved hjælp af metatables , som også er ansvarlige for overbelastningsoperationer og en række andre funktioner.
Lua er beregnet til brugere, der ikke er professionelle programmører, hvilket resulterer i, at der lægges stor vægt på enkelhed i design og nem læring. Sproget er meget brugt til at skabe replikerbar software (for eksempel er den grafiske grænseflade i Adobe Lightroom -pakken skrevet i den ). Vandt også frem som et programmeringssprog for niveauer og udvidelser i mange spil (inklusive Garry's Mod ) [9] .
Sproget blev udviklet af Tecgraf-afdelingen (computergrafikteknologigruppe) ved det katolske universitet i Rio de Janeiro i Brasilien, sprogets historie går tilbage til 1993. Sprogets forfattere er Roberto Jeruzalimski , Luiz Henrique de Figueiredo og Waldemar Celes . Lua er frit distribueret, open source i C-sprog .
Som Luis Enrique de Figueiredo bemærkede, er Lua det eneste programmeringssprog udviklet i et udviklingsland, der har modtaget verdensomspændende anerkendelse, hvilket især kom til udtryk i en invitation til HOPL- konferencen [10] .
De historiske forældre til sproget var konfigurations- og databeskrivelsessprogene SOL (Simple Object Language) og DEL (Data-Entry Language) [11] , de blev uafhængigt udviklet hos Tecgraf i 1992-1993 for at tilføje en vis fleksibilitet til to separate projekter (begge var interaktive grafikapplikationer til designbehov hos Petrobras ). SOL og DEL manglede nogen kontrolkonstruktioner, og Petrobras følte et voksende behov for at tilføje fuld programmering til dem.
Som forfatteren af sproget skriver i The Evolution of Lua : [12]
I 1993 var den eneste rigtige konkurrent Tcl , som var specielt designet til at blive indlejret i applikationer. Tcl havde dog en ukendt syntaks, manglede god databeskrivelsesunderstøttelse og kørte kun på Unix -platforme . Vi har ikke overvejet Lisp eller Scheme på grund af deres uvenlige syntaks. Python var stadig i sin vorden. I den gør-det-selv-atmosfære, der dengang herskede hos Tecgraf, var det helt naturligt, at vi besluttede at udvikle vores eget scriptsprog. På grund af det faktum, at de fleste af brugerne ikke var professionelle programmører, måtte sproget undgå indviklet syntaks og semantik. Implementeringen af det nye sprog skulle være let at transportere , da Tecgrafs kunder havde meget forskellige platforme. Endelig, da vi forventede, at andre Tecgraf-produkter også havde brug for et indlejret scriptsprog, skulle det nye sprog følge eksemplet med SOL og leveres som et bibliotek med en C API .
Lua 1.0 blev designet på en sådan måde, at objektkonstruktører, der dengang var lidt anderledes end den nuværende lette og fleksible stil, inkluderede syntaksen for SOL-sproget (deraf navnet Lua: på portugisisk sol - "sol", lua - "måne") . Lua-kontrolkonstruktioner er for det meste lånt fra Modula-2 (hvis, mens, gentag/indtil), selvom de også er påvirket af Clu ( parallel tildeling , returværdi med flere funktioner som et enklere alternativ til at sende parametre ved reference eller eksplicitte pointere ), C++ ("Det er en god idé kun at erklære lokale variabler , når du har brug for dem"), Snobol og awk ( associative arrays ). Skaberne af Lua anerkender også, at den enkelte allestedsnærværende datastruktureringsmekanisme i Lisp and Scheme ( sammenkædet liste ) var en stor indflydelse på deres beslutning om at vælge tabeller som den primære datastruktur for Lua [13] .
Versioner af Lua op til 5.0 blev udgivet under en licens svarende til BSD-licensen . Fra version 5.0 og fremefter distribueres Lua under MIT-licensen . Begge licenser er tilladelige og stort set identiske.
Lua er beregnet til at blive brugt som et selvstændigt scriptsprog eller indbygget i en applikation. Den blev oprindeligt designet til at være enkel og kompakt nok til at passe på en række forskellige platforme og give acceptabel ydeevne. Designet tog også hensyn til kravene om nem læring og muligheden for brug af ikke-professionelle programmører.
Lua er et proceduremæssigt dynamisk skrevet modulsprog med automatisk hukommelsesstyring . Indeholder grundlæggende elementer til at understøtte funktionelle og objektprogrammeringsstile . Lua kan således kaldes et multi-paradigme sprog . De indbyggede parallelle programmeringsværktøjer giver dig mulighed for at skrive flertrådede programmer ved hjælp af kun sprogværktøjer uden at referere til operativsystemets API eller eksterne biblioteker. Da Luas hovedformål er inlining, har den effektiv interoperabilitet på tværs af sprog, primært fokuseret på at kalde C -biblioteker og arbejde i et C-miljø.
Sproget understøtter et lille antal indbyggede datatyper: booleans, tal, strenge, funktioner, streams. Der er ingen typiske kombinerede datastrukturer såsom arrays , sets , lists og records , i stedet for dem alle bruges én grundlæggende Lua-struktur, tabellen (se nedenfor). En separat type userdataer designet specifikt til lav-niveau programmering og dataudveksling med ekstern kode på andre sprog. Funktioner i Lua er førsteklasses objekter og kan tildeles og videregives som parametre. Lukninger er understøttet, det er muligt at oprette funktioner af højere ordrer. Objektsystemet er prototypisk, der er ingen eksplicit understøttelse af arv , men det implementeres let ved hjælp af metatables .
Generelt sigter Lua mod at levere fleksible metafunktioner, der kan udvides efter behov, snarere end at levere et sæt funktioner, der er specifikke for et bestemt programmeringsparadigme. Som et resultat er det underliggende sprog enkelt og nemt at tilpasse til de fleste applikationer. Ved at tilbyde et minimalt sæt grundlæggende faciliteter, forsøger Lua at finde en balance mellem magt og størrelse.
Luas syntaks er for det meste bygget på sent Pascal-lignende sprog som Modula-2 eller Oberon . Tekstindtastningsformatet er gratis, kommandoer i programteksten er adskilt af eventuelle mellemrumstegn. Det er tilladt, men ikke påkrævet, at bruge semikolon til at adskille operationer.
I et interview med Robert Jeruzalimski bemærkede han, at Lua-syntaksen var et kompromis, han måtte indgå for at gøre det lettere for ikke-professionelle programmører at lære sproget. Han beskrev syntaksen som "temmelig ordrig", og bemærkede, at han personligt ville have foretrukket en mere kortfattet notation [10] .
Sprogets hovedalfabet er engelsk, tegn på andre sprog kan bruges i strenge bogstaver. Identifikatorer kan bestå af bogstaver, tal og understregninger, men kan ikke starte med et tal eller matche et af søgeordene. Sprogguiden anbefaler ikke at bruge identifikatorer, der begynder med en understregning, da sådanne identifikatorer bruges til systemformål.
Sproget skelner mellem store og små bogstaver, alle søgeord er skrevet med små bogstaver, identifikatorer, der kun adskiller sig i tilfælde af bogstaver, betragtes som forskellige. Følgende 22 nøgleord kan ikke bruges til navne [14] :
og bryde gør andet elseif end false goto for function if in local nil not eller gentag returner derefter sand indtil mensKommentarer bruger følgende syntaks, der ligner Ada , SQL og VHDL :
-- En simpel enkeltlinjekommentar i Lua starter med et dobbelt minus og fortsætter til slutningen af linjen. dim = { "en" , "to" , "tre" } -- En linjekommentar behøver ikke at starte i begyndelsen af en linje -- den kan følge andre sprogkonstruktioner -- for at forklare dem. --[[En kommentar med flere linjer begynder med to på hinanden følgende åbne firkantede parenteser efterfulgt af to minusser og fortsætter gennem to på hinanden følgende afsluttende firkantede parenteser. Ligesom her: ]] -- En interessant effekt kan opnås ved at kombinere inline og multi-line kommentarer: --[[ For at fjerne kommentarer til koden nedenfor er det nok at tilføje et mellemrum i denne linje mellem minusser og parenteser. for i=1,#dim do print(dim[i]) end -- Hvis der tilføjes et mellemrum mellem minustegn og parentes ovenfor, så --]] -- her bliver slutningen af flerlinjekommentaren til en normal linjeLua er et sprog med implicit dynamisk datatypedefinition . En sprogvariabel kan indeholde værdier af enhver type. Alle værdier i Lua kan gemmes i variabler, bruges som argumenter til funktionskald og returneres som et resultat af deres udførelse.
Der er otte hovedtyper i Lua:
nil er værditypen nil [tom værdi], hvis hovedegenskab er at være forskellig fra alle andre værdier og angive fraværet af en brugbar værdi.
Den boolske type inkluderer værdierne falsk (falsk) og sand (sand).
Taltypen omfatter normalt reelle tal (dobbelt). I de første versioner af Lua blev heltal ikke adskilt i en separat type; denne beslutning er motiveret af det faktum, at den reelle repræsentation giver dig mulighed for nøjagtigt at repræsentere en ret bred vifte af heltal. Fra version 5.3 er muligheden for eksplicit at definere et heltals- eller reelt talsformat blevet tilføjet. Den interne repræsentation af tal kan ændres, når tolken bygges.
Strengtypen angiver tegnarrays . Lua-strenge kan indeholde et hvilket som helst 8-bit tegn, inklusive nul ('\0'). Strenge er uforanderlige. Streng bogstaver kan skrives i enkelte eller dobbelte anførselstegn, servicetegn er placeret i dem i standard C-notation med en førende omvendt skråstreg. Multiline literaler er afgrænset af to på hinanden følgende åbnings- og to på hinanden følgende afsluttende firkantede parenteser.
Der er ingen Unicode-understøttelse indbygget i sproget, selvom brugen af UTF-8-tegn i strengliteraler er tilladt, og selve UTF-8-repræsentationssystemet giver dig mulighed for at indtaste, udskrive og delvist behandle strenge i denne kodning ved hjælp af standard systemværktøjer . Nylige versioner af Lua inkluderer utf8-biblioteket, som giver mere avanceret understøttelse af UTF-8, og der er tredjepartsbiblioteker, der giver værktøjer til at arbejde med Unicode-strenge i forskellige kodninger.
Funktioner i Lua er fuldgyldige objekter, der kan tildeles, overføres som en parameter til en funktion og returneres som en af værdierne. Trådtypen har koroutiner, brugerdatatypen er designet til at repræsentere eksterne data modtaget eller leveret fra/til kode på et andet sprog (hovedsageligt C/C++).
Alle aritmetiske operatorer understøtter rigtige operander, hvilket giver forudsigelige resultater. Returnerer for eksempel x^0.5kvadratroden af x, x^(-1/3) den reciproke af terningroden af x. Operatoren %er defineret af: a % b = a - math.floor(a / b) * b, hvor funktionen math.floor()evalueres til den heltallige del af sit argument. For heltalsargumenter er resultatet ganske normalt. For et reelt udbytte skal du huske på, at operationen ikke udfører nogen yderligere afrunding eller kassering af brøkdelen, så resultatet beholder brøkdelen af dividenden. For eksempel vil det math.pi % 2ikke returnere 1, men 1.1415926535898. Denne implementering giver nogle ekstra funktioner. For eksempel, for at afkorte xtil tre decimaler, er det nok at tage udtrykketx - x % 0.001
En tabel i Lua er en dynamisk heterogen associativ array , det vil sige et sæt par af " ключ-значение". Nøgler kan være værdier af enhver Lua-type undtagen nil. Nøgler kan også være Lua-literaler (identifikatorer). At skrive niltil et tabelelement svarer til at slette dette element.
Tabeller er den eneste sammensatte datatype i Lua. De er grundlaget for alle brugerdefinerede datatyper såsom strukturer , arrays , sæt og andre:
-- Generel tabel: tom = {} -- Tom tabel tom [ 1 ] = "første" -- Tilføjelse af element med heltalsindeks tomt [ 3 ] = "anden" -- Tilføjelse af element med heltalsindeks tomt [ "tredje" ] = "tredje" -- Tilføj element ved strengindeks tomt [ 1 ] = nul -- Fjern element fra tabel -- Klassiske array-strenge indekseres som standard med heltal startende fra 1 dage1 = { "mandag" , "tirsdag" , "onsdag" , "torsdag" , "fredag" , "lørdag" , "søndag" } -- Array med vilkårlige indekseringsdage2 = { [ 0 ] = "Søndag" , [ 1 ] = "Mandag" , [ 2 ] = "tirsdag" , [ 3 ] = "onsdag" , [ 4 ] = "torsdag" , [ 5 ] = "fredag" , [ 6 ] = "lørdag" } -- Optegnelse (struktur) - værdier af forskellige typer er indekseret efter bogstavelig person = { tabnum = 123342 , -- Personalenummer fio = "Ivanov Stepan Vasilyevich" , -- Fulde navn post = "værktøjsmager" , -- Stillingsløn = 25800,45 , -- Løn sdate = "10/23/2013" , -- Ansat dato bdate = " 08/08/1973" } -- Fødselsdato pfio = person . fio --Reference til strukturelement. -- Sæt-indekser bruges til at gemme værdier workDays = {[ "mandag" ] = sand , [ "tirsdag" ] = sand , [ "onsdag" ] = sand , [ "torsdag" ] = sand , [ "fredag" " ] = sand } arbejdsdage [ "lørdag" ] = sand -- Føj lørdag til antallet af arbejdsdage arbejdsdage [ " onsdag" ] = nul -- Vi arbejder ikke længere om onsdagen -- Tjek om d er en arbejdsdag hvis workDays [ d ] så udskriv ( d .. " - work day " ) else print ( d .. " - day off " ) endMultisæt (sæt, der kan indeholde mere end én forekomst af det samme element) implementeres på samme måde som det sidste eksempel, kun værdierne er ikke logiske, men heltal - tællere for antallet af tilsvarende elementer i sættet. Sammenkædede lister kan repræsenteres som arrays af to-element arrays, der indeholder en værdi og en reference til det næste element. Multidimensionelle arrays kan implementeres som arrays af arrays. Mere komplekse strukturer såsom køer, grafer, netværk implementeres også på basis af tabeller, den specifikke implementeringsmetode bestemmes af opgaven.
Lua støtter konceptet med lukninger , for eksempel:
funktion makeaddfunc ( x ) - Returnerer en ny anonym funktion , der tilføjer x til sin argumentreturfunktion ( y ) - Når vi henviser til en variabel x, der er uden for det aktuelle omfang - og hvis levetid er mindre end denne anonyme funktion - - - Lua skaber en lukning. return x + y end end plustwo = makeaddfunc ( 2 ) -- dvs. plustwo = funktion(y) return 2 + y end print ( plustwo ( 5 )) -- Printer 7Hver gang der kaldes makeaddfunc, oprettes en ny lukning for variablen x, så hver returneret anonym funktion vil referere til sin egen parameter x. Som ethvert andet Lua-objekt styres en luknings levetid af skraldeopsamleren.
Den metatable mekanisme giver mange af de funktioner, som andre sprog giver ved at introducere separate syntaktiske mekanismer. Metatabeller er efter struktur almindelige Lua-tabeller, underlagt alle sprogets regler og begrænsninger. Deres ejendommelighed ligger i deres anvendelse. Metatabellen gemmer yderligere metadata for typer og objekter, det vil sige information om de parametre og funktioner, der er knyttet til dem. Oplysningerne gemt i metatables bruges af Lua-fortolkeren, deres brug giver dig mulighed for at ændre eller udvide funktionaliteten af programobjekter.
En metatable i Lua kan associeres med en værdi af enhver type. Skalære datatyper (alle undtagen brugerdata og tabeller) har fælles metatabeller for hver type. Tabellerne og værdierne af en type userdatahar individuelle metatable referencer i hver instans. Ændring af metatables af alle typer undtagen tabeller kan kun ske gennem ekstern C-kode. Kun tabel metatables er tilgængelige direkte fra Lua.
En Lua-tabel, der er oprettet fra bunden, har ikke en metatable (dens metatable reference er nul). Men en metatable for det kan oprettes til enhver tid eller fås fra en anden tabel. Den indbyggede funktion getmetatable(t)returnerer metatablen af tabel t, og funktionen setmetatable(t, m)indstiller tabel t til metatable m.
For metatables er der dokumenteret et sæt felter, som kan bruges af sprogtolken. For at angive disse felters særlige rolle er der vedtaget en særlig navngivningsregel for dem: deres identifikatorer begynder med to understregninger. Nogle af disse felter indeholder information om specifikke egenskaber for det objekt, som metatablen refererer til. For eksempel kan indstillingen __mode, når den er givet, gøre en tabel svag , det vil sige en tabel, hvis objektreferencer alle er svage referencer . Men værdierne af de fleste af de mulige metatable felter er de såkaldte metamethods , det vil sige referencer til funktioner, som tolken kalder under visse betingelser. Den generelle logik ved at bruge metametoder af fortolkeren er som følger: når fortolkeren støder på en operation i programmet, der ikke er defineret for operandobjektet, får den adgang til den metatable, der er knyttet til operanden, finder den tilsvarende metametode i den og kalder den.
--[[ Opret additionsoperation for tabeller ]] -- Operander t1 = { 1 , 2 , 3 } t2 = { 10 , 20 , 30 } -- Opret metatable mt = {} -- Skriv metametode "__add" mt til metatable . __add = funktion ( a , b ) lokal res = {} for k i par ( a ) do res [ k ] = a [ k ] + b [ k ] ende retur res end -- Bind metatable til tabel t1 setmetatable ( t1 , mt ) -- Tabeladdition er nu en gyldig operation t3 = t1 + t2 -- join metatable med t3 med metamethod __tostring setmetatable ( t3 , { __tostring = function ( t ) local res = " \n " for _ , v i par ( t ) do res = res .. tostring ( v ) .. "-" end return res .. " \n " end }) -- Dette vil udskrive: "11-22-33-" for _ , v i ipairs ( t3 ) do io.write ( v , "," ) end print ( tostring ( t3 )) -- udskriver "11,22,33,"Lua understøtter metametoder til alle aritmetiske og sammenligningsoperationer, så de kan bruges til at implementere aritmetik for alle objekter, der er oprettet af programmøren. Ud over de standard, kan du bruge de såkaldte "bibliotek"-metametoder, som ikke understøttes af kernen af sproget, men af specifikke biblioteker. I eksemplet ovenfor er dette en metametode, der __tostringunderstøttes af strengbiblioteket; denne metode konverterer tabellen til en streng.
Feltet er af største interesse __index. Det kaldes, når tolken forsøger at læse et tabelelement, men ikke finder det. Et felt __indexkan referere til enten en tabel eller en metode. I det første tilfælde vil tolken, der ikke finder den ønskede værdi i hovedtabellen, lede efter den i tabellen __index. I den anden, i stedet for at få adgang til tabellen, vil denne metode blive kaldt. Ved at specificere tabeller eller metametoder for et givet felt kan Lua implementere nedarvning, skjule objektdata, spore operationer på tabeldata og meget mere.
Grundlaget for OOP i Lua er tabeller. I princippet er en tabel et objekt i OOP-forstand, da den kan have felter navngivet med identifikatorer og lagre vilkårlige værdier (objektegenskaber) og funktioner til at implementere objektets adfærd (objektmetoder) i disse felter. Noget af det syntaktiske sukker leveret af Lua gør beskrivelse og håndtering af objekter mere velkendte for programmører, der har erfaring med traditionelle OOP-sprog. Der er intet begreb om " klasse " i Lua, derfor er et separat objekt beskrevet, og alle felter og metoder refererer specifikt til det. Egenskaber beskrives på samme måde som tabelelementer med identifikationsnøgler, metoder beskrives som funktionsfelter. Ligesom den klassiske Oberon indeholder metodebeskrivelsen en eksplicit indikation i den første parameter af den såkaldte "receiver" - en parameter, der, når en metode kaldes, refererer til det objekt, som den kaldes for. Men ud over standardreferencen til et tabelfelt gennem en prik, som kræver eksplicit at specificere modtageren i metodekaldet, understøtter Lua en ekstra syntaks: når metodehovedet er skrevet i formen " Объект:метод" i metodekaldet eller beskrivelsen , så er modtageren ikke angivet. Samtidig er den i selve metoden stadig tilgængelig under navnet self:
-- Objektkonto = { -- Objekt "konto" id , navn , saldo = 0 , -- objektegenskaber: antal, navn, saldo kredit = funktion ( selv , v ) -- metode "udgift" - beskrivelse inde i objektet med eksplicit med angivelse af modtageren, hvis selv . balance < v derefter fejl "Utilstrækkelig balance" end self . balance = selv . balance - v end } funktion Konto : debet ( v ) -- "indgående" metode - ekstern stenografibeskrivelse (selv ikke specificeret) self . balance = selv . balance + v ende Konto . debet ( Konto , 10000 ) -- metode kaldet lang version Konto : kredit ( 5000 ) -- metode kaldet kort versionNedarvning, herunder multipel nedarvning, implementeres ved hjælp af metatables og metamethods. Ved hjælp af metametoder kan du også implementere dataskjul og kontrolleret adgang til tabelobjektets felter. Hvis man sammenligner denne tilgang med andre sprog, hvor alt ovenstående er implementeret ved hjælp af specielle sprogværktøjer, kan man se, at Lua-implementeringen er mere kompliceret og kræver mere omhyggelig kodning, men giver mere fleksibilitet og forenkler tolken.
Klassisk program " Hej, verden!" » i Lua ser sådan ud:
print ( "Hej verden!" )Faktoriel er et eksempel på en rekursiv funktion:
funktion factorial ( n ) hvis n == 0 returnerer 1 ellers returnerer n * factorial ( n - 1 ) end end _ for i = 1 , 5 do -- instruktioner/operationer slutterArbejde med funktioner som førsteklasses objekter er demonstreret i følgende eksempel, som ændrer udskriftsfunktionens adfærd:
lav lokal oldprint = print -- Gem nuværende printfunktion som oldprint funktion print ( r ) -- Omdefiner print funktion hvis s == " foo " så oldprint ( " bar " ) ellers oldprint ( s ) end end endEthvert fremtidigt opkald printvil nu blive omdirigeret til den nye funktion, og takket være Luas støtte til leksikalsk kontekst vil den gamle printfunktion kun være tilgængelig via den nye, ændrede printfunktion. Lua understøtter også lukninger , som beskrevet ovenfor i det relaterede afsnit.
Et centralt træk ved Lua er dens udvidbare semantik, og den metatable mekanisme giver en masse muligheder for at tilpasse unik adfærd til Lua-tabeller. Følgende eksempel viser en "uendelig" tabel. For enhver vil give det -th Fibonacci-nummer ved hjælp af memoization . fibs[n]
fibs = { 1 , 1 } -- Startværdier for fibs[1] og fibs[2]. setmetatable ( fibs , { __index = funktion ( navn , n ) -- Kald funktion hvis fibs[n] ikke eksisterer. navn [ n ] = navn [ n - 1 ] + navn [ n - 2 ] -- Beregn og gem fibs [ n] .returnavn [ n ] ende })Lua giver dig også mulighed for at bruge logiske operatorer andtil at orindtaste ternære konstruktioner , som for eksempel i C# , eller til at henvise til et af de eksisterende objekter.
do local num = tonumber ( io.read ()) -- Skriv til en variabel informationen indtastet fra konsollen og konverter den til en heltal type print ( num == 1 og "Du indtastede det korrekte tal" eller "Du indtastede forkert tal" ) -- Hvis talvariablen er lig med 1, så vil teksten efter og blive vist i konsollen, i alle andre tilfælde efter eller slutningFå adgang til en eksisterende tabel og få værdien ved det første indeks:
do local tbl = nil local tbl2 = { 1 } print ( ( tbl or tbl2 )[ 1 ] ) -- Nummer 1 udskrives fordi tabel tbl2 har denne værdi ved indeks 1 slutningenKaldning af en funktion fra en af de eksisterende tabeller:
gør lokal tbl = nul lokal tbl2 = {} tbl2 . DoSomething = funktion () print ( "Gør noget" ) ende ( tbl eller tbl2 ). DoSomething () endeSom mange fortolkede programmeringssprog har Lua -implementeringen en separat compiler fra kildesprog til eksekverbar bytekode og en virtuel maskine til at udføre den genererede bytekode. Desuden er bytekoden ikke kommandoerne fra stakmaskinen, men kommandoerne fra en bestemt virtuel processor med flere registre, hvilket øger effektiviteten af udførelsen. Standard Lua virtuelle maskine bruger hukommelsesallokering med garbage collection (svarende til Java eller .NET).
Lua bruger en enkelt strengpulje , hvilket reducerer hukommelsesomkostningerne ved lagring af strenge.
Til tidskritiske opgaver er der en JIT - Lua compiler - LuaJIT [15] . Der er også udviklet compileren llvm-lua [16] , som genererer kode til den virtuelle LLVM -maskine , som giver mulighed for efterfølgende kompilering til en meget effektiv maskinkode til processorer med forskellige arkitekturer.
Det bruges i øjeblikket i forskellige projekter, hvor det er påkrævet at indbygge et ret hurtigt og nemt at lære scripting programmeringssprog - for eksempel i spiludvikling , hvor Lua ofte bruges som et lag mellem spilmotoren og data til script. objekters adfærd og interaktion. På grund af dens kompakthed er den også anvendelig i bærbare enheder, især en af Texas Instruments grafiske regnemaskiner bruger et sprog i stedet for BASIC , traditionelt for denne klasse af enheder .
LucasArts var den første til at introducere Lua -sproget i udviklingen af computerspil, begyndende med spillet Grim Fandango [17] . Forfatterne af sproget i deres rapport på HOPL- konferencenhuske på, at de i januar 1997 modtog en besked fra Bret Mogilefsky, hovedudvikleren af Grim Fandango, hvor han skrev, at efter at have læst om sproget i en artikel fra 1996 i Dr. Dobb's Journal planlægger han at erstatte deres hjemmelavede scriptsprog SCUMM med Lua [18] . Som et resultat skabte han GrimE -spilmotoren , som også bruges af en senere quest fra LucasArts - Escape from Monkey Island .
I 2003 rangerede en GameDev.net- undersøgelse Lua som det mest populære scriptsprog til spiludvikling [9] .
Et eksempel på et spil programmeret med Lua er World of Warcraft [19] [20] . Niveauerne i puslespillet Enigma [21] er beskrevet på Lua -sproget .
En række gratis spilmotorer er tilgængelige, programmerbare i Lua, såsom Defold [22][ betydningen af det faktum? ] , LÖVE arkademotoren [23] [24] , spildesigneren Novashell [25] og den quest - orienterede (for det meste tekstbaserede ) I STEDET [26] .
Bruges også i X-Plane flysimulatoren, i X-Ray motoren til STALKER [27] .
Til det populære spil Minecraft er der lavet modifikationer af ComputerCraft og dets mere avancerede analoge OpenComputers, som tilføjer computere programmeret i Lua-sproget [28] .
Det berømte spil Garry's Mod er programmeret og understøtter også modifikationer skrevet i Lua.
Croteam - teamet (udviklere af Serious Sam og The Talos Principle ) har brugt Lua i scripting siden Serious Engine 3.5 [29] .
Til spillet GTA: San Andreas oprettes modifikationer skrevet på Lua-sproget og understøttes af Moonloader-plugin'et. [30] Multi Theft Auto understøtter også Lua-scripting.
Roblox -spilplatformen bruger Lua som sit spilkodningssprog og spilmiljøstyring [31] .
Ficsit-Networks-modet er blevet skabt af Satisfactory - spilfællesskabet , som gør det muligt at programmere alle handlinger på Lua-sproget [32] .
Factorio bruger Lua til at skabe mods. [33] [34]
Spillet Dual Universe bruges til in-game mekanik og spilblok programmering
Computertypesætteren LuaTeX , en udvidet version af pdfTeX , bruger Lua som sit indbyggede scriptsprog [35] .
RPM - pakkehåndteringen indeholder en indbygget Lua-fortolker [36] .
Der er mindst to "native" udviklingsmiljøer for Lua, disse er:
Derudover understøttes Lua af nogle universelle IDE'er, især:
Der var et Lua-supportmodul til NetBeans- miljøet , men det blev udgået i 2013 og er kun tilgængeligt til NetBeans 7.4 og tidligere. Pluginnet er ikke understøttet i NetBeans 8.
Lua | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Programmeringssprog | |
---|---|
|