2 puan yazan GN⁺ 2024-07-31 | 1 yorum | WhatsApp'ta paylaş

Baştan deneysel bir AOT JS motoru

Porffor, JS kodunu önceden WebAssembly'ye veya native'e derleyen benzersiz bir JS motoru/derleyicisi/runtime'ıdır. Şu anda araştırma amaçlı kullanılmaktadır ve gerçek kullanım için sınırlıdır.

Wasm derleme

Porffor'un WebAssembly çıktısı, mevcut JS -> Wasm projelerine kıyasla çok daha hızlı ve küçüktür. Bunun nedeni, Porffor'un JS'yi AOT olarak derlemesidir.

  • Wasm boyutu: Javy'den 32 kat daha küçük (~1.3MB -> ~40KB)
  • Wasm performansı: Javy'den 18 kat daha hızlı (~70m -> ~4m)

Native derleme

JS'yi önceden derlediği için Porffor, runtime'ı paketlemeden gerçek native binary'lere derlenebilir. Bu da şu sonuçları doğurur:

  • Binary boyutu: 1000 kattan fazla daha küçük (~90MB -> <50KB)
  • Bellek kullanımı: 40 kattan fazla daha az (~50MB -> ~1MB)
  • Performans: 3 kata kadar daha hızlı

Ek bilgiler

  • Porffor güvenlidir: Wasm'a derlenir ve bellek güvenli bir dil olan JS ile yazılmıştır.
  • Porffor baştan AOT düşünülerek yazılmıştır: Mevcut bir JS motorunu temel almaz. Tek bağımlılığı bir JS parser'ıdır.
  • Porffor TypeScript girdisini destekler: Uğraştırıcı bir transpiler adımına gerek yoktur. TS dosyasını doğrudan girdi olarak verebilirsiniz.

Playground

Porffor'u çevrimiçi veya yerelde deneyebilirsiniz. npm i -g porffor@latest && porf komutunu kullanmanız yeterlidir.

  • 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, resmi ECMAScript uygunluk test paketidir. Porffor, uygunluk ilerlemesini takip etmek için bunu her commit'te çalıştırır.

GN⁺ Özeti

Porffor, JS kodunu önceden WebAssembly'ye veya native'e derleyen benzersiz bir motordur. Bu, mevcut çözümlere kıyasla çok daha küçük boyut ve daha hızlı performans sunar. Araştırma amaçlı kullanılır ve TypeScript girdisini destekler. Bu proje, JS motorlarının performansını ve verimliliğini araştırmak için faydalı olabilir. Benzer işlevlere sahip projeler arasında Javy gibi JS -> Wasm derleyicileri bulunur.

1 yorum

 
GN⁺ 2024-07-31
Hacker News görüşleri
  • Oliver'ın Porffor'a tam zamanlı odaklanacağını duyurduğu belirtiliyor
  • JS performansını artırmanın sınırları olduğu için, V8 C++ çağrılarına transpile etmenin en iyi seçenek olabileceği görüşü var
    • TypeScript derlemek büyük performans artışları sağlayabilir
    • TS ve V8, hızla değişen standart dışı hedefler olduğu için büyük bir ekip gerektirir
  • JS runtime'larının Wasm erişimini denemesi kulağa hoş geliyor
    • Static Hermes ile Porffor arasındaki benzerlikler ve farklar inceleniyor
      • Her ikisi de JS test262 uyumluluğunu hedefliyor
      • Porffor Native ve Wasm çıktısını desteklerken, Static Hermes ağırlıklı olarak Native çıktıya odaklanıyor
      • Porffor self-hosted ve saf JS ile yazılmışken, Static Hermes LLVM'ye bağımlı
      • Porffor async/promise/await desteklemezken, Static Hermes bunları sınırlı olarak destekliyor
      • Static Hermes C++ ile yazılmış, Porffor ise çoğunlukla JS ile yazılmış
      • Her ikisi de TypeScript'i destekliyor, ancak Static Hermes TS AST'yi Flow'a transpile ederken Porffor bunu yerel olarak destekliyor
      • Static Hermes, eval gibi zor JS senaryolarını desteklemek için fallback bir interpreter'a sahipken, Porffor yalnızca AOT derlemeyi destekliyor
  • Bu projenin JS engine'lerini hızlandırıp hızlandıramayacağı merak ediliyor
  • windmill.dev'de kullanıcılar kod dağıtırken, script'leri ve tüm bağımlılıkları tek bir js dosyasında bundle etmek için Bun build kullanılıyor
    • Bundle'ı s3'te depolayarak cold start ve bellek kullanımını iyileştiriyorlar
    • Her şeyi native olarak bundle etmek mümkün olursa oyunun kurallarını değiştirebilir
  • "ahead-of-time JS engine" ifadesinin neden "JS-to-Wasm compiler"dan daha iyi bir tanım olduğu sorgulanıyor
  • Porffor'un sürümleme yaklaşımına dair şüpheler var
    • Test262 testlerinde regression yaşanırsa sürüm numarası geri gidebilir
  • Porffor, Galce'de "mor" anlamına geliyor
  • quickJS ile karşılaştırıldığında JS'yi native koda nasıl derlediği merak ediliyor
  • Bunun, Facebook'un PHP'yi C'ye transpile etmeye çalışmasına benzer bir fikir olduğu düşünülüyor
    • Buna hiphop-php deniyordu ve sonunda yeni bir kavram olarak hhvm'i yaptılar
  • NodeJS'i native bir kütüphane olarak derlemenin bir yolunu bilmek istiyorlar
    • Hâlihazırda kullandıkları süreç biraz karmaşık ve hata üretmeye yatkın