Luau – eine schnelle, kleine und sichere Lua-basierte Skriptsprache mit schrittweiser Typisierung
(luau.org)- Luau ist eine von Lua 5.1 abgeleitete eingebettete Skriptsprache, die schnell und sicher ist und schrittweise Typisierung unterstützt
- Sie wurde weiterentwickelt, um komplexe Spiele und große Codebasen auf der Roblox-Plattform zu unterstützen, mit Verbesserungen bei Performance, Sprachwerkzeugen und Typsystem
- Anders als Standard-Lua verfügt sie über Sandboxing-Funktionen und ist so entworfen, dass Code mit unterschiedlichen Berechtigungen parallel ausgeführt werden kann
- Die Syntax ist mit Lua 5.1 kompatibel, bietet aber zusätzliche Syntax-Erweiterungen und Analysetools (Linter, Type Checker), um die Codequalität zu erhöhen
- Mit Performance-Optimierungen, angepasstem Bytecode und JIT-Unterstützung zielt sie auf Ausführungsgeschwindigkeit auf LuaJIT-Niveau ab und hat auch jenseits von Roblox großes Potenzial in verschiedenen eingebetteten Umgebungen
Motivation (Hintergrund)
- Um 2006 führte Roblox Lua 5.1 als Skriptsprache für Spiele ein
- Mit der Zeit stiegen das Niveau der Spiele auf der Roblox-Plattform und die Teamgrößen, sodass Sprache und Implementierung umfassend verbessert wurden, um die Grenzen des bisherigen Lua zu überwinden
- Mit dem Wachstum der Plattform wurde viel in Performance-Optimierung, Benutzerfreundlichkeit und die Entwicklung sprachbezogener Tools investiert
- Insbesondere bei der Verwaltung großer Codebasen mit mehr als 1 Million Zeilen im Jahr 2020 wurde erkannt, dass die Einführung eines schrittweisen Typsystems unverzichtbar ist
- Auf Basis dieser Anforderungen entwickelte Roblox mit Luau eine von Lua abgeleitete Sprache, die schnell, klein und sicher ist und zugleich Funktionen für die schrittweise Anwendung von Typen bietet
- Eine ausführlichere Erklärung bietet das Dokument Why Luau
Überblick über Luau
- Luau ist eine eingebettete Skriptsprache auf Basis von Lua 5.1
- Sie bietet eine schnelle und leichtgewichtige Runtime
- Sie unterstützt ein schrittweises Typsystem, sodass dynamische und statische Analyse parallel möglich sind
- Sie ist in Roblox Studio integriert, und mit dem Flag
--!strictkann der Strict Mode aktiviert werden - Entwickler können in den Luau Creator Docs die mit Roblox verknüpfte Dokumentation einsehen
Sandboxing (Sandbox-Funktionen)
- Luau begrenzt die exponierte Standardbibliothek und bietet zusätzliche Sandboxing-Funktionen
- Dadurch können nicht privilegierter Code, der von normalen Entwicklern geschrieben wurde, und privilegierter Code innerhalb der Plattform sicher parallel ausgeführt werden
- Dadurch ergibt sich eine andere Ausführungsumgebung als bei Standard-Lua
- Details finden sich in der Sandbox-Beschreibung
Compatibility (Kompatibilität)
- Soweit möglich wird Abwärtskompatibilität mit Lua 5.1 gewahrt, zugleich werden teilweise auch Funktionen späterer Versionen übernommen
- Luau übernimmt jedoch nicht alle Designentscheidungen von Lua, sondern spiegelt die spezifischen Anwendungsfälle und Einschränkungen von Roblox wider
- Der Support-Status für Funktionen aus Versionen nach Lua 5.1 ist im Compatibility-Dokument beschrieben
Syntax (Syntax)
- Sie ist vollständig kompatibel mit der Lua-5.1-Syntax
- Zusätzlich bietet sie moderne und vertraute Syntax-Erweiterungen, die die Entwicklung erleichtern
- Die vollständige Syntax ist im Syntax-Dokument zu finden
Analysis (Analysetools)
-
Zur Unterstützung beim Schreiben korrekten Codes werden Skript-Analysetools bereitgestellt
-
Bestandteile:
- Linter: erkennt allgemeine Fehler
- Type Checker: prüft Typen
-
Sie können mit dem CLI-Tool
luau-analyzeausgeführt werden -
Zu den Lint-Regeln siehe das Lint-Dokument, zur Typprüfung den Leitfaden Typecheck
Performance (Performance)
- Es werden ein angepasstes Frontend mit Parser, Linter und Type Checker sowie optimierter Bytecode, Interpreter und Compiler bereitgestellt
- Je nach Fall ist eine Performance möglich, die mit dem LuaJIT-Interpreter konkurrieren kann
- Auf x64- und ARM64-Plattformen wird ein manueller JIT-Compiler unterstützt, der die Performance bestimmter Programme deutlich verbessern kann
- Die Runtime wird fortlaufend optimiert und teilweise neu geschrieben, um die Effizienz zu steigern
- Detaillierte Performance-Eigenschaften sind im Performance-Dokument beschrieben
Libraries (Bibliotheken)
- Die Sprache selbst ist eine vollständige Obermenge von Lua 5.1
- In der Standardbibliothek wurden einige Funktionen entfernt und einige neue hinzugefügt
- Bei der Einbettung in eine Anwendung ist auch der Zugriff auf anwendungsspezifische Erweiterungsbibliotheken möglich
- Die vollständige Bibliotheksdokumentation ist im Library-Dokument verfügbar
1 Kommentare
Hacker-News-Kommentare
src-Verzeichnis 11.000 Zeilen C-Code und 1.900 Zeilen Header.luau.orgbesucht. Das Engineering von Roblox ist wirklich beeindruckend.CreateThread(fn),Wait(ms)und Await/Promises wie in FiveM, um Coroutines bequemer zu handhaben (Luau Promise-Implementierung). In FiveM erleichtern solche Wrapper sowohl die Skriptoptimierung als auch das Coroutine-Management: Beispiel für den Lua-Scheduler von FiveM--!strictselbst bei offensichtlichen Typverstößen weder Fehler noch Warnungen auftraten und der Code einfach lief. Das entsprach nicht der Erwartung.luaustartet, wird keine Typprüfung angewandt. Wenn in einer eingebetteten Umgebung jedoch erzwungen wird, dass sämtlicher Code vor dem Kompilieren typgeprüft werden muss, dann erhält man das erwartete Verhalten mit abgefangenen Typfehlern. Diese Entscheidung war unvermeidlich, weil auf einen Schlag Millionen Zeilen Lua-5.1-Code in Luau überführt wurden.tscgeprüft und die Fehler bzw. Ergebnisse dann wieder auf Luau zurückgemappt werden. So ließe sich vielleicht schnell ein Typechecker für verschiedene dynamische Sprachen bauen.