Zum Inhalt springen

Lua-Laufzeitumgebung

Die primäre Laufzeitumgebung von Wippy, optimiert für E/A-gebundene Workloads und Geschäftslogik. Code läuft in isolierten Prozessen, die über Nachrichtenübergabe kommunizieren - kein gemeinsamer Speicher, keine Sperren.

Wippy ist als polyglotte Laufzeitumgebung konzipiert. Während Lua die primäre Sprache ist, werden zukünftige Versionen zusätzliche Sprachen über WebAssembly und Temporal-Integration für rechenintensive oder spezialisierte Workloads unterstützen.

Ihr Lua-Code läuft innerhalb von Prozessen - isolierten Ausführungskontexten, die vom Scheduler verwaltet werden. Jeder Prozess:

  • Hat seinen eigenen Speicherbereich
  • Gibt bei blockierenden Operationen ab (E/A, Channels)
  • Kann überwacht und beaufsichtigt werden
  • Skaliert auf Tausende pro Maschine
Ein typischer Lua-Prozess hat einen Basis-Speicher-Overhead von ca. 13 KB.
local pid = process.spawn("app.workers:handler", "app:processes")
process.send(pid, "task", {data = "work"})

Siehe Prozessverwaltung für Spawning, Linking und Überwachung.

Go-ähnliche Channels für Kommunikation:

local ch = channel.new() -- ungepuffert
local buffered = channel.new(10)
ch:send(value) -- blockiert bis empfangen
local val, ok = ch:receive() -- blockiert bis bereit

Siehe Channels für Select und Muster.

Innerhalb eines Prozesses können Sie leichtgewichtige Coroutinen starten:

coroutine.spawn(function()
local data = fetch_data()
ch:send(data)
end)
do_other_work() -- setzt sofort fort

Gespawnte Coroutinen werden vom Scheduler verwaltet - kein manuelles Yield/Resume.

Behandeln Sie mehrere Ereignisquellen:

local r = channel.select {
inbox:case_receive(),
events:case_receive(),
timeout:case_receive()
}
if r.channel == timeout then
-- Timeout aufgetreten
elseif r.channel == events then
handle_event(r.value)
else
handle_message(r.value)
end

Diese sind immer ohne require verfügbar und müssen nicht in modules: aufgeführt werden:

  • process - Prozesse spawnen, Nachrichten senden, überwachen und verknüpfen
  • channel - Go-ähnliche Channels
  • payload - das Eingabe-Payload des Entrys
  • print, subscribe, unsubscribe - Logging und Pub/Sub
  • os, table, math, string, coroutine, errors - Standardbibliotheken

Alles andere wird mit require() geladen und muss in der modules:-Allowlist des Entrys erscheinen:

local json = require("json")
local sql = require("sql")
local http = require("http_client")

Verfügbare Module hängen von der Entry-Konfiguration ab. Siehe Entry-Definitionen.

Wippy verwendet Lua 5.3-Syntax mit einem graduellen Typsystem, inspiriert von Luau. Typen sind erstklassige Laufzeitwerte - aufrufbar zur Validierung, als Argumente übergebbar und introspektierbar - was den Bedarf an Schema-Bibliotheken wie Zod oder Pydantic ersetzt.

Externe Lua-Bibliotheken (LuaRocks, etc.) werden nicht unterstützt. Die Laufzeitumgebung stellt ihr eigenes Modulsystem mit integrierten Erweiterungen für E/A, Netzwerk und Systemintegration bereit.

Für benutzerdefinierte Erweiterungen siehe Module in der Internals-Dokumentation.

Funktionen geben result, error-Paare zurück:

local data, err = json.decode(input)
if err then
return nil, errors.wrap(err, "decode failed")
end

Siehe Fehlerbehandlung für Muster.