Lua (limba de programare)

Lua este un limbaj de programare rapid și ușor de utilizat. Acesta combină o sintaxă procedurală simplă cu constructe flexibile de descriere a datelor bazate pe matrice asociative și semantică extensibilă. Lua este scris dinamic și interpretat. Interpretul traduce codul sursă într-un bytecode pentru mașină virtuală înregistrată și este distribuit liber, cu programe open source C. Mașina virtuală Lua standard utilizează alocarea de memorie cu colectarea de gunoi (similară cu Java sau .NET).

Istoria creației

Lua 1.0 a fost proiectat astfel încât constructorii obiect inclus SOL sintaxa (de unde și numele Lua: Sol Portugheză - «Sun», Lua - «Moon"). constructe de control Lua au fost preluate din Modula (dacă, în timp, se repetă / până la), CLU (repartizare paralelă, valoarea returnata plural a funcției ca o alternativă mai simplă, în loc de a transmite link-ul sau parametrii indicii explicite), C ++, SNOBOL si AWK (tablouri asociative).

Versiuni de la Lua până la 5.0 au fost emise sub licență similară licenței BSD. Începând cu versiunea 5.0 și versiuni ulterioare, Lua este distribuită sub licența MIT. Ambele licențe sunt permisive și aproape identice.

instrumente

Un interpret offline (numit de asemenea lua.c de numele fișierului sursă sau pur și simplu prin executabil) este un program mic care permite utilizarea directă a lui Lua. Când interpretul încarcă un fișier, ignoră prima linie, dacă începe cu un "număr" ("#"). Această caracteristică permite Lua să fie folosit ca un interpret de scripting pe sistemele Unix. Dacă prefixați codul dvs. cu un șir de formular

(presupunând că interpretul autonom este localizat în / usr / local / bin), sau

atunci puteți apela (executa) programul direct, fără a mai fi nevoie să rulați în prealabil interpretul Lua.

Toți parametrii sunt opționali. După cum am văzut, atunci când începe fără argumente, interpretul merge online. Comutatorul -e vă permite să introduceți codul direct în linia de comandă.

(Pe Unix, trebuie să specificați ghilimele duble la comenzi shell separate de codul executabil real.) Așa cum sa menționat mai sus, comutator -l descarcă fișierul și convertește interpretul -i în modul interactiv după tratamentul cu alte taste (opțiuni). De exemplu, un apel

încarcă fișierul a.lua, apoi execută alocarea x = 10 și în final furnizează linia de comandă pentru intrare.

Scripturile din limbă sunt marcate cu extensia .lua. Pentru sarcini care sunt critice în timp, există un compilator Lua-LuaJIT JIT. compilator LLVM-Lua este, de asemenea, proiectat pentru a genera codul pentru mașina virtuală LLVM, oferind o oportunitate de a follow-up compilarea într-un cod foarte eficient pentru o masina de arhitectura de procesor diferit.

Principii de bază

Acordurile Lexic

Numele (identificatorii) din Lua pot fi orice șir de litere, cifre și subliniere care nu încep cu o cifră. Următoarele cuvinte cheie sunt rezervate și nu pot fi folosite în nume:

Lua este un caz sensibil la cazul caracterelor: și - un cuvânt cheie, în timp ce AND și AND sunt doi identificatori valori diferiți. Prin convenție, numele care încep cu o subliniere și sunt scrise cu majuscule (de exemplu _VERSION) sunt rezervate pentru a fi utilizate ca variabile globale interne utilizate de Lua. Linturile literale trebuie să fie închise în ghilimele simple sau duble și pot conține secvențe de evacuare asemănătoare C.

Tipuri și variabile

Există opt tipuri de bază în Lua: nul, boolean, număr, șir, funcție, userdata, fir și tabel.

  1. Nil este tipul valorii zero [valoare goală]. Proprietatea sa principală este să difere de toate celelalte valori și să denotă absența unei valori adecvate.
  2. Tipul boolean include fals (fals) și adevărat (adevărat). Valorile nil și false sunt considerate false, orice altă valoare este considerată dreptă. Tipul de număr se referă la numere reale (punct de plutire cu precizie dublă).
  3. Stringul denotă o serie de caractere. Seturile Lua pot conține orice caractere pe 8 biți, inclusiv zero ('\ 0').
  4. Tipul userdata (date utilizator) vă permite să stocați orice date din C în variabilele Lua. Valoarea acestui tip este o referință la blocul de memorie fizică și nu are operațiuni predefinite în Lua, cu excepția testelor de asignare și egalitate. Cu toate acestea, folosind metatabele, programatorul poate defini operațiuni pe valori de acest tip.
  5. Tipul de fir (fir) desemnează un flux independent de execuție și se utilizează la implementarea mecanismului de corutină. Nu puteți identifica firele Lua cu fire de sistem de operare. Lua suportă subrutine chiar și în sisteme în care firele de la nivelul sistemului de operare nu sunt acceptate.
  6. Tipul de tabel definește matricea asociativă. Astfel de matrice pot fi indexate nu numai prin numere, ci prin orice valori (cu excepția nilului). Un tabel poate conține valori de mai multe tipuri (cu excepția notelor). Tabelele sunt singurul mecanism pentru structurarea datelor în Lua; ele pot fi folosite ca simple tablouri, tabele de simboluri, seturi, câmpuri de înregistrări, copaci și așa mai departe. Pentru a reprezenta dicționarele, Lua folosește numele câmpului ca indice al tabelului. Reprezentarea în forma a.name este considerată identică cu reprezentarea a ["name"]. Deoarece funcțiile sunt valori ale tipului încorporat, câmpurile tabelului pot conține funcții. Astfel, tabelele pot stoca metode metodice.

Variabilele, cum ar fi tabelul, funcția, firul și userdata nu conțin datele în sine, ele conțin doar referințe la obiectul corespunzător.

Există trei tipuri de variabile în Lua: globale. câmpurile locale și de masă. Orice variabilă este considerată globală dacă nu este declarată explicit ca fiind locală. Variabilele locale există într-un context lexical: variabilele locale sunt disponibile pentru funcțiile definite în acest context.

În Lua, este acceptat un set de declarații în general standard, aproape la fel ca în Pascal sau C. Este alcătuit din operatori de atribuire, operatori de control al debitului, apeluri de funcții și descrieri variabile.

Următoarele sunt operațiile de bază:

Când se compară cu egalitatea, nu se efectuează conversia de tip. Obiectele de diferite tipuri sunt întotdeauna considerate diferite. La calcularea unei valori se utilizează un scurtcircuit - al doilea argument este evaluat numai dacă este necesar. Următorul tabel de priorități și asociativitatea operațiunilor operează:

Lua nu are o funcție dedicată, care începe executarea programului. Interpretul execută secvențial declarațiile pe care le primește din fișier sau din programul de control. Procedând astfel, programul precomprimă programul într-o reprezentare binară, care poate fi de asemenea salvată.

Orice bloc de cod este executat ca o funcție anonimă, astfel încât să puteți defini variabilele locale în ea și puteți returna o valoare din ea.

Operatorii pot fi (dar nu neapărat) separați de simbolul ";".

Mai jos sunt principalii operatori:

Blocați. sfârșitul transformă o secvență de instrucțiuni într-un singur operator și deschide un nou domeniu în care puteți defini variabilele locale.

În declarațiile if. în timp ce și repetați toate valorile expresiei, altele decât false și zero, sunt tratate ca fiind adevărate. Instrucțiunea de retur nu poate conține valori returnate sau conține una sau mai multe expresii (listă). Declarațiile de returnare și pauză trebuie să fie ultimele instrucțiuni din bloc (adică trebuie să fie ultimele instrucțiuni din blocul de cod sau chiar înainte de sfârșit.).

Instrucțiunea for este executată pentru toate valorile variabilei buclă, pornind de la valoarea de pornire și terminând cu valoarea finală inclusiv. A treia valoare, dacă este dată, este utilizată ca etapă de modificare a variabilei buclă. Toate aceste valori trebuie să fie numerice. Acestea sunt evaluate o singură dată înainte ca bucla să fie executată. Variabila buclă este locală în această buclă și nu este disponibilă în afara corpului său. Valoarea variabilei buclă nu poate fi schimbată în interiorul corpului bucla. Iată un pseudocod care demonstrează executarea instrucțiunii for.

O definiție a funcției este o expresie executabilă (constructor de funcții) a cărui rezultat este un obiect al funcției de tip:

O listă (eventual goală) a argumentelor funcției este plasată în paranteze. Lista argumentelor funcției se poate încheia cu o elipsă - în acest caz funcția are un număr variabil de argumente. Între paranteza de închidere și instrucțiunea de sfârșit, corpul funcției este plasat.

În momentul executării constructorului funcției este construită și o închidere - un tabel cu toate variabilele locale disponibile în funcție și extern cu privire la acesta. Dacă funcția este transferată ca valoare de retur, aceasta salvează accesul la toate variabilele care intră în închidere. De fiecare dată când un constructor de funcții este executat, se construiește o nouă închidere.

Apelul pentru funcții constă dintr-o referință de funcție și dintr-o listă de argumente paranteză (eventual goală). O referință la o funcție poate fi orice expresie al cărei rezultat este o funcție. Nu există o linie de alimentare între referința funcției și paranteza de deschidere.

Dacă funcția are un singur argument și o tratează ca un tabel ale cărui elemente sunt indexate prin numele parametrilor formali ai funcției, în acest caz apelul la mecanismul argumentelor numite este implementat de fapt:

O meta-tabele

Fiecare tabel și userdata tip de obiect poate avea meta-tabel - tabel regulat, domenii care determină comportamentul obiectului sursă atunci când se aplică pentru al unor operațiuni speciale. De exemplu, atunci când obiectul se află în operandul plus, interpretul caută câmpul meta-tabel denumit __add și în cazul în care acest domeniu este prezent, atunci folosește valoarea sa ca o funcție pentru a efectua plus. Indicii (numele câmpurilor) dintr-o meta-tabelă se numesc evenimente, iar valorile corespunzătoare (procesatori de evenimente) sunt metametode.

În mod prestabilit, tabelul nou creat nu are un meta-tabel. Orice tabel mt poate fi făcut meta-tabelul tabelului t. apelând funcția setmetatable (t, mt). Funcția getmetatable (t) returnează meta-tabela din tabelul t sau zero. dacă tabelul nu are o meta-tabelă.

Lua definește următoarele evenimente:

Exemple de utilizare a tabelelor meta

În următorul exemplu, meta-tabelele sunt folosite pentru a atribui o valoare implicită elementelor de tabelă care lipsesc:

Aici este o soluție mai non-trivială care nu folosește o meta-tabelă separată pentru fiecare valoare implicită:

Metoda Metoda __index a meta-tabelului interceptează apelurile către câmpurile de tabelă care lipsesc și returnează valoarea stocată în tabelul însuși prin indexul cheie.

Pachetele sunt principala modalitate de a defini un set de funcții interdependente fără a afecta domeniul de aplicare global. În mod obișnuit, un pachet este un fișier separat care definește în domeniul global o singură tabelă care conține toate funcțiile acestui pachet:

De asemenea, puteți face toate funcțiile locale și separat să creați o tabelă de funcții exportate:

Pachetul este încărcat utilizând funcția requ (). și la data încărcării, numele obținut prin această funcție (poate să nu conțină o extensie care este adăugat automat) este disponibil prin variabila _REQUIREDNAME.

Clase și obiecte

Aici funcția de clasă creează o tabelă goală, pregătită pentru a deveni o meta-tabelă a obiectului. Metodele de clasă se fac prin câmpurile din acest tabel, adică. O clasă este un tabel care conține simultan metodele obiectului și meta-metodele acestuia.

Funcția object () creează un obiect al clasei specificate - o tabelă care are clasa specificată ca meta-tabelă. În al doilea argument, se poate transmite un tabel care conține câmpurile inițializate ale obiectului.

Biblioteci standard

Bibliotecile standard Lua conțin funcții frecvent utilizate care sunt executate direct în C API. Unele dintre aceste funcții oferă servicii lingvistice importante (de exemplu, tip și disponibil); altele oferă acces la servicii "externe" (de exemplu, intrări / ieșiri); în parte ele sunt implementate pe Lua, oricât de des folosite și având un timp critic de execuție sunt implementate în C (de exemplu, sort).

Toate bibliotecile sunt chemați prin AP API oficial și funcționează ca module separate C. În prezent, Lua are următoarele biblioteci standard:

  • biblioteca de bază;
  • bibliotecă de pachete;
  • lucrează cu șiruri (manipularea șirului);
  • lucrul cu mese (manipularea mesei);
  • funcții matematice (păcat, jurnal etc.);
  • intrare / ieșire;
  • sistem de operare (facilități de sistem de operare);
  • facilități de depanare.

Fiecare bibliotecă, excluzând biblioteca de bază și biblioteca de pachete, reprezintă toate funcțiile ca câmpuri globale de tabel sau ca metode obiect.

Referințe

Articole similare