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" γράφεται ως εξής: Σχόλια: Η factorial (παραγοντικό) είναι ένα παράδειγμα αναδρομικής συνάρτησης: Μια δεύτερη μορφή της συνάρτησης "παραγοντικό" προέρχεται από τη βραχυκυκλωμένη αποτίμηση των τελεστών αλήθειας στη Lua, με βάση την οποία η Lua επιστρέφει την τιμή του τελευταίου τελεστή που αποτιμήθηκε σε μια έκφραση: Ο χειρισμός των συναρτήσεων από τη Lua σαν τιμές πρώτης τάξης φαίνεται στο επόμενο παράδειγμα, που τροποποιεί τη συμπεριφορά της συνάρτησης print: Οι επόμενες κλήσεις στην ‘print’ θα οδηγηθούν τώρα στη νέα συνάρτηση και, χάρη στην εμβέλεια της Lua, η παλιά συνάρτηση είναι προσβάσιμη μόνο μέσα από τη νέα, τροποποιημένη συνάρτηση. Η Lua επίσης υποστηρίζει κλεισίματα, όπως φαίνεται παρακάτω: Ένα νέο κλείσιμο για τη μεταβλητή x δημιουργείται κάθε φορά που καλείται η makeaddfunc, ώστε η ανώνυμη συνάρτηση που επιστρέφεται να έχει πάντα πρόσβαση στη δική της παράμετρο x. Η διαχείριση του κλείσιμου γίνεται από τη συλλογή απορριμμάτων της Lua, όπως κάθε άλλο αντικείμενο. Η επεκτάσιμη σημασιολογία είναι βασικό χαρακτηριστικό της Lua, και η ιδέα του “μεταπίνακα” (“metatable”) επιστρέφει στους πίνακες της Lua να διαμορφώνονται με ισχυρούς και μοναδικούς τρόπους. Το επόμενο παράδειγμα δείχνει έναν “άπειρο” πίνακα. Για κάθε n {\displaystyle n} , η fibs[n] επιστρέφει τον n {\displaystyle n} -οστό αριθμό Fibonacci χρησιμοποιώντας δυναμικό προγραμματισμό και memoization. Είναι δυνατό να γραφτούν επεκτάσεις χρησιμοποιώντας το 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 σε 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. Ierusalimschy, R.; Figueiredo, L. H.; Celes, W. (2006), Lua 5.1 Reference Manual, Lua.org, ISBN 85-903798-3-3, http://www.lua.org/manual/5.1/ Ierusalimschy, R. (2006), Programming in Lua (2nd έκδοση), Lua.org, ISBN 85-903798-2-5, http://www.inf.puc-rio.br/~roberto/pil2/ (Η 1η έκδοση είναι διαθέσιμη) Figueiredo, L. H.; Celes, W.; Ierusalimschy, R., επιμ.. (2008), Lua Programming Gems, Lua.org, ISBN 978-85-903798-4-3, http://www.lua.org/gems/ Gutschmidt, T. (2003), Game Programming with Python, Lua, and Ruby, Course Technology PTR, ISBN 1592000770 Schuytema, P.; Manyen, M. (2005), Game Development with Lua, Charles River Media, ISBN 1-58450-404-8 Jung, K.; Brown, A. (2007), Beginning Lua Programming, Wrox, ISBN 0-470-06917-1, http://www.wrox.com/WileyCDA/WroxTitle/productCd-0470069171.html, ανακτήθηκε στις 2010-03-15 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 (Αγγλικά) Lua στο Curlie