Porffor: ゼロから作られた実験的な Ahead-of-Time JS エンジン
(porffor.dev)ゼロから作られた実験的な AOT JS エンジン
Porfforは、JSコードをWebAssemblyまたはネイティブに事前コンパイルするユニークなJSエンジン/コンパイラ/ランタイムです。現在は研究目的で使われており、実運用での利用には制約があります。
Wasm コンパイル
PorfforのWebAssembly出力は、既存のJS -> Wasmプロジェクトと比べてはるかに高速かつ小型です。これは、PorfforがJSをAOTでコンパイルするためです。
- Wasmサイズ: Javyより 32倍小さい (~1.3MB -> ~40KB)
- Wasm性能: Javyより 18倍高速 (~70m -> ~4m)
ネイティブコンパイル
JSを事前コンパイルするため、Porfforはランタイムを同梱せずに実際のネイティブバイナリへコンパイルできます。これにより、次のような結果が得られます。
- バイナリサイズ: 1000倍以上小さい (~90MB -> <50KB)
- メモリ使用量: 40倍以上少ない (~50MB -> ~1MB)
- 性能: 最大3倍高速
追加事項
- Porfforは安全: Wasmにコンパイルされ、メモリ安全な言語(JS)で書かれています。
- Porfforは最初からAOTを念頭に置いて設計: 既存のJSエンジンをベースにしていません。唯一の依存関係はJSパーサーです。
- PorfforはTypeScript入力をサポート: 面倒なトランスパイラ段階は不要です。TSファイルをそのまま入力できます。
Playground
Porfforはオンラインまたはローカルで試せます。npm i -g porffor@latest && porf コマンドを使えばOKです。
- Prime Numbers
- Fibonacci
- Factorial
- Sum of Digits
- Exception
- Array Reading
- ArrayPrototype
- Math Proposals Parser: acorn, meriyah, hermes-parser, @babel/parser
- Target: wasm
const isPrime = number => {
if (number < 2) return false;
for (let i = 2; i < number; i++) {
if (number % i == 0) return false;
}
return true;
}
let counter = 0;
while (counter <= 10000) {
if (isPrime(counter)) Porffor.numberLog(counter);
counter++;
}
Test262
Test262は、公式のECMAScript準拠テストスイートです。Porfforは各コミットごとにこれを実行し、準拠の進捗を追跡しています。
GN⁺のまとめ
Porfforは、JSコードをWebAssemblyまたはネイティブに事前コンパイルするユニークなエンジンです。これにより、既存ソリューションと比べてはるかに小さいサイズと高速な性能を実現します。研究目的で使われており、TypeScript入力もサポートしています。このプロジェクトは、JSエンジンの性能と効率を研究するうえで有用かもしれません。類似機能を持つプロジェクトとしては、JavyのようなJS -> Wasmコンパイラがあります。
1件のコメント
Hacker News の意見
evalのような難しい JS シナリオをサポートするためのフォールバックインタープリタを持っているが、Porffor は AOT コンパイルのみをサポートしている