ASM.js là gì và nó có ý nghĩa gì với mọi người?


27

Tôi bắt đầu để nghe rumblings về dự án này được gọi là ASM.js . Hiện tại trang web của họ rất khủng khiếp và khó hiểu. Đây là những gì tôi biết từ nghiên cứu của tôi trên web.

  • Nó là một tập hợp con của JavaScript có thể được tối ưu hóa cao. Tôi đoán bởi vì nó tránh được các phần năng động hơn của ngôn ngữ.
  • Hiệu suất của mã được biên dịch thành ASM.js chạy ở tốc độ khoảng một nửa tốc độ của C (không phải ánh sáng).
  • Mục đích là để các trình biên dịch tạo ngôn ngữ đích ASM.js.
  • Firefox sẽ được vận chuyển với tối ưu hóa ASM.js.
  • Các nhóm Mozilla và Unreal đã chuyển Unreal Engine lên web bằng nó và nó chạy trong một bản dựng Firefox với tốc độ gần như nguyên bản.

Dường như không có bất kỳ thông tin cụ thể nào trên web về điều này thực sự là gì hoặc tính hữu dụng hoặc mục đích cuối cùng. Có phải là tôi có thể biên dịch các cơ sở mã phía máy chủ của mình và để nó chạy trong trình duyệt ở tốc độ gần với nguồn gốc không? Sự phân nhánh cho các nhà phát triển là gì?

Câu trả lời:


21

Bạn đã mô tả nó gì . Việc sử dụng là nó là một ngôn ngữ cấp thấp mà làm việc trên tất cả các trình duyệt, khá nhanh ở hầu hết và rất nhanh trong một số. Những gì bạn làm về điều này cũng giống như những gì bạn làm với bất kỳ ngôn ngữ lập trình nào khác.

Trường hợp sử dụng Mozilla có vẻ quan tâm nhất là: Đã có nhiều cách biên dịch ngôn ngữ với các phụ trợ LLVM (nổi bật nhất là C và C ++) sang JavaScript, thông qua Emscripten. asm.js rất gần với những gì Emscripten đã phát ra, vì vậy điều này cho phép mã Emscripten (vốn đã nhanh chóng gây ấn tượng trên các trình biên dịch JavaScript JIT ngày nay) để trở nên nhanh hơn, tiếp tục mục tiêu chuyển các cơ sở mã hiện có lên web. Một lần nữa, chính xác những gì bạn sử dụng này là quyết định của bạn. Trò chơi porting là một trường hợp sử dụng (mà Mozilla rõ ràng có liên quan tích cực), nhưng có vô số điều được viết bằng C và C ++, một vài trong số đó có thể có ích cho trang web của ai đó. Một số tôi đã thấy xung quanh (cộng với một số phát minh của riêng tôi), không có gì đảm bảo về tính khả thi:

  • Chuyển các thuật toán cho mục đích chung (ví dụ: zlib, libjpeg, openssl, triển khai FFT) để trao quyền cho JavaScript / trang web để làm nhiều hơn mà không phải tạo một tiêu chuẩn web mới và tùy thuộc vào từng trình duyệt để thực hiện nó.
  • Các trình thông dịch porting, để các ngôn ngữ khác ngoài JavaScript có thể chạy trong trình duyệt, với ít nỗ lực chuyển và tối thiểu.
  • Sử dụng asm.js làm phụ trợ cho nhiều trình biên dịch, đặc biệt là các trình biên dịch không ánh xạ tốt tới JavaScript và không cần hầu hết các tính năng và chi phí của nó. Một ví dụ có thể là một ngôn ngữ được thiết kế cho công việc số nhanh mà không cần cấp phát bộ nhớ.
  • Sử dụng asm.js để tạo JIT trong JavaScript. Nó có thể thực hiện bất kỳ ngôn ngữ nào - ví dụ ActionScript .
  • Trong cùng một hướng, chuyển các trình biên dịch JIT hiện có để chạy trong trình duyệt (xem các trình thông dịch porting, với chi phí không quá hiệu quả so với JS). Điều này có lẽ chỉ khả thi khi trình biên dịch JIT được tạo tự động, như với PyPy.

2
Đây là một lời giải thích tốt khác: ejohn.org/blog/asmjs-javascript-compile-target
Jarrod Nettles

1
Đây là một bằng chứng về khái niệm để chuyển JIT sang asm.js. Đó là một điểm bán hàng độc đáo, hầu hết các nền tảng mới nổi không thân thiện với JIT.
Tobu

Có một lời giải thích nào đó về cách asm.js hỗ trợ biên dịch JIT không? Dường như không thể tìm thấy bất kỳ thông tin về điều đó. Hầu hết quan tâm đến cách xử lý các tác động an ninh.
Roman Starkov

@romkyns Biên dịch JIT của asm.js thành mã máy theo trình duyệt hoặc biên dịch JIT thành asm.js (bằng chương trình JavaScript)? Đối với trước đây, ít nhất là trong Firefox, các phương tiện tạo mã máy của trình biên dịch JIT thuần túy được sử dụng lại. Vì asm.js chỉ có thể gọi vào JS, thực hiện số học và đọc / ghi một mảng heap với các kiểm tra trong phạm vi chỉ mục, bảo mật cũng tốt như bảo mật của việc thực thi JS. Đối với phần sau, bạn chỉ cần tạo mã nguồn asm.js và để trình duyệt thực thi nó, và không có ý nghĩa bảo mật bổ sung nào ngoài những gì tôi đã đề cập trước đó.

(Ý tôi là cái sau) Ooh tất nhiên; bằng cách nào đó tôi tưởng tượng trình biên dịch JIT phát ra mã máy gốc. Cảm ơn bạn đã làm rõ!
Roman Starkov

4

Hãy tưởng tượng ASM.js là một ArrayBuffer nhị phân lớn được gọi là heap và một bộ mô-đun JavaScript, bắt đầu bằng một chỉ thị mở đầu: "use asm";và thực hiện các hoạt động cấp thấp nhanh chóng trên dữ liệu nhị phân thô, tương tự như ngôn ngữ lắp ráp. Các mô-đun này có thể được viết bằng tay hoặc được biên dịch tốt hơn từ mã LLVM bởi các tập lệnh như Emscripten. Hiệu suất của chúng có thể được tăng lên nhờ vào công cụ Mozilla OdinMonkey, nhưng chúng tương thích ngược với hầu hết các trình thông dịch ECMAScript hiện đại.

ASM.js không giới hạn trong các trò chơi, bạn thậm chí có thể chạy toàn bộ ứng dụng Qt trong trình duyệt của mình, như thế này !

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.