ART


αγγλικά : Lua
γαλλικά : Lua
γερμανικά : 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 να διαμορφώνονται με ισχυρούς και μοναδικούς τρόπους. Το επόμενο παράδειγμα δείχνει έναν “άπειρο” πίνακα. Για κάθε n {\displaystyle n} n, η fibs[n] επιστρέφει τον n {\displaystyle n} 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,[1], σε αντίστοιχία με το RubyGems. Άλλες πηγές είναι το LuaForge και ο κατάλογος Lua Addons του wiki στη σελίδα lua-users.org.[2]

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

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

Οι ακόλουθες μηχανές παιχνιδιών μπορούν να εκτελέσουν σενάρια σε Lua:

Diesel
Enigma
GrimE
Silent Storm
Spring
Leadwerks

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

Aquaria
Baldur's Gate
The Battle for Wesnoth
Blitzkrieg
Buzz!
BZFlag
Company of Heroes
Cortex Command
Crysis
Demigod
Digital Combat Simulator
Empire: Total War
Escape from Monkey Island
Etherlords series
Evil Islands: Curse of the Lost Soul
Fable II
Far Cry
FlatOut
FlatOut 2
Fortress Forever
Freeciv
Garry's Mod
Grim Fandango
The Guild 2
Tom Clancy's H.A.W.X
Hearts of Iron III
Hearts of Iron IV

Heroes of Might and Magic V

Homeworld 2
Impossible Creatures
User:Jeremjay24/Roblox
King's Bounty: The Legend
Linley's Dungeon Crawl
Lock On: Modern Air Combat
Marathon total conversions
MDK2
Metaplace
Monopoly Tycoon
Multi Theft Auto
Natural Selection 2
Operation Flashpoint: Dragon Rising
Painkiller
PlayStation Home
Psychonauts
ROSE Online
Ragnarok Online
Rail Simulator
RailWorks
Ratchet & Clank Future: Tools of Destruction
Richard Burns Rally
RigidChips
Roblox
Room for PlayStation Portable
Runes of Magic
S.T.A.L.K.E.R.: Shadow of Chernobyl

Ryzom
Saints Row 2
Silent Storm
Singles: Flirt Up Your Life
SpellForce
Star Wars: Battlefront
Star Wars: Battlefront II
Star Wars: Empire at War
Star Wars: Empire at War: Forces of Corruption
Star Wolves
StepMania
Stratagus
Supreme Commander
Supreme Commander: Forged Alliance
Tales of Pirates
There
Toribash
Universe at War: Earth Assault
Vendetta Online
Warhammer 40,000: Dawn of War
Warhammer 40,000: Dawn of War II
Warhammer Online: Age of Reckoning
The Witcher
World of Warcraft
Worms Armageddon

Πλαίσια Ανάπτυξης για το Web (Web Frameworks)

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

Kepler[5]
Orbit[6]

Άλλες εφαρμογές

Άλλες εφαρμογές της 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.

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

«LuaRocks». LuaRocks wiki. Ανακτήθηκε στις 24 Μαΐου 2009.
«Lua Addons». Lua-users wiki. Ανακτήθηκε στις 24 Μαΐου 2009.
«Αντιστοίχιση Κώδικα σε Lua». Lua-users wiki. Ανακτήθηκε στις 24 Μαΐου 2009.
«toLua++ - binding c/c++ code to lua». Αρχειοθετήθηκε από το πρωτότυπο στις 24 Μαΐου 2013. Ανακτήθηκε στις 20 Μαΐου 2009.
«Kepler Project». Ανακτήθηκε στις 30 Νοεμβρίου 2009.

«Orbit: MVC for Lua Web Development». Ανακτήθηκε στις 30 Νοεμβρίου 2009.

Περαιτέρω διάβασμα

Ierusalimschy, R.; Figueiredo, L. H.; Celes, W. (2006), Lua 5.1 Reference Manual, Lua.org, ISBN 85-903798-3-3
Ierusalimschy, R. (2006), Programming in Lua (2nd έκδοση), Lua.org, ISBN 85-903798-2-5 (Η 1η έκδοση είναι διαθέσιμη)
Figueiredo, L. H.; Celes, W.; Ierusalimschy, R., επιμ.. (2008), Lua Programming Gems, Lua.org, ISBN 978-85-903798-4-3
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
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 στο DMOZ

Ελεύθερο λογισμικό και λογισμικό ανοικτού κώδικα
Γενικά
Copyleft · Γεγονότα και βραβεία · Ελεύθερο λογισμικό · Ορισμός του Ελεύθερου Λογισμικού · Δωρεάν και ελεύθερο · Κατάλογος ελεύθερου λογισμικού και λογισμικού ανοιχτού κώδικα · Λογισμικό ανοικτού κώδικα
Λειτουργικά συστήματα
AROS · BSD · Darwin · eCos · FreeDOS · GNU · Haiku · Inferno · Linux · Mach · MINIX · OpenSolaris · Plan 9 · ReactOS · Symbian
Ανάπτυξη λογισμικού
Eclipse · Free Pascal · GCC · Gambas · Java · LLVM · Lua · NetBeans · Open64 · Perl · PHP · Python · ROSE · Ruby · Tcl
Ιστορία
GNU ·Haiku ·Linux · Mozilla (Application Suite · Firefox · Thunderbird)
Οργανισμοί
Apache Software Foundation · Ίδρυμα Blender · Eclipse Foundation · freedesktop.org · Ίδρυμα Ελεύθερου Λογισμικού (Ευρώπη · India ·Latin America) · FSMI ·GNOME Foundation · GNU Project · Google Code ·KDE e.V. · Linux Foundation · Mozilla Foundation · Open Source Geospatial Foundation · Open Source Initiative · Python Software Foundation - Software Freedom Conservancy · SourceForge · Symbian Foundation · The Document Foundation · Xiph.Org Foundation · XMPP Standards Foundation · X.Org Foundation
Άδειες ελεύθερου λογισμικού
Apache · Artistic · BSD · GNU GPL · GNU LGPL · ISC · MIT · MPL · Ms-PL/RL · zlib · FSF approved licenses
Πρότυπα αδειών λογισμικού
Ορισμός του Λογισμικού Ανοιχτού Κώδικα · Ορισμός του Ελεύθερου Λογισμικού · Debian Free Software Guidelines
Σημαντικά θέματα
Binary blob · Canonical's contributor agreement · Digital rights management · Συμβατότητα καρτών γραφικών · License proliferation · Mozilla software rebranding · Proprietary software · Διαμάχη SCO-Linux · Ασφάλεια · Πατέντες λογισμικού · Περιορισμοί υλικού · Trusted Computing · Viral license
Άλλα θέματα
Εναλλακτικοί όροι · Κοινότητα · Διανομή Linux · Forking · Κίνημα · Microsoft Open Specification Promise · Revolution OS · Σύγκριση με λογισμικό κλειστού κώδικα

Εγκυκλοπαίδεια Πληροφορικής

Κόσμος

Αλφαβητικός κατάλογος

Hellenica World - Scientific Library

Από τη ελληνική Βικιπαίδεια http://el.wikipedia.org . Όλα τα κείμενα είναι διαθέσιμα υπό την GNU Free Documentation License