2 คะแนน โดย GN⁺ 2024-07-31 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

เอนจิน AOT JS เชิงทดลองที่สร้างขึ้นตั้งแต่ต้น

Porffor เป็นเอนจิน/คอมไพเลอร์/รันไทม์ JavaScript ที่มีเอกลักษณ์ โดยคอมไพล์โค้ด JS ล่วงหน้าเป็น WebAssembly หรือเนทีฟ ปัจจุบันใช้เพื่อการวิจัยเป็นหลัก และยังมีข้อจำกัดในการใช้งานจริง

การคอมไพล์ Wasm

เอาต์พุต WebAssembly ของ Porffor เร็วกว่าและมีขนาดเล็กกว่ามากเมื่อเทียบกับโปรเจ็กต์ 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 และเขียนด้วยภาษาแบบ memory-safe (JS)
  • Porffor ถูกสร้างขึ้นโดยคำนึงถึง AOT ตั้งแต่แรก: ไม่ได้อิงกับเอนจิน JS ที่มีอยู่เดิม โดยมี dependency เพียงตัวเดียวคือ JS parser
  • Porffor รองรับอินพุต TypeScript: ไม่ต้องมีขั้นตอน transpiler ที่ยุ่งยาก สามารถป้อนไฟล์ TS ได้โดยตรง

Playground

คุณสามารถลองใช้ Porffor ได้ทั้งแบบออนไลน์หรือบนเครื่องโลคัล ใช้คำสั่ง 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 อย่างเป็นทางการ โดย Porffor จะรันชุดทดสอบนี้ทุกครั้งที่มีการคอมมิต เพื่อติดตามความคืบหน้าด้านความเข้ากันได้

สรุปโดย GN⁺

Porffor เป็นเอนจินที่มีเอกลักษณ์ซึ่งคอมไพล์โค้ด JS ล่วงหน้าเป็น WebAssembly หรือเนทีฟ ทำให้ได้ขนาดที่เล็กกว่ามากและประสิทธิภาพที่เร็วกว่าวิธีเดิม ๆ ใช้เพื่อการวิจัยและรองรับอินพุต TypeScript โปรเจ็กต์นี้อาจมีประโยชน์ในการศึกษาด้านประสิทธิภาพและความมีประสิทธิผลของเอนจิน JS โดยโปรเจ็กต์ที่มีความสามารถคล้ายกันได้แก่คอมไพเลอร์ JS -> Wasm อย่าง Javy

1 ความคิดเห็น

 
GN⁺ 2024-07-31
ความคิดเห็นบน Hacker News
  • มีการประกาศว่า Oliver จะทุ่มเทให้กับ Porffor
  • มีความเห็นว่าการเพิ่มประสิทธิภาพของ JS มีขีดจำกัด ดังนั้นการทรานสไพล์ไปเป็นการเรียกใช้ V8 C++ น่าจะเป็นทางเลือกที่ดีที่สุด
    • การคอมไพล์ TypeScript สามารถให้ประสิทธิภาพที่ดีขึ้นอย่างมาก
    • TS และ V8 เป็นเป้าหมายที่ไม่เป็นมาตรฐานและเปลี่ยนแปลงเร็ว จึงต้องใช้ทีมขนาดใหญ่
  • คิดว่าการที่รันไทม์ JS พยายามเข้าถึง Wasm เป็นเรื่องที่เจ๋ง
    • มีการวิเคราะห์จุดเหมือนและจุดต่างระหว่าง Static Hermes กับ Porffor
      • ทั้งคู่มุ่งเป้าไปที่การรองรับ JS test262
      • Porffor รองรับเอาต์พุตแบบ Native และ Wasm ขณะที่ Static Hermes เน้นเอาต์พุตแบบ Native เป็นหลัก
      • Porffor โฮสต์ตัวเองได้และเขียนด้วย JS ล้วน ส่วน Static Hermes พึ่งพา LLVM
      • Porffor ไม่รองรับ async/promise/await แต่ Static Hermes รองรับได้แบบจำกัด
      • Static Hermes เขียนด้วย C++ และ Porffor เขียนด้วย JS เป็นหลัก
      • ทั้งคู่รองรับ TypeScript แต่ Static Hermes ทรานสไพล์ TS AST ไปเป็น Flow ขณะที่ Porffor รองรับโดยเนทีฟ
      • Static Hermes มี fallback interpreter เพื่อรองรับสถานการณ์ JS ที่ยากอย่าง eval แต่ Porffor รองรับเฉพาะการคอมไพล์แบบ AOT
  • คาดหวังว่าโปรเจกต์นี้อาจช่วยเร่งความเร็วของ JS engine ได้
  • ที่ windmill.dev เมื่อผู้ใช้ดีพลอยโค้ด จะใช้ Bun build เพื่อบันเดิลสคริปต์และดีเพนเดนซีทั้งหมดให้เป็นไฟล์ js เดียว
    • เก็บบันเดิลไว้ใน s3 เพื่อปรับปรุง cold start และการใช้หน่วยความจำ
    • ถ้าสามารถบันเดิลทุกอย่างเป็นเนทีฟได้ จะเป็น game changer
  • สงสัยว่าทำไม "ahead-of-time JS engine" จึงเป็นคำอธิบายที่ดีกว่า "JS-to-Wasm compiler"
  • มีข้อสงสัยเกี่ยวกับวิธีจัดการเวอร์ชันของ Porffor
    • หากเกิด regression ในการทดสอบ Test262 หมายเลขเวอร์ชันอาจถอยหลังได้
  • Porffor ในภาษาเวลส์แปลว่า "สีม่วง"
  • สงสัยว่าเมื่อเทียบกับ quickJS แล้ว วิธีคอมไพล์ JS ไปเป็น native code ทำอย่างไร
  • คิดว่าเป็นแนวคิดคล้ายกับตอนที่ Facebook พยายามทรานสไพล์ PHP ไปเป็น C
    • โครงการนั้นชื่อ hiphop-php และสุดท้ายก็สร้าง hhvm ขึ้นมาเป็นแนวคิดใหม่
  • อยากรู้วิธีคอมไพล์ NodeJS ให้เป็น native library ได้
    • กระบวนการที่ใช้อยู่ตอนนี้ค่อนข้างซับซ้อนเล็กน้อยและเกิดข้อผิดพลาดได้ง่าย