Lua | |
---|---|
Clasa de limba | limbaj de programare funcțional , limbaj de programare orientat pe obiecte , limbaj de scripting , limbaj de programare multi-paradigma , limbaj de programare imperativ , limbaj de programare procedural ,de programare orientat pe prototip [d] , limbaj de programare interpretat , limbaj de programare compilat , software liber și format de fișier |
Aparut in | 1993 [2] |
Autor |
Roberto Jeruzalimski , Valdemar Selish, Luis Enrique de Figueiredo |
Dezvoltator | Robert Jeruzalimsky [1] |
Extensie de fișier | .lua[3] [4] ,.luna,.lunairesau.anair |
Eliberare | 5.4.4 (26 ianuarie 2022) |
Tip sistem | dinamic , puternic , rață |
A fost influențat | C++ , Clu , Simplu Object Language [d] , DEL , Snobol , Modula , Modula-2 și Scheme |
influențat | JavaScript |
Licență | Licență MIT [5] [6] |
Site-ul web | lua.org ( engleză) ( port) |
OS | multiplatformă [7] |
Fișiere media la Wikimedia Commons |
Lua ( lua , port. - „lună” [8] ) este un limbaj de programare de scripting dezvoltat în divizia Tecgraf ( Computer Graphics Technology Group ) a Universității Catolice din Rio de Janeiro ( Brazilia ). Interpretul de limbă este un interpret de limbă C gratuit , cu sursă deschisă .
În ceea ce privește ideologia și implementarea, limbajul Lua este cel mai apropiat de JavaScript , în special, implementează și modelul de prototip OOP , dar diferă în sintaxa de tip Pascal și construcții mai puternice și flexibile. O trăsătură caracteristică a Lua este implementarea unui număr mare de entități software cu un minim de mijloace sintactice. Deci, toate tipurile de date compuse definite de utilizator ( matrice , structuri , seturi , cozi , liste ) sunt implementate prin mecanismul tabelului și prin mecanisme de programare orientată pe obiecte , inclusiv moștenirea multiplă , folosind metatable , care sunt, de asemenea, responsabile pentru operațiunile de supraîncărcare și un număr de alte caracteristici.
Lua este destinat utilizatorilor care nu sunt programatori profesioniști, drept urmare se acordă multă atenție simplității designului și ușurinței învățării. Limbajul este utilizat pe scară largă pentru a crea software replicabil (de exemplu, interfața grafică a pachetului Adobe Lightroom este scrisă în el ). De asemenea, a câștigat proeminență ca limbaj de programare pentru niveluri și extensii în multe jocuri (inclusiv Garry's Mod ) [9] .
Limbajul a fost dezvoltat de divizia Tecgraf (grup de tehnologie de grafică pe computer) a Universității Catolice din Rio de Janeiro din Brazilia, istoria limbii datând din 1993. Autorii limbii sunt Roberto Jeruzalimski , Luiz Henrique de Figueiredo și Waldemar Celes . Lua este distribuit gratuit, cu sursă deschisă în limbaj C.
După cum a remarcat Luis Enrique de Figueiredo, Lua este singurul limbaj de programare dezvoltat într-o țară în curs de dezvoltare care a primit recunoaștere la nivel mondial, ceea ce, în special, a fost exprimat într-o invitație la conferința HOPL [10] .
Părinții istorici ai limbajului au fost limbajele de configurare și descriere a datelor SOL (Simple Object Language) și DEL (Data-Entry Language) [11] , au fost dezvoltate independent la Tecgraf în 1992-1993 pentru a adăuga o oarecare flexibilitate la două separate. proiecte (ambele erau aplicații grafice interactive pentru nevoile de proiectare la Petrobras ). SOL și DEL nu aveau nicio construcție de control, iar Petrobras a simțit o nevoie tot mai mare de a le adăuga programare completă.
După cum scrie autorul limbii în The Evolution of Lua : [12]
În 1993, singurul concurent real a fost Tcl , care a fost special conceput pentru a fi încorporat în aplicații. Cu toate acestea, Tcl avea o sintaxă necunoscută, nu avea suport bun pentru descrierea datelor și rula doar pe platformele Unix . Nu am luat în considerare Lisp sau Scheme din cauza sintaxei lor neprietenoase. Python era încă la început. În atmosfera de do-it-yourself care domnea la Tecgraf la acea vreme, era firesc să ne hotărâm să dezvoltăm propriul nostru limbaj de scripting. Datorită faptului că majoritatea utilizatorilor nu erau programatori profesioniști, limbajul a trebuit să evite sintaxa și semantica complicate. Implementarea noului limbaj trebuia să fie ușor de portat, deoarece clienții Tecgraf aveau platforme foarte diverse. În cele din urmă, deoarece ne așteptam ca și alte produse Tecgraf să aibă nevoie de un limbaj de scripting încorporat, noul limbaj ar trebui să urmeze exemplul SOL și să fie furnizat ca bibliotecă cu un API C.
Lua 1.0 a fost proiectat în așa fel încât constructorii de obiecte, apoi ușor diferiți de stilul actual ușor și flexibil, au inclus sintaxa limbajului SOL (de unde și numele Lua: în portugheză sol - "soare", lua - "lună") . Constructele de control Lua sunt în mare parte împrumutate de la Modula-2 (dacă, în timp ce, repetă/până), deși sunt, de asemenea, influențate de Clu ( alocare paralelă , valoare de returnare a funcției multiple ca alternativă mai simplă la transmiterea parametrilor prin referință sau pointeri explici ), C++ ("Este o idee grozavă să declarați variabilele locale doar atunci când aveți nevoie de ele"), Snobol și awk ( matrice asociative ). Creatorii Lua recunosc, de asemenea, că mecanismul unic omniprezent de structurare a datelor din Lisp și Scheme ( listă legată ) a fost o influență majoră în decizia lor de a alege tabelele ca structură de date primară pentru Lua [13] .
Versiunile Lua până la 5.0 au fost lansate sub o licență similară cu licența BSD . Începând cu versiunea 5.0, Lua este distribuit sub licența MIT . Ambele licențe sunt permisive și practic identice.
Lua este destinat să fie utilizat ca limbaj de scripting autonom sau integrat într-o aplicație. A fost proiectat inițial pentru a fi suficient de simplu și compact pentru a se potrivi pe o varietate de platforme și pentru a oferi performanțe acceptabile. De asemenea, designul a ținut cont de cerințele de ușurință în învățare și de posibilitatea de utilizare de către programatori neprofesioniști.
Lua este un limbaj modular procedural tip dinamic , cu management automat al memoriei . Include elemente de bază pentru a sprijini stilurile funcționale și de programare a obiectelor . Astfel, Lua poate fi numit un limbaj cu mai multe paradigme . Instrumentele de programare paralelă încorporate vă permit să scrieți programe cu mai multe fire folosind doar instrumente lingvistice, fără a vă referi la API-ul sistemului de operare sau la biblioteci externe. Deoarece scopul principal al Lua este inlining, are o interoperabilitate eficientă între limbi, concentrată în primul rând pe apelarea bibliotecilor C și lucrul într-un mediu C.
Limbajul acceptă un număr mic de tipuri de date încorporate: boolean, numere, șiruri, funcții, fluxuri. Nu există structuri de date combinate tipice, cum ar fi matrice , seturi , liste și înregistrări , în loc de toate, este utilizată o structură de bază Lua, tabelul (vezi mai jos). Un tip separat userdataeste conceput special pentru programarea de nivel scăzut și schimbul de date cu cod extern în alte limbi. Funcțiile din Lua sunt obiecte de primă clasă și pot fi atribuite și transmise ca parametri. Închiderile sunt suportate, este posibil să se creeze funcții de ordine superioară. Sistemul de obiecte este prototip, nu există suport explicit pentru moștenire , dar este ușor de implementat folosind metatable .
În general, Lua își propune să ofere metafuncții flexibile care pot fi extinse după cum este necesar, mai degrabă decât să furnizeze un set de funcții specifice unei anumite paradigme de programare. Drept urmare, limbajul de bază este simplu și ușor de adaptat la majoritatea aplicațiilor. Oferind un set minim de facilități de bază, Lua încearcă să atingă un echilibru între putere și dimensiune.
Sintaxa lui Lua este construită în mare parte pe limbaje similare cu Pascal târziu, cum ar fi Modula-2 sau Oberon . Formatul de introducere a textului este liber, comenzile din textul programului sunt separate prin orice caractere albe. Este permisă, dar nu obligatorie, utilizarea punctului și virgulă pentru a separa operațiunile.
Într-un interviu cu Robert Jeruzalimski, el a remarcat că sintaxa Lua a fost un compromis pe care a trebuit să-l facă pentru a face mai ușor pentru programatorii neprofesioniști să învețe limba. El a descris sintaxa ca fiind „destul de cuprinzătoare”, menționând că el personal ar fi preferat o notație mai concisă [10] .
Alfabetul principal al limbii este engleza, caracterele altor limbi pot fi folosite în șiruri literale. Identificatorii pot consta din litere, cifre și caractere de subliniere, dar nu pot începe cu un număr sau pot potrivi unul dintre cuvintele cheie. Ghidul de limbă nu recomandă utilizarea identificatorilor care încep cu un caracter de subliniere, deoarece astfel de identificatori sunt utilizați în scopuri de sistem.
Limbajul este sensibil la majuscule, toate cuvintele cheie sunt scrise cu litere mici, identificatorii care diferă doar în cazul literelor sunt considerați diferiți. Următoarele 22 de cuvinte cheie nu pot fi folosite pentru nume [14] :
și break do else elseif end false goto for function if in local nil not sau repetă return then true până cândComentariile folosesc următoarea sintaxă, similară cu Ada , SQL și VHDL :
-- Un comentariu simplu pe o singură linie în Lua începe cu un minus dublu și continuă până la sfârșitul rândului. dim = { „unu” , „două” , „trei” } -- Un comentariu de linie nu trebuie să înceapă la începutul unei linii -- poate urma alte constructe ale limbajului -- pentru a le explica. --[[Un comentariu pe mai multe rânduri începe cu două paranteze pătrate de deschidere consecutive urmate de două minusuri și continuă prin două paranteze pătrate de închidere consecutive. Ca aici: ]] -- Un efect interesant poate fi obținut prin combinarea comentariilor inline și multi-line: --[[ Pentru a decomenta codul de mai jos, este suficient să adăugați un spațiu în această linie între minusuri și paranteze. pentru i=1,#dim do print(dim[i]) end -- Dacă se adaugă un spațiu între semnele minus și parantezele de mai sus, atunci --]] -- aici sfârșitul comentariului cu mai multe rânduri se va transforma în o linie normalăLua este un limbaj cu definiție implicită a tipului de date dinamice . O variabilă de limbă poate conține valori de orice tip. Toate valorile din Lua pot fi stocate în variabile, utilizate ca argumente pentru apelurile de funcții și returnate ca rezultat al execuției lor.
Există opt tipuri principale în Lua:
nil este valoarea de tip nil [valoare goală], a cărei proprietate principală este să fie diferită de toate celelalte valori și să denotă absența unei valori utilizabile.
Tipul boolean include valorile false (fals) și adevărat (adevărat).
Tipul de număr include de obicei numere reale (duble). În primele versiuni de Lua, numerele întregi nu au fost separate într-un tip separat; această decizie este motivată de faptul că reprezentarea reală vă permite să reprezentați cu acuratețe o gamă destul de largă de numere întregi. Începând cu versiunea 5.3, a fost adăugată posibilitatea definirii explicite a unui format de număr întreg sau real. Reprezentarea internă a numerelor poate fi modificată la construirea interpretului.
Tipul șir de caractere denotă matrice de caractere. Șirurile Lua pot conține orice caracter de 8 biți, inclusiv zero („\0”). Corzile sunt imuabile. Literale șiruri pot fi scrise între ghilimele simple sau duble, caracterele de serviciu sunt plasate în ele în notație standard C cu o bară oblică inversă. Literale cu mai multe linii sunt delimitate de două paranteze pătrate consecutive de deschidere și două paranteze pătrate consecutive de închidere.
Nu există suport Unicode încorporat în limbaj, deși este permisă utilizarea caracterelor UTF-8 în literalele de șir, iar sistemul de reprezentare UTF-8 însuși vă permite să introduceți, să scoateți și să procesați parțial șiruri în această codificare folosind instrumente standard de sistem. . Versiunile recente ale Lua includ biblioteca utf8, care oferă suport mai avansat pentru UTF-8, și există biblioteci terță parte care oferă instrumente pentru lucrul cu șiruri Unicode în diferite codificări.
Funcțiile din Lua sunt obiecte cu drepturi depline care pot fi atribuite, transmise ca parametru unei funcții și returnate ca una dintre valori. Tipul de fir are corutine, tipul userdata este conceput pentru a reprezenta date externe primite sau furnizate de la/la cod într-o altă limbă (în principal C/C++).
Toți operatorii aritmetici acceptă operanzi reali, dând rezultate previzibile. De exemplu, x^0.5returnează rădăcina pătrată a lui x, x^(-1/3) reciproca rădăcinii cubice a lui x. Operatorul %este definit de: a % b = a - math.floor(a / b) * b, unde funcția math.floor()evaluează la partea întreagă a argumentului său. Pentru argumentele întregi, rezultatul său este destul de normal. Pentru un dividend real, rețineți că operațiunea nu efectuează nicio rotunjire sau eliminare suplimentară a părții fracționale, astfel încât rezultatul va reține partea fracțională a dividendului. De exemplu, math.pi % 2va returna nu 1, dar 1.1415926535898. Această implementare oferă câteva caracteristici suplimentare. De exemplu, pentru a trunchia xla trei zecimale, este suficient să luați expresiax - x % 0.001
Un tabel în Lua este o matrice asociativă eterogenă dinamică , adică un set de perechi de " ". Cheile pot fi valori de orice tip Lua, cu excepția . Cheile pot fi, de asemenea, literale Lua (identificatori). Scrierea într-un element de tabel este echivalentă cu ștergerea acestui element. ключ-значениеnilnil
Tabelele sunt singurul tip de date compus din Lua. Ele reprezintă baza pentru toate tipurile de date definite de utilizator, cum ar fi structuri , matrice , seturi și altele:
-- Tabel general: gol = {} -- Tabel gol gol [ 1 ] = "primul" -- Adăugarea elementului cu indice întreg gol [ 3 ] = "al doilea" -- Adăugarea elementului cu indice întreg gol [ "al treilea" ] = "third" -- Adăugați element la indexul șirului gol [ 1 ] = nil -- Eliminați elementul din tabel -- Matrice clasică - șirurile sunt indexate implicit cu numere întregi care încep de la 1 zi1 = { „luni” , „marți” , „miercuri” , „joi” , „vineri” , „sâmbătă” , „duminică” } -- Matrice cu zile de indexare arbitrare2 = { [ 0 ] = " Duminica " , [ 1 ] = " Luni " , [ 2 ] = " Marti " , [ 3 ] = " Miercuri " , [ 4 ] = " Joi " , [ 5 ] = " Vineri " , [ 6 ] = " Sambata " } -- Înregistrare (structură) - valorile de diferite tipuri sunt indexate prin literale person = { tabnum = 123342 , -- Număr de personal fio = "Ivanov Stepan Vasilyevich" , -- Nume complet post = "fabricant de scule" , -- Salariul postului = 25800,45 , -- Data salariului = " 23/10/2013 " , -- Data angajării bdate = " 08/08/1973" } -- Data nașterii pfio = persoană . fio --Referire la elementul de structură. -- Set - indexurile sunt folosite pentru a stoca valorile Zilele de lucru = {[ "Luni" ] = adevărat , [ "Marți" ] = adevărat , [ " Miercuri " ] = adevărat , [ " Joi " ] = adevărat , [ " Vineri " " ] = adevărat } Zile lucrătoare [ " Sâmbătă " ] = adevărat -- Adăugați sâmbăta la numărul de zile lucrătoare Zile lucrătoare [ " Miercuri " ] = zero -- Nu mai lucrăm miercurea -- Verificați dacă d este o zi lucrătoare dacă WorkDays [ d ] apoi tipăriți ( d .. " - zi lucrătoare " ) altfel imprimați ( d .. " - zi liberă " ) finalMultiseturile (seturile care pot conține mai mult de o instanță a aceluiași element) sunt implementate în mod similar cu ultimul exemplu, doar că valorile nu sunt logice, ci numere întregi - contoare ale numărului de elemente corespunzătoare din set. Listele legate pot fi reprezentate ca matrice de matrice cu două elemente care dețin o valoare și o referință la următorul element. Matricele multidimensionale pot fi implementate ca matrice de matrice. Structuri mai complexe precum cozi, grafice, rețele sunt implementate și pe baza de tabele, metoda de implementare specifică este determinată de sarcină.
Lua susține conceptul de închidere , de exemplu:
function makeaddfunc ( x ) -- Returnează o nouă funcție anonimă care adaugă x la argumentul său return function ( y ) -- Când ne referim la o variabilă x care se află în afara domeniului curent -- și a cărei durată de viață este mai mică decât această funcție anonimă - - - Lua creează o închidere. return x + y end end plustwo = makeaddfunc ( 2 ) -- adică plustwo = function(y) return 2 + y end print ( plustwo ( 5 )) -- Prints 7De fiecare dată când este apelată makeaddfunc, este creată o nouă închidere pentru variabilă x, astfel încât fiecare funcție anonimă returnată se va referi la propriul parametru x. Ca orice alt obiect Lua, durata de viață a unei închideri este gestionată de gunoiul.
Mecanismul metatable oferă multe dintre caracteristicile pe care alte limbi le oferă prin introducerea de mecanisme sintactice separate. Metatablele sunt tabele Lua obișnuite după structură, supuse tuturor regulilor și restricțiilor limbajului. Particularitatea lor constă în aplicarea lor. Metatabelul stochează metadate suplimentare pentru tipuri și obiecte, adică informații despre parametrii și funcțiile asociate acestora. Informațiile stocate în metatable sunt folosite de interpretul Lua, utilizarea lor vă permite să modificați sau să extindeți funcționalitatea obiectelor programului.
Un metatable în Lua poate fi asociat cu o valoare de orice tip. Tipurile de date scalare (toate, cu excepția datelor utilizatorului și a tabelelor) au metatable comune pentru fiecare tip. Tabelele și valorile unui tip userdataau referințe metatable individuale în fiecare caz. Modificarea metatablelor de toate tipurile, cu excepția tabelelor, se poate face numai prin cod C extern. Numai metatablele de tabel sunt accesibile direct din Lua.
Un tabel Lua creat de la zero nu are un metatabel (referința sa metatable este zero). Dar un metatable pentru acesta poate fi creat în orice moment sau obținut dintr-un alt tabel. Funcția încorporată getmetatable(t)returnează metatabelul tabelului t, iar funcția setmetatable(t, m)setează tabelul t la metatabelul m.
Pentru metatable, sunt documentate un set de câmpuri care pot fi folosite de interpretul de limbă. Pentru a indica rolul special al acestor câmpuri, a fost adoptată o regulă specială de denumire pentru ele: identificatorii lor încep cu două litere de subliniere. Unele dintre aceste câmpuri conțin informații despre proprietăți specifice ale obiectului la care se referă metatabelul. De exemplu, opțiunea __mode, atunci când este dată, poate face un tabel slab , adică un tabel ale cărui referințe la obiect sunt toate referințe slabe . Dar valorile majorității câmpurilor metatable posibile sunt așa-numitele metametode , adică referințe la funcții pe care interpretul le apelează în anumite condiții. Logica generală a utilizării metametodelor de către interpret este următoarea: atunci când interpretul întâlnește o operație în program care nu este definită pentru obiectul operand, accesează metatabelul asociat cu operandul, găsește metametoda corespunzătoare în acesta și o apelează.
--[[ Creare operație de adăugare pentru tabele ]] -- Operanzi t1 = { 1 , 2 , 3 } t2 = { 10 , 20 , 30 } -- Creați metatabel mt = {} -- Scrie metametoda "__add" mt în metatable . __add = function ( a , b ) local res = {} pentru k în perechi ( a ) do res [ k ] = a [ k ] + b [ k ] end return res end -- Leagă metatable la tabelul t1 setmetatable ( t1 , mt ) -- Adăugarea tabelului este acum o operație validă t3 = t1 + t2 -- unește metatable cu t3 cu metametoda __tostring setmetatable ( t3 , { __tostring = funcția ( t ) local res = " \ n " pentru _ , v în perechi ( t ) do res = res .. tostring ( v ) .. "-" end return res .. " \n " end }) -- Acesta va imprima: "11-22-33-" pentru _ , v în ipairs ( t3 ) do io.write ( v , "," ) end print ( tostring ( t3 )) -- afișează „11,22,33,”Lua acceptă metametode pentru toate operațiile aritmetice și de comparare, astfel încât acestea să poată fi folosite pentru a implementa aritmetica pentru orice obiecte create de programator. Pe lângă cele standard, puteți utiliza așa-numitele metametode „bibliotecare”, care sunt susținute nu de nucleul limbajului, ci de biblioteci specifice. În exemplul de mai sus, aceasta este o metametodă __tostringacceptată de biblioteca de șiruri; această metodă transformă tabelul într-un șir.
Domeniul este de cel mai mare interes __index. Este apelat atunci când interpretul încearcă să citească un element de tabel, dar nu îl găsește. Un câmp __indexse poate referi fie la un tabel, fie la o metodă. În primul caz, interpretul, negăsind valoarea dorită în tabelul principal, o va căuta în tabelul __index. În al doilea, în loc să accesezi tabelul, se va apela această metodă. Specificând tabele sau metametode pentru un anumit câmp, Lua poate implementa moștenirea, ascunde datele obiectului, urmărirea operațiunilor pe datele tabelului și multe altele.
Baza pentru OOP în Lua sunt tabele. În principiu, un tabel este un obiect în sensul POO, deoarece poate avea câmpuri denumite cu identificatori și poate stoca valori arbitrare (proprietăți ale obiectului) și funcții pentru implementarea comportamentului obiectului (metodele obiectului) în aceste câmpuri. O parte din zahărul sintactic oferit de Lua face ca descrierea și manipularea obiectelor să fie mai familiară programatorilor cu experiență în limbajele OOP tradiționale. Nu există un concept de „ clasă ” în Lua, prin urmare este descris un obiect separat și toate câmpurile și metodele se referă în mod specific la acesta. Proprietățile sunt descrise în mod similar elementelor de tabel cu chei de identificare, metodele sunt descrise ca câmpuri funcționale. Ca și Oberonul clasic, descrierea metodelor include o indicație explicită în primul parametru al așa-numitului „receptor” - un parametru care, atunci când o metodă este apelată, se referă la obiectul pentru care este chemată. Dar, pe lângă referința standard la un câmp de tabel, printr-un punct, care necesită specificarea explicită a destinatarului în apelul de metodă, Lua acceptă o sintaxă suplimentară: atunci când antetul metodei este scris sub forma " Объект:метод" în apelul sau descrierea metodei , atunci destinatarul nu este specificat. În același timp, în corpul metodei, este încă disponibilă sub numele self:
-- Object Account = { -- Object "account" id , name , sold = 0 , -- object property: number, name, sold credit = function ( self , v ) -- method "cheltuieli" - descrierea in interiorul obiectului cu specificând explicit destinatarul dacă self . sold < v apoi eroare "Echilibru insuficient" end self . echilibru = sine . echilibru - v sfârșit } funcția Cont : debet ( v ) -- metoda „incoming” - descriere scurtă externă (auto nu este specificat) self . echilibru = sine . echilibru + v final Cont . debet ( Cont , 10000 ) -- metoda apel - versiune lungă Cont : credit ( 5000 ) -- metoda apel - versiune scurtăMoștenirea, inclusiv moștenirea multiplă, este implementată folosind metatable și metametode. De asemenea, folosind metametode, puteți implementa ascunderea datelor și accesul controlat la câmpurile obiectului-tabel. Dacă comparați această abordare cu alte limbi, în care toate cele de mai sus sunt implementate folosind instrumente de limbaj speciale, puteți vedea că implementarea Lua este mai complicată și necesită o codificare mai atentă, dar oferă mai multă flexibilitate și simplifică interpretul.
Program clasic „ Bună, lume!” » în Lua arată astfel:
imprimare ( "Bună ziua, lume!" )Factorial este un exemplu de funcție recursivă :
funcția factorială ( n ) dacă n == 0 atunci returnează 1 altfel returnează n * factorial ( n - 1 ) final final pentru i = 1 , 5 do -- se încheie instrucțiuni/operațiiLucrul cu funcții ca obiecte de primă clasă este demonstrat în următorul exemplu, care modifică comportamentul funcției de imprimare:
do local oldprint = print -- Salvați funcția de imprimare curentă ca funcție de tipărire veche print ( s ) -- Redefiniți funcția de imprimare dacă s == "foo" apoi oldprint ( " bar " ) else oldprint ( e ) final end endOrice apel viitor printva fi acum redirecționat către noua funcție și, datorită suportului Lua pentru context lexical , vechea funcție de tipărire va fi accesibilă numai prin noua funcție de tipărire modificată. Lua acceptă, de asemenea, închideri , așa cum este descris mai sus în secțiunea aferentă.
O caracteristică cheie a Lua este semantica sa extensibilă, iar mecanismul metatable oferă mult spațiu pentru personalizarea comportamentului unic pentru tabelele Lua. Următorul exemplu demonstrează un tabel „infinit”. Pentru orice va da --lea număr Fibonacci folosind memorarea . fibs[n]
fibs = { 1 , 1 } -- Valori inițiale pentru fibs[1] și fibs[2]. setmetatable ( fibs , { __index = funcția ( nume , n ) -- Apelați funcția dacă fibs[n] nu există. nume [ n ] = nume [ n - 1 ] + nume [ n - 2 ] -- Calculați și memorați fibs [n] .return name [ n ] end })Lua vă permite, de asemenea, să utilizați operatori logici andpentru a orintroduce constructe ternare , ca în C# , de exemplu, sau pentru a face referire la unul dintre obiectele existente.
do local num = tonumber ( io.read ()) -- Scrieți într-o variabilă informațiile introduse de la consolă și convertiți-le într-un tip de tip întreg ( num == 1 și „ Ați introdus numărul corect” sau „Ați introdus număr greșit" ) -- Dacă variabila num este egală cu 1, atunci textul după și va fi afișat în consolă, în toate celelalte cazuri după sau sfârșitAccesarea unui tabel existent și obținerea valorii la primul index:
do local tbl = nil local tbl2 = { 1 } print ( ( tbl sau tbl2 )[ 1 ] ) -- Numărul 1 va fi tipărit deoarece tabelul tbl2 are această valoare la capătul indexului 1Apelarea unei funcții dintr-unul dintre tabelele existente:
do local tbl = nil local tbl2 = {} tbl2 . DoSomething = funcția () print ( „Fă ceva” ) end ( tbl sau tbl2 ). Fă Ceva () se terminăLa fel ca multe limbaje de programare interpretate , implementarea Lua are un compilator separat de la limbajul sursă la bytecode executabil și o mașină virtuală pentru a executa bytecode generat. Mai mult, bytecode nu este comenzile mașinii de stivă, ci comenzile unui anumit procesor virtual cu mai multe registre, ceea ce crește eficiența execuției. Mașina virtuală standard Lua utilizează alocarea memoriei cu colectarea gunoiului (similar cu Java sau .NET).
Lua folosește un singur pool de șiruri , ceea ce reduce supraîncărcarea de memorie pentru stocarea șirurilor.
Pentru sarcinile critice de timp, există un compilator JIT - Lua - LuaJIT [15] . De asemenea, a fost dezvoltat compilatorul llvm-lua [16] , care generează cod pentru mașina virtuală LLVM , care oferă posibilitatea de compilare ulterioară într-un cod de mașină foarte eficient pentru procesoare de diferite arhitecturi.
Este folosit în prezent în diverse proiecte în care este necesar să se construiască într-un limbaj de programare de scripting destul de rapid și ușor de învățat - de exemplu, în dezvoltarea jocurilor , unde Lua este adesea folosit ca un strat între motorul jocului și datele pentru script comportamentul și interacțiunea obiectelor. Datorită compactității sale, este aplicabil și în dispozitivele portabile, în special, unul dintre calculatoarele grafice Texas Instruments folosește un limbaj în loc de BASIC , tradițional pentru această clasă de dispozitive .
LucasArts a fost primul care a introdus limbajul Lua în dezvoltarea jocurilor pe calculator, începând cu jocul Grim Fandango [17] . Autorii limbii în raportul lor la conferința HOPLAmintiți-vă că în ianuarie 1997 au primit un mesaj de la Bret Mogilefsky, principalul dezvoltator al lui Grim Fandango, unde a scris că după ce a citit despre limbă într-un articol din 1996 din Dr. Dobb's Journal , el plănuiește să înlocuiască limbajul lor de scripting SCUMM de casă cu Lua [18] . Drept urmare, a creat motorul de joc GrimE , care este folosit și de o căutare ulterioară de la LucasArts - Escape from Monkey Island .
În 2003, un sondaj GameDev.net a clasat Lua drept cel mai popular limbaj de scripting pentru dezvoltarea jocurilor [9] .
Un exemplu de joc programat cu Lua este World of Warcraft [19] [20] . Nivelurile jocului de puzzle Enigma [21] sunt descrise în limba Lua .
Sunt disponibile un număr de motoare de joc gratuite , programabile în Lua, cum ar fi Defold [22][ semnificația faptului? ] , motorul de arcade LÖVE [23] [24] , designerul de jocuri Novashell [25] și orientat pe misiuni (în mare parte bazat pe text ) INSTEAD [26] .
Folosit și în simulatorul de zbor X-Plane, în motorul X-Ray pentru STALKER [27] .
Pentru popularul joc Minecraft , au fost create modificări ale ComputerCraft și OpenComputers-ul analog mai avansat, care adaugă computere programate în limbajul Lua [28] .
Celebrul joc Garry's Mod este programat și acceptă și modificări scrise în Lua.
Echipa Croteam (dezvoltatorii Serious Sam și The Talos Principle ) folosește Lua în scripting încă de la Serious Engine 3.5 [29] .
Pentru jocul GTA: San Andreas , modificările sunt create scrise în limba Lua și acceptate de pluginul Moonloader. [30] Multi Theft Auto acceptă și scripting Lua.
Platforma de jocuri Roblox folosește Lua ca limbaj de codificare a jocului și management al mediului de joc [31] .
Modulul Ficsit-Networks a fost creat de comunitatea de joc Satisfactory , ceea ce face posibilă programarea oricăror acțiuni în limba Lua [32] .
Factorio folosește Lua pentru a crea modificări. [33] [34]
Jocul Dual Universe este folosit pentru mecanica în joc și pentru programarea blocurilor de joc
Competatorul de computer LuaTeX , o versiune extinsă a pdfTeX , folosește Lua ca limbaj de scripting încorporat [35] .
Managerul de pachete RPM conține un interpret Lua încorporat [36] .
Există cel puțin două medii de dezvoltare „native” pentru Lua, acestea sunt:
În plus, Lua este susținut de unele IDE-uri universale, în special:
A existat un modul de suport Lua pentru mediul NetBeans , dar a fost întrerupt în 2013 și este disponibil numai pentru NetBeans 7.4 și versiuni anterioare. Pluginul nu este acceptat în NetBeans 8.
Lua | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Limbaje de programare | |
---|---|
|