Zum Inhalt springen

Lua: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
 
(22 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{inuse|[[Benutzer:Dirk|Dirk]] ([[Benutzer Diskussion:Dirk|Diskussion]])}}{{unvollständig}}
Lua ist eine sehr schnelle, leicht erlernbare, gut integrierbare, und durch Module sehr umfangreich erweiterbare Scriptsprache. Die offizielle Implementation ist in {{wikipedia|Varianten_der_Programmiersprache_C#C89,_C90|ANSI C}} geschrieben. Da sich Lua problemlos in andere Programme integrieren lässt, wird es häufig als Programmiersprache für Plugins und Mods, oder zur Konfiguration benutzt.
Lua ist eine sehr schnelle, leicht erlernbare, gut integrierbare, und durch Module sehr umfangreich erweiterbare Scriptsprache. Die offizielle Implementation ist in {{wikipedia|Varianten_der_Programmiersprache_C#C89,_C90|ANSI C}} geschrieben. Da sich Lua problemlos in andere Programme integrieren lässt, wird es häufig als Programmiersprache für Plugins und Mods, oder zur Konfiguration benutzt.


Zeile 12: Zeile 11:
Zusätzlich zur aktuellen Version sind noch die Versionen {{paket|lua51|5.1}}, {{paket|lua52|5.2}}, und {{paket|lua53|5.3}} als Pakete verfügbar. LuaJIT unterstützt alle Bibliotheksfunktionen und das komplette Set der Lua/C-API-Funktionen bis zu Version 5.1.
Zusätzlich zur aktuellen Version sind noch die Versionen {{paket|lua51|5.1}}, {{paket|lua52|5.2}}, und {{paket|lua53|5.3}} als Pakete verfügbar. LuaJIT unterstützt alle Bibliotheksfunktionen und das komplette Set der Lua/C-API-Funktionen bis zu Version 5.1.


== Funktionsweise ==
Lua besitzt einen eigenen Paketmanager namens Luarocks. {{installation|luarocks|noheading=1}}
Natürlich kann hier kein vollständiges Lua-Tutorial erfolgen. Es können daher lediglich einige Aspekte Beleuchtet werden, die eventuell für die Konfiguration von Programmen interessant sind. Es es sei für tiefer gehende Beschäftigung mit der Programmierung in Lua auf die Weblinks verwiesen.


=== Scripts ausführen ===
Zudem befinden sich sowohl in den [[Pacman#Repositorien|Repositorien]] als auch im [[AUR]] sehr viele Module für die Systemweite installation.
 
== Benutzung ==
Um ein alleinstehendes Lua-Script auszuführen, übergibt man dies einfach dem Interpreter.
Um ein alleinstehendes Lua-Script auszuführen, übergibt man dies einfach dem Interpreter.


Zeile 22: Zeile 22:
  luajit mein_script.lua
  luajit mein_script.lua


Zuerst wird das Script mit der aktuellen Version so ausgeführt, wie es ist. Danach wird das Script mit Version 5.2 des Lua-Interpreters ausgeführt, dabei werden auch parameter übergeben, auf die innerhalb des Scripts im Programmablauf zugegriffen werden kann. Am Schluss wird das Script an LuaJIT übergeben, dieses kompiliert das Script und führt es direkt aus.
Zuerst wird das Script mit der aktuellen Version so ausgeführt, wie es ist. Danach wird das Script mit Version 5.2 des Lua-Interpreters ausgeführt, dabei werden auch Parameter übergeben, auf die innerhalb des Scripts im Programmablauf zugegriffen werden kann. Am Schluss wird das Script an LuaJIT übergeben, dieses kompiliert das Script und führt es direkt aus.


Mittels der Parameterkombination {{ic|-be}} kann man sich den Bytecode anzeigen lassen. Mittels {{ic|luajit -bX script.lua script}} erstellt man eine Binary, die man dann mittels {{ic|luajit script}} ausführen kann. Bei sehr umfangreichen Scripts ist das Ausführen der Binary schneller.
Mittels der Parameterkombination {{ic|-be}} kann man sich den Bytecode anzeigen lassen. Mittels {{ic|luajit -bX script.lua script}} erstellt man eine Binary, die man dann mittels {{ic|luajit script}} ausführen kann. Bei sehr umfangreichen Scripts ist das Ausführen der Binary schneller.


Alternativ kann man den Interpreter wie von anderen Scriptsprachen gewöhnt auch am Anfang der Datei angeben.
Alternativ kann man den Interpreter wie von anderen Scriptsprachen gewohnt auch am Anfang der Datei angeben.


  #!/usr/bin/lua
  #!/usr/bin/lua
Zeile 32: Zeile 32:
  [hier der Code]
  [hier der Code]


Alle Beispiele hier im Wiki gehen davon aus, dass der Interpreter in der Datei angegeben wird – sofern nicht anderweitig beschrieben.
Bei Programmen die Lua-Unterstützung eingebaut haben kommt meist LuaJIT zum Einsatz, also Lua 5.1. Wie und von wo der Code geladen wird, ist abhängig von den Programmen.
 
=== Syntax ===
Die Lua-Syntax ist gezielt sehr minimalistisch gehalten.
 
==== Schlüsselwörter ====
Es gibt daher in Lua 5.4, der aktuellen Version zum Zeitpunkt der Erstellung des Artikels, nur 22 vordefinierte Schlüsselwörter (zur Einordnung Python hat 35, PHP 58, und C++ zum Beispiel hat 60 Schlüsselwörter).
 
and      break    do        else      elseif    end
false    for      function  goto      if        in
local    nil      not      or        repeat    return
then      true      until    while
 
Die Schlüsselwörter sind schreibungsabhängig. Das reservierte Schlüsselwort {{ic|or}} und ein anderweitig frei vergebenes oder genutztes {{ic|OR}} zum Beispiel sind zwei verschiedene Dinge. Es wird dazu geraten, Keine Namen (Variablen, Funktionen, etc.) zu verwenden, die mit einem Unterstrich beginnen, und nur aus Großbuchstaben bestehen ({{ic|_FOOBAR}}).
 
Lua verwendet bis auf den Doppelpunkt praktisch keine Zeichen zur Steuerung des Programmablaufs, jegliche Abläufe werden durch verschiedene Schlüsselwörter definiert.
 
==== Kommentare ====


Kommentare werden mittels {{ic|--}} eingeleitet, und gelten bis zum Ende der Zeile. Mehrzeilige Kommentare können mittels {{ic|--<nowiki>[[ ... ]]</nowiki>--}} umfasst werden.
== Beispielprogramm zur Syntaxpräsentation ==
 
Die Syntax von Lua ist präzise und bewusst einfach gehalten. Es gibt nur wenige Schlüsselwörter, und vieles kann in Kurzform geschrieben werden.
-- Ich bin ein Kommentar!
 
… bzw …
 
--[[
Ich bin ein …
… mehrzeiliger …
… Kommentar!
]]--
 
==== Typen ====
Bei Lua handelt es sich um eine dynamisch typisierte Sprache, das Bedeutet, dass der Typ einer Variable über dessen Wert bestimmt wird, und nicht vordefiniert werden kann, welchen Wert eine Variable annehmen soll. Insgesamt besitzt Lua lediglich 8 Datentypen. …
 
* {{ic|string}} -> Zeichenketten mit bis zu 2<sup>64</sup>-1 Zeichen
* {{ic|number}} -> Positive und Negative Integer, Fließkommazahlen, und Dezimalzahlen mit 64 Bit Länge
* {{ic|table}} -> Der einzige Datenstrukturiermechanismus in Lua, siehe Abschnitt [[#Tables|Tables]]
* {{ic|function}} -> In sich geschlossener ''Chunk'' mit Code, der „als ganzes“ ausgeführt werden kann
* {{ic|nil}} -> Zur Unterscheidung von allen anderen Datentypen (kein Wert, aber nicht ''leer'')
* {{ic|boolean}} -> Die Wahrheitswerte {{ic|true}} und {{ic|false}}
* {{ic|userdata}} -> Ein Block beliebiger roher C-Speicherdaten, der nicht durch Lua verändert werden kann
* {{ic|thread}} -> Repräsentationen von Co-Routinen (kollaboratives Multithreading), nicht Betriebssystemthreads
 
==== Variablen ====
Alle Datentypen in Lua können in Variablen gespeichert werden, durch Funktionen zurückgegeben werden, in Tables strukturiert werden, oder sonstwie innerhalb eines Sripts benutzt werden. Variablen können mittels {{ic|..}} verkettet werden.
 
Variablen sind standardmäßig global. Mittels des Keywords {{ic|local}} kann man sie auf den Chunk beschränken, in dem sie definiert sind.


{{hc|1=
{{hc|1=
bar = 'globale Variable'      -- Global definiert
local zahl = 745
local foo = 'lokale Variable'  -- Lokal definiert


-- In diesem Beispiel hier macht es keinen Unterschied: Beide Variablen werden ausgegeben.
-- Dies definiert einen Table. Tables sind am ehesten mit Arrays Vergleicbar
print(foo..'\n'..bar)
local foobar = {
|2=
  zahl,
lokale Variable
  'ein String',
globale Variable
  { 'weiterer Table' }
}}
}


Variablen können nach der initialen Definition jederzeit mittels {{ic|1=variablenname = 'neuer Wert'}} mit neuen Werten belegt werden, ihren Scope (lokal oder global) behalten sie dabei bei. Der Typ der Variable ändert sich je nach dem, was der Variablen als Wert zugewiesen wurde. mittels {{ic|type()}} kann man sich den Typen einer Variable ausgeben lassen.
print(string.format('Die Zahl %s ist %s', zahl, zahl%2 == 2 and 'gerade' or 'ungerade'))
if zahl > 100 then print('Die Zahl ist größer als 100') end


{{hc|1=
print('\n'..foobar[1])
local foobar = 6    -- Die Variable wird lokal definiert
print(foobar[3][1])
print(type(foobar))  -- Der Typ wird ausgegeben
foobar = 'Hallo'    -- Der Variablen wird ein neuer wert zugewiesen
print(type(foobar))  -- Es wird erneut der Typ ausgegeben
|2=
|2=
number
Die Zahl 745 ist ungerade
string
Die zahl ist größer als 100
}}
 
Es wird empfohlen, wenn möglich lokale Variablen zu benutzen. In einem Chunk definierte Variablen sind in Chunks die innerhalb dieses Chunks erstellt werden ebenfalls verfügbar.
 
==== Funktionen ====
Eine Funktion ist ein einer Variablen zugewiesener Chunk, der über den Variablennamen aufrufbar ist. In neueren Versionen von Lua gibt es „syntaktischen Zucker“, der die Funktionsdefinition hinter dem Schlüsselwort {{ic|function}} versteckt.
 
{{hc|1=
function sag_was (text)
    print(text)
end
 
local sag_was_anderes = function (text)
    print(text)
end


sag_was('Hallo')
745
sag_was_anderes('Tschüß')
weiterer Table
|2=
Hallo
Tschüß
}}
}}


Die beiden Definitionen sind technisch identisch. Beide definieren eine aufrufbare Funktion.
Das Programm macht verschiedene Dinge mit der angegebenen Zahl und dem Table und gibt die Ergebnisse aus. Für einen Kurzüberblick der auf einzelne Elemente etwas detaillierter Eingeht, sei auf die [[Lua/Syntax|Kurzübersicht über die Lua-Syntax]] hier im Wiki verwiesen.
 
==== Tables ====
 
=== Ein kleines Beispielprogramm ===
 
=== Module ===


== Implementationsbeispiele ==
== Implementationsbeispiele ==
Zeile 145: Zeile 73:
* Lua wird innerhalb von [[mpv]] als Scriptsprache benutzt
* Lua wird innerhalb von [[mpv]] als Scriptsprache benutzt


In der englsichen Wikipedia gibt es (sicherlich unvollständige) Listen von [https://en.wikipedia.org/wiki/List_of_applications_using_Lua Anwendungen] {{sprache|en}} und [https://en.wikipedia.org/wiki/Category:Lua_(programming_language)-scripted_video_games Spielen] {{sprache|en}} die auf die eine oder andere Art und Weise Lua nutzen.
In der englischen Wikipedia gibt es (sicherlich unvollständige) Listen von [https://en.wikipedia.org/wiki/List_of_applications_using_Lua Anwendungen] {{sprache|en}} und [https://en.wikipedia.org/wiki/Category:Lua_(programming_language)-scripted_video_games Spielen] {{sprache|en}} die auf die eine oder andere Art und Weise Lua nutzen.


== Siehe auch ==
== Siehe auch ==
* Der Lua-Paketmanager {{Paket|luarocks|Luarocks}}
* [[Lua/Syntax|Kurzübersicht über die Lua-Syntax]]
* Diverse Module [https://archlinux.org/packages/?&q=lua- in dem Repos] und [https://aur.archlinux.org/packages?K=lua- im AUR]
* Diverse Module [https://archlinux.org/packages/?&q=lua- in den Repos] und [https://aur.archlinux.org/packages?K=lua- im AUR]


== Weblinks ==
== Weblinks ==
* [https://www.lua.org/ Offizielle Website] {{sprache|en}}
* [https://www.lua.org/ Offizielle Website] {{sprache|en}}
* Das hervorragende [https://www.lua.org/manual/ Reference Manual] {{sprache|en}}
* [https://www.lua.org/manual/5.1/de/ Deutsche Anleitung für Lua 5.1] {{sprache|de}}
* [https://www.lua.org/manual/5.1/de/ Deutsche Anleitung für Lua 5.1] {{sprache|de}}


[[Kategorie:Programmiersprache]]
[[Kategorie:Programmiersprache]]
[[en:Lua]]
[[en:Lua]]

Aktuelle Version vom 14. März 2025, 15:14 Uhr

Lua ist eine sehr schnelle, leicht erlernbare, gut integrierbare, und durch Module sehr umfangreich erweiterbare Scriptsprache. Die offizielle Implementation ist in ANSI C geschrieben. Da sich Lua problemlos in andere Programme integrieren lässt, wird es häufig als Programmiersprache für Plugins und Mods, oder zur Konfiguration benutzt.

Installation

Die aktuellste Version von Lua ist als lua in extra verfügbar, und kann von dort mittels Pacman installiert werden.

# Lua an sich
pacman -S lua

# Just-In-Time-Compiler für Lua-5.1-Scripts
pacman -S luajit

Zusätzlich zur aktuellen Version sind noch die Versionen 5.1, 5.2, und 5.3 als Pakete verfügbar. LuaJIT unterstützt alle Bibliotheksfunktionen und das komplette Set der Lua/C-API-Funktionen bis zu Version 5.1.

Lua besitzt einen eigenen Paketmanager namens Luarocks. Das Programm ist als luarocks in extra verfügbar, und kann von dort mittels Pacman installiert werden.

pacman -S luarocks

Zudem befinden sich sowohl in den Repositorien als auch im AUR sehr viele Module für die Systemweite installation.

Benutzung

Um ein alleinstehendes Lua-Script auszuführen, übergibt man dies einfach dem Interpreter.

lua mein_script.lua
lua5.2 mein_script.lua parameter1 parameter2 ...
luajit mein_script.lua

Zuerst wird das Script mit der aktuellen Version so ausgeführt, wie es ist. Danach wird das Script mit Version 5.2 des Lua-Interpreters ausgeführt, dabei werden auch Parameter übergeben, auf die innerhalb des Scripts im Programmablauf zugegriffen werden kann. Am Schluss wird das Script an LuaJIT übergeben, dieses kompiliert das Script und führt es direkt aus.

Mittels der Parameterkombination -be kann man sich den Bytecode anzeigen lassen. Mittels luajit -bX script.lua script erstellt man eine Binary, die man dann mittels luajit script ausführen kann. Bei sehr umfangreichen Scripts ist das Ausführen der Binary schneller.

Alternativ kann man den Interpreter wie von anderen Scriptsprachen gewohnt auch am Anfang der Datei angeben.

#!/usr/bin/lua

[hier der Code]

Bei Programmen die Lua-Unterstützung eingebaut haben kommt meist LuaJIT zum Einsatz, also Lua 5.1. Wie und von wo der Code geladen wird, ist abhängig von den Programmen.

Beispielprogramm zur Syntaxpräsentation

Die Syntax von Lua ist präzise und bewusst einfach gehalten. Es gibt nur wenige Schlüsselwörter, und vieles kann in Kurzform geschrieben werden.

local zahl = 745

-- Dies definiert einen Table. Tables sind am ehesten mit Arrays Vergleicbar
local foobar = {
  zahl,
  'ein String',
  { 'weiterer Table' }
}

print(string.format('Die Zahl %s ist %s', zahl, zahl%2 == 2 and 'gerade' or 'ungerade'))
if zahl > 100 then print('Die Zahl ist größer als 100') end

print('\n'..foobar[1])
print(foobar[3][1])
Die Zahl 745 ist ungerade
Die zahl ist größer als 100

745
weiterer Table

Das Programm macht verschiedene Dinge mit der angegebenen Zahl und dem Table und gibt die Ergebnisse aus. Für einen Kurzüberblick der auf einzelne Elemente etwas detaillierter Eingeht, sei auf die Kurzübersicht über die Lua-Syntax hier im Wiki verwiesen.

Implementationsbeispiele

Da Lua als Script- oder Konfigurationssprache sehr weit verbreitet ist, seien hier nur einige wenige Beispiele genannt.

  • Die Voxel-Spieleengine Luanti stellt basierend auf LuaJIT eine API für in Lua geschriebene Modifikationen bereit
  • Der Editor Neovim benutzt Lua als Plugin- und Konfigurationssprache
  • Mediawiki benutzt Lua als Template-Engine
  • Der XMPP-Server Prosody ist in Lua geschrieben
  • Der Fenstermanager Awesome ist teilweise in Lua geschrieben und wird mit Lua konfiguriert
  • Conky kann Lua zur Definition von Anzeigescripts interpretieren
  • Lua wird innerhalb von mpv als Scriptsprache benutzt

In der englischen Wikipedia gibt es (sicherlich unvollständige) Listen von Anwendungen und Spielen die auf die eine oder andere Art und Weise Lua nutzen.

Siehe auch

Weblinks