- Eine leichtgewichtige JavaScript-Engine auf Basis von PrimJS, die zu WebAssembly kompiliert wird und dadurch sicher sowie hochgradig portabel ist
- Eine starke Sandbox-Architektur mit Speichersicherheit, eingeschränkten JavaScript-Funktionen und einer „fail-fast“-Philosophie sorgt für Sicherheit und Skalierbarkeit
- Selbst auf einer einzelnen Maschine lassen sich Hunderte von VMs parallel ausführen; außerdem können Limits für Speicher und Rechenaufwand (Gas) von Skripten gesetzt werden
- Ohne komplexe Builds oder FFI kann sie als einzelne
.wasm-Datei auf nahezu jeder Plattform eingebettet werden und ist mit rund 800 KB sehr klein
- Bis zu 28 % bessere Performance als QuickJS; in JIT-Umgebungen werden nahezu native Ausführungsgeschwindigkeiten erreicht
Hako: eine kleine, schnelle und sichere JavaScript-Engine
Was ist Hako?
- Eine portable, sicherheitsorientierte und leistungsstarke JavaScript-Engine auf Basis von PrimJS
- Der Name Hako stammt vom japanischen Wort für „Box“ (箱)
- Eine WebAssembly-basierte Engine, die so entworfen wurde, dass sie von jedem in nahezu jeder Umgebung leicht eingebettet werden kann
Sicherheit: Speichersicherheit und eingeschränkte Funktionen
- In C/C++ geschrieben, aber zu WebAssembly kompiliert → garantiert Speichersicherheit und eine Ausführungs-Sandbox
- Auch JavaScript-Funktionen selbst können eingeschränkt werden:
- bestimmte Funktionen entfernen
- Speicherzuweisungen verbieten
- Limits für Ausführungszeit, Speicherverbrauch, Gas usw. setzen
- Über
VMContext lassen sich bösartige Nutzer identifizieren und Ressourcen kontrollieren
- Mit der fail-fast-Strategie wird instabiler Code oder Code mit übermäßigem Ressourcenverbrauch frühzeitig gestoppt
Einfache Einbettung: eine einzige .wasm-Datei genügt
- Verwendet kein Emscripten → ein modernes WebAssembly-Runtime genügt für die Einbettung
- Keine FFI-Wrapper für verschiedene Sprachen erforderlich → auch ohne komplexen Build-Prozess nutzbar
- Beispiel: Beispiel zum Einbetten von Hako in Go
- Der Release-Build besteht aus nur einer
.wasm-Datei mit 800 KB
Performance: schneller als QuickJS
- So wie PrimJS schneller als QuickJS ist, bietet auch Hako im Durchschnitt 28 % mehr Performance gegenüber QuickJS
- SIMD-Optimierungen und Verbesserungen in einigen Hot-Path-Bereichen maximieren die Leistung
- Kein Performance-Nachteil durch WebAssembly — dank JIT-Optimierungen in V8, Wasmtime und JavaScriptCore nahezu auf nativem Niveau
- APIs für Performance-Messung und Profiling sind ebenfalls integriert
Einschränkungen und weitere Pläne
- Einige in PrimJS verwendete Funktionen (Template-Interpreter, GC-Snapshots) werden noch nicht vollständig unterstützt
- Da das Snapshot-Tool von ByteDance noch nicht Open Source ist, entwickelt der Autor ein eigenes Werkzeug
- Das Projekt befindet sich derzeit in einer frühen Beta-Phase; Feedback ist für die Stabilisierung von API/ABI besonders wichtig
- GitHub - hako
2 Kommentare
https://github.com/fernvenue/hako-go-example
scheint ein nicht vorhandener Link zu sein. Das Go-Einbettungsbeispiel ist wohl
https://gist.github.com/andrewmd5/197efb527ef40131c34ca12fd6d0a61e
.
Oh, es scheint sich etwas geändert zu haben. Ich habe es korrigiert. Danke.