YanmaJS¶
YanmaJS は Zig で書かれた JavaScript エンジンです。Zig アプリケーションへの組み込み(embedding)を主な用途として設計されています。
🚀 ブラウザで試す → — インストール不要。WebAssembly 版の YanmaJS をブラウザ上で実行できるサンドボックスです。
特徴¶
- ECMAScript 2026 世代の主要機能をサポート — test262 準拠率 100%(48,536 件中 48,419 合格 / 0 失敗、非目標の 117 件は skip)。一部制限あり(詳細は制約と上限を参照)
- NaN-boxed な Value 表現 —
u641 語に値を詰め込む NaN-boxing により、コンパクトかつ高速な値表現を実現 - GC(ガベージコレクション) — オブジェクトのライフサイクルを自動管理。手動 GC トリガーや GC モードの切り替えも可能
- Promise / async・await — 非同期処理をサポート。ホスト側のイベントループと連携するためのフックを提供
- モジュール(ES Modules) —
import/exportに対応し、ホスト側でモジュールローダーを差し込み可能 - サンドボックス実行 — メモリ上限の指定や実行の割り込み(interrupt)により、信頼できない JavaScript コードを安全に実行
注意事項¶
このプロジェクトは主に AI によって実装されており、学習・実験目的のプロジェクトです。プロダクション環境での利用は推奨しません。
クイックスタート¶
Context を初期化し、JavaScript コードを評価して結果を取り出す最小の例です。
const std = @import("std");
const yanmajs = @import("yanmajs");
const Context = yanmajs.Context;
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const ctx = try Context.init(gpa.allocator());
defer ctx.deinit();
const result = try ctx.eval("1 + 2");
const n = yanmajs.toFloat(result);
std.debug.print("Result: {d}\n", .{n}); // 3
}
より詳しい手順は はじめに を参照してください。
構成¶
YanmaJS リポジトリはエンジン本体(yanmajs)・ランタイムライブラリ(yanmajs_runtime)・CLI(yanmajs_cli)・WASM ビルド(yanmajs_wasm)・C ABI(yanmajs_capi)などのコンポーネントで構成されています。一覧と役割はコンポーネント構成を参照してください。
ガイド¶
- はじめに — ライブラリ導入・Hello World
- 組み込み(Embedding)ガイド — Zig アプリケーションへの組み込み
- Value の扱い方 — 値の作成・変換・型チェック
- オブジェクトと配列 — オブジェクト/配列操作・ホストオブジェクト
- 関数 — ホスト関数・コールバック・userdata
- Promise と非同期処理 — Promise API・microtask・イベントループ
- エラーハンドリング — 例外・エラー型
- メモリ管理 — GC・メモリ制限・ハンドルスコープ
- 応用機能 — Realm・モジュール・タイマー・割り込み・JSON
- 開発ガイド — ビルド・テスト・CLI・Makefile タスク
API リファレンス¶
- Context — Context の全メソッド
- Value — 値の作成・変換・型チェック関数
- 型定義 — 公開型・構造体・列挙型
- エラー — EvalError・例外処理
- 制約と上限 — 未サポート機能・既知の制約
命名について¶
Yanmaは日本語でトンボの一種であるヤンマを意味します。ヤンマは小さい昆虫ながら力強く速く飛ぶことから本プロジェクトの名前として命名しました。