Luaランタイム
WippyのプライマリコンピュートランタイムはI/Oバウンドおよびビジネスロジックワークロード向けに最適化されています。コードはメッセージパッシングで通信する分離されたプロセス内で実行されます—共有メモリもロックもありません。
Wippyはポリグロットランタイムとして設計されています。Luaがプライマリ言語ですが、将来のバージョンではWebAssemblyおよびTemporal統合を通じて、計算集約型または特殊なワークロード向けの追加言語をサポートする予定です。
プロセス
Luaコードはプロセス内で実行されます—スケジューラによって管理される分離された実行コンテキストです。各プロセスは:
- 独自のメモリ空間を持つ
- ブロッキング操作(I/O、チャネル)でyieldする
- 監視およびスーパーバイズ可能
- マシンあたり数千にスケール
local pid = process.spawn("app.workers:handler", "app:processes")
process.send(pid, "task", {data = "work"})
スポーン、リンク、スーパービジョンについてはプロセス管理を参照。
チャネル
Go形式のチャネルで通信:
local ch = channel.new() -- アンバッファード
local buffered = channel.new(10)
ch:send(value) -- 受信されるまでブロック
local val, ok = ch:receive() -- 準備できるまでブロック
selectとパターンについてはチャネルを参照。
コルーチン
プロセス内で軽量コルーチンをスポーン:
coroutine.spawn(function()
local data = fetch_data()
ch:send(data)
end)
do_other_work() -- 即座に続行
スポーンされたコルーチンはスケジューラ管理—手動のyield/resumeは不要。
Select
複数のイベントソースを処理:
local r = channel.select {
inbox:case_receive(),
events:case_receive(),
timeout:case_receive()
}
if r.channel == timeout then
-- タイムアウト
elseif r.channel == events then
handle_event(r.value)
else
handle_message(r.value)
end
グローバル
requireなしで常に利用可能:
process- プロセス管理とメッセージングchannel- Go形式チャネルos- 時間とシステム関数coroutine- 軽量並行処理
モジュール
local json = require("json")
local sql = require("sql")
local http = require("http_client")
利用可能なモジュールはエントリ設定に依存します。エントリ定義を参照。
外部ライブラリ
Wippyは漸進的型システムを持つLua 5.3構文を使用し、Luauにインスパイアされています。型はファーストクラスのランタイム値—検証のために呼び出し可能、引数として渡すことが可能、イントロスペクション可能—ZodやPydanticのようなスキーマライブラリの必要性を置き換えます。
外部Luaライブラリ(LuaRocksなど)はサポートされていません。ランタイムはI/O、ネットワーキング、システム統合のための組み込み拡張を持つ独自のモジュールシステムを提供します。
カスタム拡張については、internalsドキュメントのモジュールを参照。
エラー処理
関数はresult, errorペアを返します:
local data, err = json.decode(input)
if err then
return nil, errors.wrap(err, "decode failed")
end
パターンについてはエラー処理を参照。