2 poin oleh GN⁺ 2024-07-31 | 1 komentar | Bagikan ke WhatsApp

Mesin JS AOT eksperimental dari nol

Porffor adalah mesin/kompiler/runtime JS yang unik yang melakukan pra-kompilasi kode JS ke WebAssembly atau native. Saat ini digunakan untuk tujuan riset dan masih terbatas untuk penggunaan nyata.

Kompilasi Wasm

Output WebAssembly Porffor jauh lebih cepat dan lebih kecil dibandingkan proyek JS -> Wasm yang sudah ada. Ini karena Porffor mengompilasi JS secara AOT.

  • Ukuran Wasm: 32 kali lebih kecil daripada Javy (~1.3MB -> ~40KB)
  • Kinerja Wasm: 18 kali lebih cepat daripada Javy (~70m -> ~4m)

Kompilasi native

Karena JS dikompilasi terlebih dahulu, Porffor dapat dikompilasi menjadi binary native sungguhan tanpa perlu mengemas runtime. Ini menghasilkan hal-hal berikut:

  • Ukuran binary: lebih dari 1000 kali lebih kecil (~90MB -> <50KB)
  • Penggunaan memori: lebih dari 40 kali lebih sedikit (~50MB -> ~1MB)
  • Kinerja: hingga 3 kali lebih cepat

Hal tambahan

  • Porffor aman: dikompilasi ke Wasm, dan ditulis dalam bahasa yang aman terhadap memori (JS).
  • Porffor ditulis dari awal dengan AOT sebagai pertimbangan utama: tidak berbasis pada mesin JS yang sudah ada. Satu-satunya dependensi hanyalah parser JS.
  • Porffor mendukung input TypeScript: tidak perlu langkah transpiler yang merepotkan. Cukup masukkan file TS secara langsung.

Playground

Anda bisa mencoba Porffor secara online atau lokal. Gunakan perintah npm i -g porffor@latest && porf.

  • 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 adalah suite pengujian kesesuaian ECMAScript resmi. Porffor menjalankannya pada setiap commit untuk melacak perkembangan kesesuaian.

Ringkasan GN⁺

Porffor adalah mesin unik yang melakukan pra-kompilasi kode JS ke WebAssembly atau native. Ini menawarkan ukuran yang jauh lebih kecil dan kinerja yang lebih cepat dibandingkan solusi yang ada. Proyek ini digunakan untuk tujuan riset dan mendukung input TypeScript. Proyek ini bisa berguna untuk meneliti kinerja dan efisiensi mesin JS. Proyek dengan fungsi serupa termasuk kompiler JS -> Wasm seperti Javy.

1 komentar

 
GN⁺ 2024-07-31
Opini Hacker News
  • Oliver mengumumkan akan fokus penuh pada Porffor
  • Ada pendapat bahwa peningkatan performa JS punya batas, sehingga mentranspilasi ke pemanggilan V8 C++ mungkin menjadi pilihan terbaik
    • Mengompilasi TypeScript dapat menghasilkan peningkatan performa yang besar
    • TS dan V8 adalah target nonstandar yang berubah cepat sehingga membutuhkan tim besar
  • Menurut mereka, keren melihat runtime JS mencoba pendekatan Wasm
    • Menganalisis persamaan dan perbedaan antara Static Hermes dan Porffor
      • Keduanya menargetkan kepatuhan terhadap JS test262
      • Porffor mendukung output Native dan Wasm, sedangkan Static Hermes terutama berfokus pada output Native
      • Porffor bersifat self-hosted dan ditulis dalam JS murni, sedangkan Static Hermes bergantung pada LLVM
      • Porffor tidak mendukung async/promise/await, tetapi Static Hermes mendukungnya secara terbatas
      • Static Hermes ditulis dalam C++, sedangkan Porffor sebagian besar ditulis dalam JS
      • Keduanya mendukung TypeScript, tetapi Static Hermes mentranspilasi TS AST ke Flow, sedangkan Porffor mendukungnya secara native
      • Static Hermes memiliki interpreter fallback untuk mendukung skenario JS yang sulit seperti eval, tetapi Porffor hanya mendukung kompilasi AOT
  • Ada harapan proyek ini bisa mempercepat engine JS
  • Di windmill.dev, saat pengguna men-deploy kode, mereka memakai build Bun untuk membundel skrip dan semua dependensi menjadi satu file js
    • Bundle disimpan di s3 untuk meningkatkan cold start dan penggunaan memori
    • Jika semuanya bisa dibundel secara native, itu akan menjadi game changer
  • Ada yang penasaran mengapa "ahead-of-time JS engine" dianggap deskripsi yang lebih baik daripada "JS-to-Wasm compiler"
  • Ada keraguan terhadap cara Porffor melakukan versioning
    • Jika terjadi regresi pada pengujian Test262, nomor versinya bisa bergerak mundur
  • Porffor berarti "ungu" dalam bahasa Welsh
  • Ada yang penasaran bagaimana Porffor mengompilasi JS ke kode native dibandingkan quickJS
  • Menurut mereka, ini mirip dengan ide Facebook yang dulu mencoba mentranspilasi PHP ke C
    • Itu disebut hiphop-php, dan pada akhirnya mereka membuat hhvm sebagai konsep baru
  • Ada yang ingin tahu cara mengompilasi NodeJS menjadi pustaka native
    • Proses yang digunakan saat ini agak rumit dan rawan error