Lua

Un article de Wikipédia, l'encyclopédie libre.
Sauter à la navigation Sauter à la recherche
Page d'aide sur l'homonymie Pour les articles homonymes, voir Lua (homonymie).

Lua
Logo.

Date de première version 1993
Paradigme Multi-paradigme : procédural, orienté objet à prototype et fonctionnel
Auteur Luiz Henrique de Figueiredo, Roberto Ierusalimschy et Waldemar Celes
Dernière version 5.3.5 ()[1]Voir et modifier les données sur Wikidata
Version en développement 5.4.0-work2 ()[2]Voir et modifier les données sur Wikidata
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
Écrit en CVoir et modifier les données sur Wikidata
Système d'exploitation Multiplate-forme
Licence Licence MIT
Site web lua.org
Extension de fichier lua, luna, lunaire et anairVoir et modifier les données sur Wikidata

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. Lua (du portugais : Lua [ˈlu.ɐ], au Brésil : [ˈlu.a], signifiant « Lune »[3]) 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.

L'interpréteur Lua est écrit en langage C ANSI strict, et de ce fait est compilable sur une grande variété de systèmes. Il est également très compact, la version 5.0.2 n'occupant que 95 ko à 185 ko selon le compilateur utilisé et le système cible. Il est souvent utilisé dans des systèmes embarqués tels qu'OpenWrt[4] où cette 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 l'embarqué, le développement réseau et les jeux vidéo.

Le Lua est utilisé dans des jeux vidéo comme : Transformice, World Of Warcraft (addons), roblox, garrysmod, computercraft mod., Multi Theft Auto (mod multijoueur de GTA: San Andreas), ainsi que les moteurs de jeu vidéo tels que CryENGINE, LÖVE, ou encore les Fantasy consoles.

Il est également utilisé au niveau réseau comme hook sur Apache, Lighttpd (par défaut), Nginx (via OpenResty), dans les routeurs Cisco, dans l'analyseur de paquets Wireshark, l'antispam Rspamd, l'autocommutateur téléphonique privé Asterisk (optionnel), pour les scripts de MediaWiki.

Généralités[modifier | modifier le code]

Commentaires[modifier | modifier le code]

En Lua, les commentaires débutent par -- et finissent à la fin de la ligne, comme en Ada. 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 | modifier le code]

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 | modifier le code]

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 aussi qu'elles peuvent retourner plusieurs valeurs.

Les tables, métatables[modifier | modifier le code]

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 | modifier le code]

Condition[modifier | modifier le code]

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 et la condition 2 est fausse
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 | modifier le code]

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 | modifier le code]

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 | modifier le code]

res1, res2 = mafonction(var)

Blocs inconditionnels[modifier | modifier le code]

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 | modifier le code]

Table à indices numériques consécutifs (En Lua, le premier indice d'une table est 1)

a = { 5, "foo", [[C:\Lua\Lua.exe]], 'bar', 42 }

Table à indices explicites, indiqués entre crochets (les indices qui sont des chaines ayant la syntaxe d'une variable n'ont pas besoin de guillemets ni de crochets)

a = { d = 5, [12] = "foo", ['chaîne avec espace'] = true }

Quand on assigne une variable a une autre, si la valeur de celle-ci n'est pas un nombre, une chaine de caractères ou un booléen alors la référence de celle-ci est copiée. Donc, dans le cas des tables, si une variable a possède une table et qu'on assigne à la variable b la variable a alors toutes modifications subies par a seront directement visibles sur b

local a = {1,"b",3}
local b = a
a.foo = "bar"
print(b.foo) -- bar
-- b et a on les mêmes références

Table stockant des variables complexes : autres tables, fonctions, références croisées... Lorsque les valeurs en tant qu'indice ne sont pas des nombres, des chaines de caractères ou des booléens, alors l'indice sera la référence de la variable en question.

 fonction = function (a, b) return (a + b) / a * b end
t =
{
	b =
	{
		-- Fonction comme clé
		-- La référence de la fonction agira 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é
	-- La table étant anonyme, aucune référence a cette table est stockée et donc la valeur stockée inaccessible
	[ { 'a', 'b' } ] = { "aa", "bb" },
}
-- Référence dans la table
t.reference = t.a
t.self = t -- Référence a soi même
t.self.réference = t.a
print(t[ { t.a, t.b } ]) -- nil car aucune valeur à pour clé la référence de cette nouvelle table, l'ancienne table à une référence différente

Hello World[modifier | modifier le code]

print('Hello World!')

Usages[modifier | modifier le code]

2017-fr.wp-orange-source.svg
Cette section ne cite pas suffisamment ses sources (octobre 2016)
Pour l'améliorer, ajoutez des références vérifiables [comment faire ?] ou le modèle {{Référence nécessaire}} sur les passages nécessitant une source.

Consoles[modifier | modifier le code]

Lua a été embarqué dans la PlayStation Portable de Sony, 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, destiné à 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.

Lua Player One, un des derniers Lua Player mis à jour pour PSP, est un Lua Player développé au sein d'une communauté de développeurs espagnols ; il permet, entre autres, de gérer la 3D sur PSP. Un jeu de mini-golf dans l'espace a été développé à l'aide de cet outil.

Lua Player Plus (LPP) est sorti sur PlayStation Vita le 16 août 2015. Ce Lua Player permet de créer des jeux pour la console.

Lua est inclus dans la console de poche open-source Pocket Chip (projet Kickstater). En effet cette dernière embarque le programme de console virtuel Pico-8 qui permet de jouer et de créer des jeux en Lua.

Extensions de jeux vidéo[modifier | modifier le code]

Lua est également utilisé pour l'extension des capacités du lecteur multimédia VLC, dans les gestionnaires de fenêtres EFL Edje d'Enlightenment ainsi que Awesome (comme langage de configuration et de script).

Parmi les jeux vidéo de bac à sable qui l'utilisent figurent Garry's Mod, Roblox et Minecraft. Pour ce dernier, ComputerCraft[5], une extension du jeu Minecraft, utilise Lua pour concevoir des programmes graphiques ou consoles et des « robots » autonomes à l'intérieur du jeu, permettant d'automatiser de nombreuses tâches répétitives ; Minetest, un clone du jeu sous licence LGPL, utilise Lua comme langage pour l'écriture d'extensions.

Il existe également un moteur de jeu utilisant Lua comme langage de programmation (une sorte de Pygame pour Lua) : LÖVE.

Beaucoup d'autres jeux vidéo l'utilisent, comme World of Warcraft de Blizzard Entertainment, Far Cry (et le moteur CryEngine en général) de Crytek Studios, le logiciel multijoueurs de GTA:SA Multi Theft Auto, SimCity 4 et Natural Selection 2 de Unknown Worlds Entertainment (qui a entre autres développé Decoda, un IDE pour Lua). Enfin, certains scripts de Zoo Tycoon 2 (Blue Fang Games) sont également présents sous des forme non compilée dans les fichiers du jeu. The Binding of Isaac : Afterbirth+ est un DLC pour le jeu The Binding of Isaac : Rebirth qui permet le support de mods écrits en Lua[6].

Autres logiciels[modifier | modifier le code]

Le PABX Asterisk propose Lua comme alternative pour étendre son plan de numérotation.

MediaWiki et les sites Wikimedia utilisent Lua comme langage de script pour les modèles (appelés modules)[7].

Le logiciel CraftStudio utilise Lua pour programmer les éléments dynamiques des modèles.

Le logiciel libre d'interface neuronale directe OpenVibE (en) utilise Lua comme langage de script, en particulier pour la gestion de stimuli pour les expériences de neuroscience.

Le robot IRC irccd[8] utilise Lua pour la création de plugins.

L'antispam Rspamd utilise également Lua pour son interface de programmation[9].

Lua est le langage de scripting principalement utilisé pour le système d'exploitation embarqué OpenWrt fonctionnant sur de nombreux routeurs. L'interface graphique d'administration LuCI est entièrement écrite en Lua.

Lua est le langage natif de Domoticz, logiciel de domotique open source. Il permet le scripting avec des fonctionnalités avancées : Domoticz déclenche automatiquement ces scripts sur les changements d’états, en fonction du temps, etc.

Lua est également le langage natif de NSBase, logiciel de gestion de bases données. Le scripting permet de dynamiser les formulaires, rapports. Lua ainsi intégré permet de créer de véritables applications de gestion de bases de données.

Le logiciel de simulation de vol spatial Orbiter et ses add-ons (UCGO, UMmu) utilisent Lua pour permettre la création aisée d'écrans de contrôle (MFD - Multi Function Display), de missions ou de vaisseaux. La création de vaisseaux, en particulier, à la différence de modules DLL, ne nécessite pas la compilation d'un fichier C++.

BeamNG.drive[10] utilise Lua pour compléter ses équations physiques.

Prosody : serveur XMPP léger écrit entièrement en lua.

L'environnement de bureau Awesome (linux) utilise aussi Lua dans ses fichiers de configuration depuis sa version 3.

Notes et références[modifier | modifier le code]

  1. « Lua: version history »
  2. « Work area »
  3. (en) « About », sur lua.org
  4. luci: LuCI - OpenWrt Configuration Interface, openwrt, (lire en ligne).
  5. Site l'extension ComputerCraft.
  6. « TYRONE! NOT AGAIN! », sur (consulté le 6 janvier 2017).
  7. Wikipedia Signpost, Lua chosen as new template scripting language, 30 janvier 2012 (Page de projet).
  8. (en) « IRC Client Daemon ».
  9. (en) « Rspamd Features — Unique features », sur rspamd.com.
  10. « BeamNG.drive » (consulté le 6 août 2016).

Annexes[modifier | modifier le code]

Sur les autres projets Wikimedia :

Bibliographie[modifier | modifier le code]

Articles connexes[modifier | modifier le code]

Liens externes[modifier | modifier le code]