2 पॉइंट द्वारा GN⁺ 2024-07-31 | 1 टिप्पणियां | WhatsApp पर शेयर करें

शुरू से बनाया गया एक प्रयोगात्मक AOT JS इंजन

Porffor एक अनोखा JS इंजन/कंपाइलर/रनटाइम है जो JS कोड को पहले से WebAssembly या native में कंपाइल करता है। फिलहाल इसका उपयोग शोध उद्देश्यों के लिए किया जाता है और वास्तविक उपयोग में इसकी सीमाएँ हैं।

Wasm कंपाइल

Porffor का WebAssembly आउटपुट मौजूदा JS -> Wasm प्रोजेक्ट्स की तुलना में कहीं तेज़ और छोटा है। ऐसा इसलिए है क्योंकि Porffor, JS को AOT के रूप में कंपाइल करता है।

  • Wasm आकार: Javy से 32 गुना छोटा (~1.3MB -> ~40KB)
  • Wasm प्रदर्शन: Javy से 18 गुना तेज़ (~70m -> ~4m)

Native कंपाइल

चूंकि यह JS को पहले से कंपाइल करता है, Porffor रनटाइम को पैकेज किए बिना वास्तविक native binary में कंपाइल कर सकता है। इससे ये परिणाम मिलते हैं:

  • Binary आकार: 1000 गुना से अधिक छोटा (~90MB -> <50KB)
  • Memory उपयोग: 40 गुना से अधिक कम (~50MB -> ~1MB)
  • प्रदर्शन: अधिकतम 3 गुना तेज़

अतिरिक्त बातें

  • Porffor सुरक्षित है: यह Wasm में कंपाइल होता है और memory-safe language (JS) में लिखा गया है।
  • Porffor को शुरू से AOT को ध्यान में रखकर बनाया गया है: यह किसी मौजूदा JS इंजन पर आधारित नहीं है। इसकी एकमात्र dependency एक JS parser है।
  • Porffor TypeScript input को सपोर्ट करता है: किसी झंझट वाले transpiler चरण की ज़रूरत नहीं है। सीधे TS फ़ाइल इनपुट दी जा सकती है।

Playground

आप Porffor को online या local पर आज़मा सकते हैं। इसके लिए 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 आधिकारिक ECMAScript conformity test suite है। Porffor हर commit पर इसे चलाकर conformity प्रगति को ट्रैक करता है।

GN⁺ का सार

Porffor एक अनोखा इंजन है जो JS कोड को पहले से WebAssembly या native में कंपाइल करता है। यह मौजूदा समाधानों की तुलना में बहुत छोटा आकार और तेज़ प्रदर्शन देता है। इसका उपयोग शोध उद्देश्यों के लिए किया जाता है और यह TypeScript input को सपोर्ट करता है। यह प्रोजेक्ट JS इंजन के प्रदर्शन और दक्षता पर शोध के लिए उपयोगी हो सकता है। इसी तरह की क्षमता वाले प्रोजेक्ट्स में Javy जैसे JS -> Wasm कंपाइलर शामिल हैं।

1 टिप्पणियां

 
GN⁺ 2024-07-31
Hacker News टिप्पणियाँ
  • Oliver ने घोषणा की है कि वह Porffor पर पूरी तरह ध्यान देंगे
  • यह राय है कि JS performance सुधारने की एक सीमा है, इसलिए V8 C++ calls में transpile करना सबसे अच्छा हो सकता है
    • TypeScript को compile करने पर बड़ा performance improvement मिल सकता है
    • TS और V8 तेजी से बदलने वाले non-standard targets हैं, इसलिए एक बड़ी team की जरूरत होती है
  • यह अच्छा लगता है कि JS runtime Wasm access की कोशिश कर रहा है
    • Static Hermes और Porffor के समानताओं और अंतर का विश्लेषण किया गया है
      • दोनों का लक्ष्य JS test262 compliance है
      • Porffor Native और Wasm output को support करता है, जबकि Static Hermes मुख्य रूप से Native output पर केंद्रित है
      • Porffor self-hosted है और pure JS में लिखा गया है, जबकि Static Hermes LLVM पर निर्भर है
      • Porffor async/promise/await को support नहीं करता, लेकिन Static Hermes सीमित रूप से support करता है
      • Static Hermes C++ में लिखा गया है, और Porffor मुख्य रूप से JS में लिखा गया है
      • दोनों TypeScript को support करते हैं, लेकिन Static Hermes TS AST को Flow में transpile करता है, जबकि Porffor इसे native रूप से support करता है
      • Static Hermes के पास eval जैसे कठिन JS scenarios को support करने के लिए fallback interpreter है, लेकिन Porffor केवल AOT compilation को support करता है
  • उम्मीद है कि यह project JS engines को accelerate कर पाएगा
  • windmill.dev में, जब उपयोगकर्ता code deploy करते हैं, तो scripts और सभी dependencies को एक js file में bundle करने के लिए Bun build का उपयोग किया जाता है
    • bundle को s3 में store किया जाता है ताकि cold start और memory usage बेहतर हो सके
    • अगर सब कुछ native रूप से bundle किया जा सके, तो यह game changer होगा
  • यह जिज्ञासा है कि "ahead-of-time JS engine", "JS-to-Wasm compiler" से बेहतर description क्यों है
  • Porffor के versioning तरीके पर संदेह है
    • अगर Test262 tests में regression होता है, तो version number पीछे जा सकता है
  • Porffor का वेल्श में अर्थ "बैंगनी" है
  • quickJS की तुलना में JS को native code में compile करने का तरीका जानना चाहते हैं
  • लगता है कि यह Facebook के उस विचार जैसा है जिसमें PHP को C में transpile करने की कोशिश की गई थी
    • उसे hiphop-php कहा जाता था, और आखिरकार hhvm को एक नए concept के रूप में बनाया गया
  • NodeJS को native library में compile करने का तरीका जानना चाहते हैं
    • अभी जो process इस्तेमाल हो रही है वह थोड़ी जटिल है और उसमें errors आने की संभावना रहती है