Lua
| Lua | |
|
|
|
| Apparu en | 1993 |
|---|---|
| Auteur | Luiz Henrique de Figueiredo, Roberto Ierusalimschy et Waldemar Celes |
| Paradigme | Multi-paradigme : procédural, orienté objet à prototype et fonctionnel |
| Typage | dynamique, faible |
| Influencé par | BASIC, C, C++ |
| A influencé | Micro Lua DS |
| Implémentations | Lua, LuaJIT, LLVM-Lua, LuaCLR, Nua, Lua Alchemy, MicroLua, Mochalua, Jill, luaj |
| Système d'exploitation | Multiplate-forme |
| Licence | Licence MIT |
| Site web | lua.org |
| modifier |
|
Lua est un langage de script libre, réflexif et impératif.
Créé en 1993, il est conçu de manière à pouvoir être embarqué au sein d'autres applications afin d'étendre celles-ci, comme en témoigne la compacité de son interpréteur (95 à 185 ko pour la version 5.0.2, selon le compilateur utilisé et le système cible). Lua (qui signifie « Lune » en portugais) a été développé par Luiz Henrique de Figueiredo, Roberto Ierusalimschy (en) et Waldemar Celes, membres du groupe de recherche TeCGraf, de l'université pontificale catholique de Rio de Janeiro au Brésil.
Lua est écrit en langage C ANSI strict, et de ce fait est compilable sur une grande variété de systèmes. Il est souvent utilisé dans des systèmes embarqués[réf. souhaitée] où sa compacité est très appréciée. Il profite de la compatibilité que possède le langage C avec un grand nombre de langages pour s'intégrer facilement dans la plupart des projets.
Il est particulièrement apprécié pour le développement de jeux vidéo comme pour l'interface du jeu World of Warcraft de Blizzard Entertainment, Garry's Mod ou encore Far Cry de Crytek Studios, SimCity 4 et dans Natural Selection 2 de Unknown Worlds Entertainment qui a entre autres développé Decoda, un IDE pour Lua. Lua a été porté dernièrement sur la console portable de Sony, la PSP. Une version Playstation 2 est en cours de portage. Ce langage est également utilisé pour la programmation de jeux de Nintendo DS, pour la programmation Roblox et récemment pour la TI-Nspire avec l'OS 3.0 ou ultérieur.
Sommaire |
Généralités [modifier]
Commentaires [modifier]
En Lua, les commentaires débutent par -- et finissent à la fin de la ligne. Si la première ligne commence par #! (shebang) elle est aussi traitée comme un commentaire.
Les commentaires multilignes sont également disponibles avec la syntaxe
--[[...]]
Variables [modifier]
Les variables peuvent contenir nil (la valeur nulle, vide), un booléen, une chaîne de caractères, un nombre, une table ou une fonction. Il existe aussi d'autres types comme userdata ou thread moins souvent rencontrés. Le type userdata est très pratique, il correspond à un objet C/C++ défini par l'utilisateur : il est donc possible de créer une structure C ou une classe C++, et d'utiliser des objets de ce type dans un script Lua, après avoir attaché à cet objet une métatable qui se charge d'appeler les fonctions de la classe C++. On peut donc imaginer de créer les classes métier de base d'un programme en C, et coder l'application elle-même en Lua, ce qui accélère considérablement son développement grâce aux outils de haut niveau fournis par le langage.
Par défaut, lorsqu'on déclare une variable, elle est globale à tout l'environnement d'exécution, sauf si elle est précédée du mot-clef local.
Les chaînes de caractères sont délimitées par des guillemets simples (') ou doubles ("), voire la marque de chaîne littérale
[[...]]
(multiligne, pas de caractère spécial).
L'opérateur de concaténation de chaînes se représente par deux points (..).
Les fonctions [modifier]
Les fonctions sont considérées comme des variables. Cela apporte une grande flexibilité : il est par exemple possible de créer des fonctions locales à une autre fonction, de passer une fonction comme paramètre d'une autre fonction (ou comme valeur de retour) ou de mettre des fonctions dans des tables. Si on affecte nil à une fonction (eg. print = nil), la fonction n'existe plus, n'est plus appelable.
Un avantage des fonctions en Lua est qu'elles peuvent prendre un nombre indéfini de paramètres mais surtout elles peuvent retourner plusieurs valeurs.
Les tables, métatables [modifier]
Les tables sont une structure Lua qui permet de stocker des variables indexées par une clef (comme en PHP par exemple). Les tables servent à beaucoup de choses en Lua, c'est par exemple la structure utilisée pour représenter des pseudo-classes et objets.
Les métatables sont des tables pour lesquelles on a associé une fonction à chaque opérateur de base (+, -, (), [], ...). Ce mécanisme est très proche de la redéfinition des opérateurs en C++. Par exemple, si la variable x contient une table associée à une métatable appropriée, l'appel de fonction x(arguments) sera valide car Lua cherchera alors dans la métatable comment traiter cet appel.
C'est ainsi qu'on peut implémenter l'héritage entre tables. Si un champ n'est pas trouvé lorsqu'il est demandé, Lua cherchera dans la métatable quelle table est parente et demandera à la table parente de fournir l'élément approprié.
Exemples [modifier]
Condition [modifier]
if condition1 and condition2 then -- instructions exécutées si les conditions 1 et 2 sont vraies elseif condition1 then -- instructions exécutées si la condition 1 est vraie elseif condition2 then -- instructions exécutées si la condition 2 est vraie et la condition 1 est fausse else -- instructions exécutées si les deux conditions sont fausses end
Boucles [modifier]
repeat -- code until condition
et
while condition do -- code end
ainsi que
for var = start, valend, step do -- code end
ou
for var_1, ..., var_n in explist do -- code end
Déclaration de fonctions [modifier]
function mafonction(arg1, arg2, ...) -- code return résultat1, résultat2 end
-- ou --
mafonction = function (arg1, arg2, ...) -- code return résultat1, résultat2 end
Appels de fonction [modifier]
res1, res2 = mafonction(var)
Blocs inconditionnels [modifier]
Les blocs inconditionnels servent par exemple à déclarer des variables locales à ce bloc :
do local mavariable = "chaîne" -- déclaration de variable, optionnel -- code utilisant mavariable end
Déclaration de table [modifier]
Table à indices numériques croissant (premier indice : 1)
a = { 5, "foo", [[C:\Lua\Lua.exe]], 'bar', 42 }
Table à indices textuels -- les clés ayant la syntaxe d'une variable n'ont pas besoin d'être entre guillemets
a = { d = 5, s = "foo", ['chaîne avec espace'] = true }
Table stockant des variables complexes : autres tables, fonctions, références croisées...
fonction = function (a, b) return (a + b) / a * b end t = { b = { -- Fonction comme clé [fonction] = 'Fonction !', -- Index numérique [5] = 42, -- Index chaîne simple (ie. syntaxe d'une variable) ls = [[Valeur Multiligne]] , -- Index chaîne quelconque [Expression rationnelle] = [[(?:\d{1,3}\.){3}\d{1,3}]], [ [[C:\Lua\Lua.exe]] ] = true, }, -- Stockage d'une fonction f = function () return math.random(100) end, ff = fonction, -- Table comme clé [ { 'a', 'b' } ] = { "aa", "bb" }, } -- Référence dans la table t.reference = t.a t[ { t.a, t.b } ] = t.f
Hello World (sur PSP avec LuaPlayer HM) [modifier]
red = Color.new(255, 0, 0) -- déclaration de la couleur rouge while true do -- commencement de la boucle screen:clear() -- on efface l'écran screen:print(0, 0, "Hello World", red) -- on affiche le texte "Hello World" en position {0;0} screen.waitVblankStart() -- on attend l'instruction suivante (dans ce cas-là on laisse afficher le texte indéfiniment) screen.flip() -- on actualise l'écran end -- fin de la boucle
Exemple de fonction (sur PSP avec LuaPlayer HM) [modifier]
-- Exemple de vérification d'identité d'un fichier function sceCheckImgFile() function sceErrorImgFile() System.message(" Demarrage du jeu impossible ", 0) System.Quit() end if not System.doesFileExist("img/lua.jpg") then -- vérification de la présence du fichier a vérifier sceErrorImgFile() else md5 = (System.md5sum(io.input("img/lua.jpg"):read())) -- calcul du MD5 du fichier if md5 ~= "8487f9e0e6ad3e928d1455b0df3d9442" then -- vérification du MD5 sceErrorImgFile() else fichier = 'ok' end end end
Exemple de script (sur Garry's mod) [modifier]
-- [[Exemple de création du base de donnée en TXT pour VIPs --]] local meta = FindMetaTable( "Player" ) if not file.Exists( "vipDB.txt" ) then // Si le fichier vipDB.txt n existe pas, alors on le crée et y on ajoute le texte file.Write( "vipDB.txt", "STEAM_0:1:20593126" ) // Steam ID du codeur, par exemple end function meta:IsVIP( ) // Raccourcis pour utiliser plus tard Player:IsVIP , avec en sortie TRUE ou FALSE if not ValidEntity( self ) then return end if self:IsAdmin( ) then return true end if self:SteamID( ) == "STEAM_0:1:20593126" then return true end if string.find( file.Read( "vipDB.txt" ), self:SteamID( ) ) then return true end // Si on trouve le steamID du joueur dans vipDB.txt alors return true return false end
Usages [modifier]
Lua a été embarqué dans la Sony Playstation Portable, grâce au programme Lua Player, et plus récemment Lua Player HM et Lua Player Euphoria qui permettent de lire des applications écrites avec Lua afin d'étendre les capacités de la console. Viendra plus tard l'XtreamLua Player, dédié à la création de jeux-vidéo. Une modification (non officielle) du micrologiciel de la PSP permettait de lancer des programmes non-signés par Sony d'où la création d'un interpréteur Lua adapté pour la PSP.
Lua Player Euphoria reprend la syntaxe du Lua Player original et exécute le script à une vitesse fulgurante comparé au Lua Player HM. Cependant, Lua Player Euphoria est moins complet que son homologue plus ancien.
À noter que le Lua est également utilisé à présent pour l'extension des capacités du lecteur multimédia VLC dans le domaine de la gestion des playlists (voir liens externes).
Lua est aussi utilisé dans l'EFL Edje d'Enlightenment.
Lua est utilisé comme langage de configuration et de script dans le gestionnaire de fenêtre Awesome.
Minetest, un clone de Minecraft sous licence LGPL, utilise Lua comme langage pour l'écriture d'extensions.
ComputerCraft, un mod de Minecraft, utilise Lua pour programmer des "robots" autonomes à l'intérieur du jeu, permettant d'automatiser de nombreuses tâches répétitives.
Il existe également un moteur de jeu utilisant Lua comme langage de programmation (une sorte de Pygame pour lua) : LÖVE.
Garry's Mod, un jeu de sandbox très connu et unique en son genre utilise le Lua pour y intégrer des extensions appelées 'Addon'.
Roblox, un autre jeu de sandbox très connu, les joueurs sont libres de construire n'importe quoi et peuvent créer des scripts Lua pour améliorer leurs jeux.
Le PABX Asterisk propose Lua comme alternative pour étendre son plan de numérotation.
Wikipedia a un projet pour permettre l'emploi de Lua comme langage de script, en particulier au sein des modèles[1].
Le logiciel CraftStudio utilise Lua pour programmer les éléments dynamiques des models.
Notes et références [modifier]
- Voir : Page de projet
Annexes [modifier]
Article connexe [modifier]
Bibliographie [modifier]
- (en) Roberto Ierusalimschy, Luiz Henrique de Figueiredo et Waldemar Celes, Lua 5.1 Reference Manual, 2006 (ISBN 85-903798-3-3) [lire en ligne]
- (en) Roberto Ierusalimschy, Programming in Lua, 2006 (ISBN 85-903798-2-5) [lire en ligne]
- (en) collectif, Lua Programming Gems, 2008 (ISBN 85-903798-4-3) [lire en ligne]
- Cyril Doillon, Sylvain Fabre, Philippe Lhoste et Patrick Rapin, Le guide de Lua et ses applications, 2012 (ISBN 9782822700054)
Liens externes [modifier]
- (en) Site officiel
- (en) Lua Development Tools
- (en) Catégorie Lua de l'annuaire Dmoz
- (en) Lua embarqué
- (fr) Introduction à la programmation avec Lua