2 điểm bởi GN⁺ 2024-07-31 | 1 bình luận | Chia sẻ qua WhatsApp

Engine JS AOT thử nghiệm ngay từ đầu

Porffor là một engine/trình biên dịch/runtime JS độc đáo, biên dịch trước mã JS sang WebAssembly hoặc mã native. Hiện tại nó được dùng cho mục đích nghiên cứu và còn hạn chế trong sử dụng thực tế.

Biên dịch Wasm

Đầu ra WebAssembly của Porffor nhanh hơn và nhỏ hơn nhiều so với các dự án JS -> Wasm hiện có. Lý do là Porffor biên dịch JS theo kiểu AOT.

  • Kích thước Wasm: nhỏ hơn 32 lần so với Javy (~1.3MB -> ~40KB)
  • Hiệu năng Wasm: nhanh hơn 18 lần so với Javy (~70m -> ~4m)

Biên dịch native

Vì biên dịch trước JS, Porffor có thể biên dịch thành các binary native thực sự mà không cần đóng gói runtime. Điều này dẫn đến:

  • Kích thước binary: nhỏ hơn hơn 1000 lần (~90MB -> <50KB)
  • Mức dùng bộ nhớ: ít hơn hơn 40 lần (~50MB -> ~1MB)
  • Hiệu năng: nhanh hơn tối đa 3 lần

Thông tin bổ sung

  • Porffor an toàn: được biên dịch sang Wasm và được viết bằng ngôn ngữ an toàn bộ nhớ (JS).
  • Porffor được viết với AOT ngay từ đầu: không dựa trên các engine JS hiện có. Phụ thuộc duy nhất là parser JS.
  • Porffor hỗ trợ đầu vào TypeScript: không cần bước transpiler rườm rà. Có thể đưa trực tiếp tệp TS vào.

Playground

Có thể thử Porffor trực tuyến hoặc cục bộ. Chỉ cần dùng lệnh 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 là bộ test tuân thủ ECMAScript chính thức. Porffor chạy bộ này trên mỗi commit để theo dõi tiến độ tuân thủ.

Tóm tắt của GN⁺

Porffor là một engine độc đáo biên dịch trước mã JS sang WebAssembly hoặc native. Nó mang lại kích thước nhỏ hơn nhiều và hiệu năng nhanh hơn so với các giải pháp hiện có. Dự án này được dùng cho mục đích nghiên cứu và hỗ trợ đầu vào TypeScript. Đây có thể là một dự án hữu ích để nghiên cứu hiệu năng và hiệu quả của engine JS. Một dự án có chức năng tương tự là các trình biên dịch JS -> Wasm như Javy.

1 bình luận

 
GN⁺ 2024-07-31
Ý kiến trên Hacker News
  • Oliver đã công bố sẽ toàn tâm cho Porffor
  • Có ý kiến cho rằng việc cải thiện hiệu năng JS có giới hạn, nên cách tốt nhất sẽ là transpile sang lời gọi V8 C++
    • Biên dịch TypeScript có thể mang lại cải thiện hiệu năng lớn
    • TS và V8 là các mục tiêu phi tiêu chuẩn thay đổi rất nhanh, nên cần một đội ngũ lớn
  • Có người thấy việc runtime JS thử tiếp cận Wasm là rất hay
    • Phân tích điểm giống và khác nhau giữa Static Hermes và Porffor
      • Cả hai đều hướng tới tuân thủ JS test262
      • Porffor hỗ trợ đầu ra Native và Wasm, còn Static Hermes chủ yếu tập trung vào đầu ra Native
      • Porffor tự host và được viết bằng JS thuần, còn Static Hermes phụ thuộc vào LLVM
      • Porffor không hỗ trợ async/promise/await, còn Static Hermes hỗ trợ ở mức hạn chế
      • Static Hermes được viết bằng C++, còn Porffor chủ yếu được viết bằng JS
      • Cả hai đều hỗ trợ TypeScript, nhưng Static Hermes transpile TS AST sang Flow, còn Porffor hỗ trợ native
      • Static Hermes có trình thông dịch fallback để hỗ trợ các kịch bản JS khó như eval, còn Porffor chỉ hỗ trợ biên dịch AOT
  • Mọi người kỳ vọng dự án này có thể tăng tốc các JS engine
  • Tại windmill.dev, khi người dùng triển khai mã, họ dùng bản dựng Bun để bundle script và toàn bộ dependency thành một file js duy nhất
    • Lưu bundle lên s3 để cải thiện cold start và mức sử dụng bộ nhớ
    • Nếu có thể bundle mọi thứ thành native thì sẽ là bước ngoặt lớn
  • Có người thắc mắc vì sao "ahead-of-time JS engine" lại là cách mô tả tốt hơn so với "JS-to-Wasm compiler"
  • Có sự hoài nghi về cách Porffor đánh version
    • Nếu xảy ra hồi quy trong các bài test Test262 thì số phiên bản có thể bị lùi lại
  • Porffor trong tiếng Wales có nghĩa là "màu tím"
  • Có người thắc mắc cách nó biên dịch JS sang mã native khi so với quickJS
  • Có người nghĩ đây là ý tưởng giống với việc Facebook từng cố transpile PHP sang C
    • Nó được gọi là hiphop-php, và cuối cùng họ đã tạo ra hhvm như một khái niệm mới
  • Có người muốn biết cách biên dịch NodeJS thành thư viện native
    • Quy trình hiện đang dùng hơi phức tạp và dễ phát sinh lỗi