ΗLua είναι ελαφριά προστακτικήγλώσσα προγραμματισμού, που σχεδιάστηκε ωςγλώσσα σεναρίων με κύριο σκοπό τη δυνατότητα επέκτασης της σημασιολογίας της. Το όνομα προέρχεται από τηνπορτογαλική λέξηlua που σημαίνει "φεγγάρι". Η Lua έχει ένα σχετικά απλόCAPI σε σχέση με άλλες γλώσσες σεναρίων.
Επειδή και η Lua και ηJavaScript χρησιμοποιούν αντικείμενα βασισμένα στα πρωτότυπα, και επηρεάστηκαν από τηScheme, έχουν αρκετά κοινή σημασιολογία, παρά τις σημαντικές διαφορές στησύνταξη. Στη σχεδίασή της, η Lua μοιάζει επίσης με τηνIcon, ίσως επειδή και οι δύο επηρεάστηκαν από τηSNOBOL.
Η Lua έχει χρησιμοποιηθεί σε πολλές εφαρμογές, εμπορικές και μη-εμπορικές, και ιδιαίτερα στη βιομηχανίαβιντεοπαιχνιδιών.
Η Lua συνήθως περιγράφεται σαν μια γλώσσαπολλαπλών παραδειγμάτων (multi-paradigm programming language) και παρέχει ένα μικρό σύνολο από γενικά χαρακτηριστικά που μπορούν να επεκταθούν για να ταιριάζουν σε διαφορετικούς τύπους προβλημάτων, αντί να βασίζεται σε έναν πολύπλοκο και δύσκαμπτο ορισμό που να ταιριάζει μόνο σε ένα παράδειγμα. Για παράδειγμα, δεν παρέχει ρητή υποστήριξη για κληρονομικότητα, αλλά επιτρέπει σχετικά εύκολα να υλοποιηθεί αυτό το χαρακτηριστικό με τη χρήση μετα-πινάκων (metatables). Επίσης η Lua επιτρέπει στον προγραμματιστή να υλοποιεί χώρους ονομάτων (namespaces), κλάσεις, και άλλα σχετικά χαρακτηριστικά με βάση την υλοποίηση των πινάκων της, ενώ οι συναρτήσεις πρώτης τάξης επιτρέπουν τη χρήση πολλών ισχυρών τεχνικών τουσυναρτησιακού προγραμματισμού, και οι πλήρεις λεκτικές δεσμέυσεις επιτρέπουν τη λεπτομερήαπόκρυψη πληροφορίας, με βάση τηναρχή του ελάχιστου προνόμιου (principle of least privilege).
Γενικά η Lua προσπαθεί να έχει ευέλικτα μετα-χαρακτηριστικά που να μπορούν να επεκταθούν όταν χρειάζεται, και όχι ένα εξειδικευμένο σύνολο χαρακτηριστικών για κάποιο συγκεκριμένο σκοπό. Αυτό έχει σαν αποτέλεσμα η βασική γλώσσα να είναι ελαφριά - στην πραγματικότητα, ο πλήρης πρότυποςδιερμηνέας μεταγλωττισμένος είναι περίπου 150 KB — και προσαρμόζεται εύκολα σε ένα μεγάλο εύρος εφαρμογών.
Η Lua είναι γλώσσα μεδυναμικούς τύπους που προορίζεται για επέκταση ή για γλώσσα σεναρίων, και είναι τόσο μικρή που μπορεί να ενσωματωθεί σε πολλές πλατφόρμες. Υποστηρίζει μόνο ένα μικρό αριθμό ατομικών δομών δεδομένων όπως οι τιμές αλήθειας, οι αριθμοί (κινητής υποδιαστολής με διπλή ακρίβεια), και οι συμβολοσειρές. Τυπικές δομές δεδομένων όπως οι πίνακες, τασύνολα, οι λίστες και οι εγγραφές μπορούν να αναπαρασταθούν με τη χρήση της μοναδικής ενσωματωμένης δομής δεδομένων στη Lua, που πρακτικά είναι ένας ετερογενής πίνακας αντιστοίχισης (associative array).
Η Lua υλοποιεί ορισμένα προχωρημένα χαρακτηριστικά όπως οι συναρτήσεις πρώτης τάξης, ησυλλογή απορριμμάτων, τακλεισίματα, η σωστή αναδρομή ουράς, ο εξαναγκασμός τύπων (coercion) (αυτόματη μετατροπή μεταξύ συμβολοσειρών και αριθμών στο χρόνο εκτέλεσης), οι συρρουτίνες (συνεργατικήπολυδιεργασία) και η δυναμική φόρτωση μονάδων κώδικα (modules).
Με τη χρήση μόνο αυτού του ελάχιστου συνόλου τύπων δεδομένων η Lua επιτυγχάνει μια ισορροπία μεταξύ ισχύος και μεγέθους.
-- Τα σχόλια στη Lua αρχίζουν με διπλή παύλα και συνεχίζονται ως το τέλος της γραμμής.-- [[Οι συμβολοσειρές και τα σχόλια που καταλαμβάνουν πολλές γραμμές"διακοσμούνται"μεδιπλέςαγκύλες.]]
Μια δεύτερη μορφή της συνάρτησης "παραγοντικό" προέρχεται από τη βραχυκυκλωμένη αποτίμηση των τελεστών αλήθειας στη Lua, με βάση την οποία η Lua επιστρέφει την τιμή του τελευταίου τελεστή που αποτιμήθηκε σε μια έκφραση:
Ο χειρισμός των συναρτήσεων από τη Lua σαν τιμές πρώτης τάξης φαίνεται στο επόμενο παράδειγμα, που τροποποιεί τη συμπεριφορά της συνάρτησης print:
dolocaloldprint=print-- Αποθήκευσε την τρέχουσα συνάρτηση print σαν oldprintfunctionprint(s)-- Όρισε πάλι τη συνάρτηση printifs=="foo"thenoldprint("bar")elseoldprint(s)endendend
Οι επόμενες κλήσεις στην ‘print’ θα οδηγηθούν τώρα στη νέα συνάρτηση και, χάρη στην εμβέλεια της Lua, η παλιά συνάρτηση είναι προσβάσιμη μόνο μέσα από τη νέα, τροποποιημένη συνάρτηση.
Η Lua επίσης υποστηρίζει κλεισίματα, όπως φαίνεται παρακάτω:
functionmakeaddfunc(x)-- Επιστρέφει μια νέα συνάρτηση που προσθέτει x στο όρισμά τηςreturnfunction(y)-- Όταν αναφερόμαστε στη μεταβλητή x, που είναι εκτός της τρέχουσας-- εμβέλειας και η διάρκεια ζωής της είναι μεγαλύτερη από αυτή της ανώνυμης-- συνάρτησης, η Lua δημιουργεί ένα κλείσιμο.returnx+yendendplustwo=makeaddfunc(2)print(plustwo(5))-- Εκτυπώνει 7
Ένα νέο κλείσιμο για τη μεταβλητήx δημιουργείται κάθε φορά που καλείται ηmakeaddfunc, ώστε η ανώνυμη συνάρτηση που επιστρέφεται να έχει πάντα πρόσβαση στη δική της παράμετροx. Η διαχείριση του κλείσιμου γίνεται από τη συλλογή απορριμμάτων της Lua, όπως κάθε άλλο αντικείμενο.
Η επεκτάσιμη σημασιολογία είναι βασικό χαρακτηριστικό της Lua, και η ιδέα του “μεταπίνακα” (“metatable”) επιστρέφει στους πίνακες της Lua να διαμορφώνονται με ισχυρούς και μοναδικούς τρόπους. Το επόμενο παράδειγμα δείχνει έναν “άπειρο” πίνακα. Για κάθε, ηfibs[n] επιστρέφει τον-οστό αριθμό Fibonacci χρησιμοποιώνταςδυναμικό προγραμματισμό καιmemoization.
fibs={1,1}-- Αρχικές τιμές για τις fibs[1] και fibs[2].setmetatable(fibs,{-- Δίνει στη fibs κάποια "μαγική" συμπεριφορά.__index=function(name,n)-- Καλεί αυτήν τη συνάρτηση αν η fibs[n] δεν υπάρχει.name[n]=name[n-1]+name[n-2]-- Υπολογίζει και απομνημονεύει την fibs[n].returnname[n]end})
Είναι δυνατό να γραφτούν επεκτάσεις χρησιμοποιώντας το API της Lua. Οι επεκτάσεις αυτές είναιδυναμικά συνδεδεμένα αντικείμενα που μπορούν να χρησιμοποιηθούν για να επεκτείνουν τη λειτουργικότητα του διερμηνέα παρέχοντας δυνατότητες χαμηλού επιπέδου της πλατφόρμας στα σενάρια σε Lua. Από την πλευρά της Lua, μια τέτοια επέκταση εμφανίζεται σαν ένας πίνακας-χώρος ονομάτων (namespace) που κρατά τις συναρτήσεις και τις μεταβλητές. Τα σενάρια Lua μπορούν να φορτώνουν επεκτάσεις χρησιμοποιώντας την εντολήrequire.
Μια ολοένα και αυξανόμενη συλλογή από επεκτάσεις (rocks) είναι διαθέσιμη μέσα από το σύστημα διαχείρισης πακέτωνLuaRocks,[2], σε αντιστοιχία με τοRubyGems. Άλλες πηγές είναι το LuaForge και ο κατάλογοςLua Addons του wiki στη σελίδα lua-users.org.[3]
Έτοιμα πακέτα αντιστοίχισης με τη Lua υπάρχουν για τις πιο πολλές γνωστές γλώσσες προγραμματισμού, περιλαμβάνοντας άλλες γλώσσες σεναρίων.[4]Για τις C/C++, υπάρχουν κάποιες προσεγγίσεις βασισμένες σε πρότυπα και κάποια αυτόματα εργαλεία παραγωγής όπως το tolua, τοtolua++[5], τοSWIG, τοLuabind, το LuaPlus και το Luna.
ΤοDamn Small Linux χρησιμοποιεί Lua για να παρέχει φιλικά προγράμματα στην επιφάνεια εργασίας για εργαλεία της γραμμής εντολών χωρίς να καταλαμβάνει σημαντικό χώρο στο δίσκο.
ΤοDolphin Computer Access χρησιμοποιεί σενάρια σε Lua για να μετατρέψει μη προσβάσιμες εφαρμογές σε προσβάσιμες για χρήστες με προβλήματα όρασης που χρησιμοποιούν αναγνώστη οθόνης - SuperNova.
Η μηχανή σύνθεσης του Eyeon Fusion χρησιμοποιεί ενσωματωμένη Lua για εσωτερικά και εξωτερικά σενάρια και για πρωτότυπα αρθρώματα.
Μια έκδοση τουεξομοιωτήFCE Ultra τουNES που ονομάζεται FCEUX επιτρέπει επεκτάσεις η αλλαγές σε παιχνίδια μέσω σεναρίων σε Lua.
Το πρόγραμμα σχεδίασηςIpe (που χρησιμοποιείται κυρίως για σχήματα με κείμενο σεLaTeX) χρησιμοποιεί Lua για τη λειτουργικότητά του και τις επεκτάσεις των σεναρίων του.
Ο διαχειριστής παραθύρωνIon χρησιμοποιεί Lua για τη διαμόρφωση των προτιμήσεων του χρήστη και επεκτασιμότητα.
Ο εξυπηρετητήςlighttpd χρησιμοποιεί τη Lua για σενάρια (hook scripts), και για να αντικαθιστά τηνCache Meta Language.
Η έκδοση 2.01 του λογισμικού διαχείρισης προφίλ τηςLogitech για το πληκτρολόγιο παιχνιδιώνG15 χρησιμοποιεί τη Lua σαν γλώσσα σεναρίων.
ΤοLuaTeX, ο διάδοχος τουpdfTeX, επιτρέπει επεκτάσεις σε Lua.
ΤοMikroTik έχει υποστήριξη (βήτα ποιότητας) τηςLua[νεκρός σύνδεσμος] στην έκδοση 4.x, και σχεδιάζεται υποστήριξη για την 5.x στο RouterOS.
Το σύστημα διαχείρισης εκδόσεωνMonotone χρησιμοποιεί τη Lua για τα μικρά σενάρια που χρειάζεται σε διάφορα σημεία.
ΤοMultimedia Fusion Developer 2 έχει μια επέκταση για Lua που επιτρέπει σε παιχνίδια και εφαρμογές που έχουν δημιουργηθεί με αυτό να εκτελούν σενάρια σε Lua.
Ο σαρωτής ασφάλειας δικτύωνnmap χρησιμοποιεί τη Lua σαν βάση για τη δική του γλώσσα σεναρίων, τηνnse.
Το GSM firmware της WavecomOpen AT OS επιτρέπει σε εφαρμογές χρηστών να γραφτούν σε Lua.
Η διανομή firmwareανοιχτού κώδικαOpenWrt χρησιμοποιεί τη Lua για να υλοποιεί τη γραφική διεπιφάνεια μέσω Web που ονομάζεταιLuCI.
ΟProsody είναι ένας εξυπηρετητήςJabber/XMPP για πολλές πλατφόρμες και είναι γραμμένος σε Lua.
ΤοRockbox, το firmware ανοιχτού κώδικα για συσκευές αναπαραγωγής ήχου, υποστηρίζει επεκτάσεις γραμμένες σε Lua.
Οι νέες εκδόσεις του διορθωτήSciTE μπορούν να επεκταθούν με τη χρήση Lua.
Το SqueezePlay που χρησιμοποιείται στα προϊόντα SqueezeBoxController και SqueezeBox Radio της Logitech χρησιμοποιεί Lua.
Το πρόγραμμα αναπαραγωγής πολυμέσωνVLC media player χρησιμοποιεί τη Lua για την υποστήριξη σεναρίων.
Ο αναλυτής πακέτων δικτύουWireshark επιτρέπει στον κώδικα που αναλύει και καταγράφει τα πακέτα να είναι γραμμένος σε Lua.
ΤοAsterisk έχει υλοποιήσει μια επέκταση για τη δημιουργία dialplans σε Lua.
Εφαρμογές για τη φορητή συσκευή αναπαραγωγής πολυμέσων Zen X-Fi2 τηςCreative Technology μπορούν να δημιουργηθούν σε Lua.
Η εικονική γλώσσα προγραμματισμού max/msp Jitter από την εταιρία Cycling74 δίνει τη δυνατότητα στο χρήστη να γράψει κώδικα Lua μέσω του object ji.gl.lua.