12 Punkte von xguru 2025-05-09 | 2 Kommentare | Auf WhatsApp teilen
  • 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

 
secret3056 2025-05-09

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
.

 
xguru 2025-05-09

Oh, es scheint sich etwas geändert zu haben. Ich habe es korrigiert. Danke.