Lua

Η Lua είναι ελαφριά προστακτική γλώσσα προγραμματισμού, που σχεδιάστηκε ως γλώσσα σεναρίων με κύριο σκοπό τη δυνατότητα επέκτασης της σημασιολογίας της. Το όνομα προέρχεται από την πορτογαλική λέξη lua που σημαίνει "φεγγάρι". Η Lua έχει ένα σχετικά απλό C API σε σχέση με άλλες γλώσσες σεναρίων.

Επειδή και η 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 επιτυγχάνει μια ισορροπία μεταξύ ισχύος και μεγέθους.

Παραδείγματα κώδικα 
Το κλασικό πρόγραμμα "hello world" γράφεται ως εξής:
print("Hello World!")

Σχόλια:
-- Τα σχόλια στη Lua αρχίζουν με διπλή παύλα και συνεχίζονται ως το τέλος της γραμμής.
-- [[Οι συμβολοσειρές και τα σχόλια που καταλαμβάνουν πολλές γραμμές
     "διακοσμούνται" με διπλές αγκύλες.]]

Η factorial (παραγοντικό) είναι ένα παράδειγμα αναδρομικής συνάρτησης:
function factorial(n)
  if n == 1 or n == 0 then
    return 1
  else
    return n * factorial(n - 1)
  end
end 
Μια δεύτερη μορφή της συνάρτησης "παραγοντικό" προέρχεται από τη βραχυκυκλωμένη αποτίμηση των τελεστών αλήθειας στη Lua, με βάση την οποία η Lua επιστρέφει την τιμή του τελευταίου τελεστή που αποτιμήθηκε σε μια έκφραση:
function factorial2(n) 
  return n == 0 and 1 or n * factorial2(n - 1)
end

Ο χειρισμός των συναρτήσεων από τη Lua σαν τιμές πρώτης τάξης φαίνεται στο επόμενο παράδειγμα, που τροποποιεί τη συμπεριφορά της συνάρτησης print:
do
  local oldprint = print           -- Αποθήκευσε την τρέχουσα συνάρτηση print σαν oldprint
  function print(s)                -- Όρισε πάλι τη συνάρτηση print
    if s == "foo" then
      oldprint("bar")
    else 
      oldprint(s) 
    end
  end
end
Οι επόμενες κλήσεις στην ‘print’ θα οδηγηθούν τώρα στη νέα συνάρτηση και, χάρη στην εμβέλεια της Lua, η παλιά συνάρτηση είναι προσβάσιμη μόνο μέσα από τη νέα, τροποποιημένη συνάρτηση.

Η Lua επίσης υποστηρίζει κλεισίματα, όπως φαίνεται παρακάτω:
function makeaddfunc(x)
  -- Επιστρέφει μια νέα συνάρτηση που προσθέτει x στο όρισμά της
  return function(y)
    -- Όταν αναφερόμαστε στη μεταβλητή x, που είναι εκτός της τρέχουσας
    -- εμβέλειας και η διάρκεια ζωής της είναι μεγαλύτερη από αυτή της ανώνυμης
    -- συνάρτησης, η Lua δημιουργεί ένα κλείσιμο.
    return x + y
  end
end
plustwo = 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].
    return name[n]
  end
})

Επέκταση και αντιστοίχιση 
Είναι δυνατό να γραφτούν επεκτάσεις χρησιμοποιώντας το API της Lua. Οι επεκτάσεις αυτές είναι δυναμικά συνδεδεμένα αντικείμενα που μπορούν να χρησιμοποιηθούν για να επεκτείνουν τη λειτουργικότητα του διερμηνέα παρέχοντας δυνατότητες χαμηλού επιπέδου της πλατφόρμας στα σενάρια σε Lua. Από την πλευρά της Lua, μια τέτοια επέκταση εμφανίζεται σαν ένας πίνακας-χώρος ονομάτων (namespace) που κρατά τις συναρτήσεις και τις μεταβλητές. Τα σενάρια Lua μπορούν να φορτώνουν επεκτάσεις χρησιμοποιώντας την εντολή require.

Μια ολοένα και αυξανόμενη συλλογή από επεκτάσεις (rocks) είναι διαθέσιμη μέσα από το σύστημα διαχείρισης πακέτων LuaRocks,, σε αντιστοιχία με το RubyGems. Άλλες πηγές είναι το LuaForge και ο κατάλογος Lua Addons του wiki στη σελίδα lua-users.org.

Έτοιμα πακέτα αντιστοίχισης με τη Lua υπάρχουν για τις πιο πολλές γνωστές γλώσσες προγραμματισμού, περιλαμβάνοντας άλλες γλώσσες σεναρίων.
Για τις C/C++, υπάρχουν κάποιες προσεγγίσεις βασισμένες σε πρότυπα και κάποια αυτόματα εργαλεία παραγωγής όπως το tolua, το tolua++, το SWIG, το Luabind, το LuaPlus και το Luna.

Βιντεοπαιχνίδια 

Στην ανάπτυξη βιντεοπαιχνιδιών η Lua χρησιμοποιείται αρκετά σαν γλώσσα σεναρίων από τους προγραμματιστές.

Οι ακόλουθες μηχανές παιχνιδιών μπορούν να εκτελέσουν σενάρια σε Lua:
 Diesel
 Enigma
 GrimE
 Silent Storm
 Spring
 Leadwerks

Ένα πλήθος παιχνιδιών χρησιμοποιούν Lua, μεταξύ αυτών:

Πλαίσια Ανάπτυξης για το Web (Web Frameworks) 
Πλαίσια ανάπτυξης εφαρμογών για το Web σε Lua περιλαμβάνουν μεταξύ άλλων τα εξής:
 Kepler
 Orbit

Άλλες εφαρμογές 
Άλλες εφαρμογές της Lua περιλαμβάνουν:

 Η επέκταση 3DMLW χρησιμοποιεί σενάρια σε Lua για την κίνηση 3D και για το χειρισμό διάφορων γεγονότων.
 Το Adobe Photoshop Lightroom χρησιμοποιεί τη Lua για τη γραφική διεπιφάνεια χρήστη.
 Ο εξυπηρετητής Apache μπορεί να χρησιμοποιήσει Lua οπουδήποτε στη διαδικασία μιας αίτησης (από την έκδοση 2.3, μέσω της βασικής επέκτασης mod_lua).
 Ο διαχειριστής παραθύρων Awesome χρησιμοποιεί Lua για τα αρχεία ρυθμίσεών του.
 Η μηχανή γραφικών Cafu χρησιμοποιεί τη Lua σαν γλώσσα σεναρίων
 Το Computer Aided Resonance Assignment (CARA) - λογισμικό που χρησιμοποιείται στη φασματοσκοπία NMR - περιλαμβάνει τη Lua από την έκδοση 1.0 του 2003. Το CARA έχει ένα Ολοκληρωμένο περιβάλλον ανάπτυξης (bβασισμένο στο Scintilla) και μια εκτεταμένη βιβλιοθήκη για GUI (βασισμένη στην εργαλειοθήκη Qt).
 Το αστρονομικό πρόγραμμα Celestia μπορεί να επεκταθεί με Lua.
 Η Cisco χρησιμοποιεί τη Lua για να υλοποιεί τις δυναμικές πολιτικές πρόσβασης (Dynamic Access Policies) στο Adaptive Security Appliance.
 Το Conky system monitor μπορεί να επεκταθεί με Lua.
 Το Corona είναι ένα εμπορικό Κιτ Ανάπτυξης Λογισμικού (SDK) για τη συγγραφή εφαρμογών του λειτουργικού συστήματος του iPhone σε Lua.
 Το 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 για τα μικρά σενάρια που χρειάζεται σε διάφορα σημεία.
 Το MySQL Proxy μπορεί να ελεγχθεί μέσω της Lua.
 Το Multimedia Fusion Developer 2 έχει μια επέκταση για Lua που επιτρέπει σε παιχνίδια και εφαρμογές που έχουν δημιουργηθεί με αυτό να εκτελούν σενάρια σε Lua.
 Ο σαρωτής ασφάλειας δικτύων nmap χρησιμοποιεί τη Lua σαν βάση για τη δική του γλώσσα σεναρίων, την nse.
 Το GSM firmware της Wavecom Open 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.

Υποσημειώσεις

Περαιτέρω διάβασμα 
 
  (Η 1η έκδοση είναι διαθέσιμη)
 
 
 
 
 Lua papers and theses

Εξωτερικοί σύνδεσμοι 

 Lua.org — η επίσημη σελίδα.
 lua-users.org — διαδικτυακή κοινότητα από και για χρήστες της Lua.
 A Look at Lua — Περίληψη της γλώσσας στο Linux Journal 
 An Introduction to Lua — GameDev.net 
 Embeddable scripting with Lua — ανάπτυξη ενσωματωμένων σεναρίων, IBM developerWorks 
 

Γλώσσες προγραμματισμού σεναρίων
Διαδικαστικές γλώσσες προγραμματισμού
Δυναμικές γλώσσες προγραμματισμού
Ελεύθερο λογισμικό