Sự khác biệt giữa asm.js và WebAssembly là gì?


101

Gần đây tôi đã đọc về asm.js và WebAssembly:

http://ejohn.org/blog/asmjs-javascript-compile-target/

https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

Tôi vẫn còn nhầm lẫn về một số điều:

  1. Mã asm.js có được biên dịch kịp thời và chạy không? Tổng hợp thành cái gì?
  2. Ngoài asm.js là văn bản và wasm (web assembly) là nhị phân, sự khác biệt giữa 2 là gì?
  3. Điều này có ý nghĩa gì đối với các ngôn ngữ kịch bản khác, đang chạy trong trình duyệt? Lấy ví dụ như python, nó sẽ
    • mã python được biên dịch thành wasm? hoặc là
    • trình thông dịch python (Cpython) được biên dịch thành wasm và thông dịch python?

Câu trả lời:


47

Mã asm.js có được biên dịch kịp thời và chạy không? Tổng hợp thành cái gì?

asm.js là mã javascript thông thường và được trình thông dịch JS biên dịch thành mã bytecode. Tuy nhiên, một trình thông dịch có hỗ trợ asm phải thực hiện biên dịch trước thời hạn và có thể tạo ra biểu diễn mã hiệu quả hơn do nhập tĩnh. Xem http://asmjs.org/ để biết chi tiết.

sự khác biệt giữa asm và wasm (khác với văn bản và nhị phân) là gì?

Không, bây giờ. wasm được cho là tương thích ngược, có thể biên dịch thành asm (lại có thể thực thi như JS bình thường). Tuy nhiên, nó có thể được mở rộng với nhiều tính năng hơn trong tương lai khi sự hỗ trợ cho nó ngày càng tăng.

Điều này có ý nghĩa gì đối với các ngôn ngữ kịch bản khác, đang chạy trong trình duyệt?

Cái thứ hai, đúng hơn, vì Python vẫn cần được thông dịch. Tất nhiên, các ngôn ngữ kịch bản không cần thông dịch viên có thể được biên dịch trực tiếp sang (w) asm, với điều kiện là có một trình biên dịch (chuỗi) hỗ trợ nó như một mục tiêu.


Ghi chú cặp đôi. Phần đầu tiên của câu trả lời của bạn có vẻ hơi mơ hồ; có vẻ như bạn đang nói rằng asm.js sẽ biên dịch AOT thành một "mã bytecode hiệu quả hơn". Trên thực tế, việc triển khai không nhất thiết phải nhắm mục tiêu một mã bytecode và trên thực tế, nhiều người nhắm mục tiêu trực tiếp ISA gốc và AOT (thực sự là như vậy). Bạn cũng nói "có thể biên dịch thành asm và js". Bạn có thể muốn làm rõ rằng bạn muốn nói "hội đồng gốc" hoặc một cái gì đó. Hoặc có thể ý bạn là "asm.js và js", nhưng điều đó không quá hữu ích vì một cái là tập hợp con của cái kia.
tne

1
@tne: Cảm ơn bạn đã phản hồi, tôi hy vọng mình có thể giải quyết vấn đề - vui lòng (đề xuất) tự chỉnh sửa, tôi đánh giá cao điều đó. Đúng vậy, tôi đã hơi lỏng lẻo về "bytecode hiệu quả hơn" vì tôi không quen với kiến ​​trúc biên dịch chính xác, sau tất cả ISA chỉ là một "mã byte" khác được bộ xử lý thông dịch. Xin hãy tha thứ cho thuật ngữ không chính xác :-)
Bergi

53

asm.js là một tập hợp con của JS với các hướng dẫn "có thể tối ưu hóa cao". Về cơ bản, bạn có thể khai báo kiểu (int, float) và công cụ js (trong các trình duyệt nhưng cũng là một node.js) sẽ thực thi các lệnh nhanh hơn. Nó có lợi ích nếu ứng dụng của bạn thực hiện nhiều phép tính hoặc đồ họa nếu được sử dụng cùng với WebGL.

lắp ráp web là một định dạng nhị phân cho JS, tất cả JS, không chỉ asm.js. Nó không phải là mã bytecode, mà là mã hóa nhị phân của AST mà trình phân tích cú pháp tính toán. Nó có 2 lợi ích lớn:

  • công cụ JS có thể bỏ qua bước phân tích cú pháp
  • nó nhỏ gọn hơn nhiều so với nguồn gốc JS

Chúng tôi đã có thể viết mã cho các trình duyệt không phải là JS: EMSCripten có thể biên dịch mã c ++ trong mã JS. Các trình biên dịch khác đã có sẵn để biên dịch mã của bạn thành JS. Sử dụng asm.js mã có thể chạy nhanh hơn khi nó thực hiện phép toán. Sử dụng web assembly, mã sẽ nhỏ gọn hơn và trình duyệt sẽ có thể xử lý nó nhanh hơn (vì nó có thể bỏ qua phân tích cú pháp). Bạn sẽ không có plugin mới để tải như DirectX, JavaApplets, Flash hoặc Silverlight vì mọi thứ sẽ chạy trong hộp cát JS.


5
Bỏ qua phân tích cú pháp? Chậm lại, ở đó. Hỗ trợ phần cứng không có trong bản đồ trong tương lai gần. Ý bạn là phân tích cú pháp đã trở thành nút thắt cổ chai với asm.js và wasm đã khắc phục điều đó bằng một định dạng nhị phân hiệu quả. Cơ sở lý luận của bạn cho asm.js / wasm có vẻ hơi tối giản, nhưng không sao cả. Đạo cụ để chỉ ra bytecode! = AST.
tne

4
@Cristian, WASM không phải là định dạng nhị phân cho JS. Nó sẽ sử dụng các API web tương tự như JS, nhưng nó linh hoạt và tổng quát hơn nhiều so với JS. Các định dạng nhị phân duy nhất cho JS, hoặc mã bytecodes, được triển khai trong các trình duyệt, như Firefox tại đây: developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…
LearningFast

20

Mã asm.js có được biên dịch kịp thời và chạy không? Tổng hợp thành cái gì?

Các trình duyệt khác nhau biên dịch mã asm.js theo những cách khác nhau. Tính đến tháng 8 năm 2015:

  • Firefox biên dịch asm.js thành mã máy (và lưu mã máy vào bộ nhớ cache để tải tương tự asm.js trong tương lai) [ 1 ].
  • Trong Windows 10 dưới dạng cờ thử nghiệm, Edge cũng sẽ thực hiện một số xác thực trước thời gian và biên dịch asm.js [ 2 ].
  • Chrome đặc biệt nhận ra chỉ thị "sử dụng asm" ở đầu asm.js để phân tích cú pháp và phân tích mã đó một cách háo hức hơn cũng như điều chỉnh các kinh nghiệm biên dịch.
  • Safari không xử lý đặc biệt asm.js.

Ngoài asm.js là văn bản và wasm (web assembly) là nhị phân, sự khác biệt giữa 2 là gì?

asm.js chỉ là JavaScript và do đó phải hoạt động chính xác theo thông số JavaScript. Là một tiêu chuẩn mới, WebAssembly có thể khắc phục một số trường hợp góc mà hành vi JavaScript không phải là lý tưởng (từ góc độ hiệu suất hoặc biên dịch) [ 3 ]. Trong tương lai [ 4 ], WebAssembly sẽ có thể thêm các tính năng mà nếu không sẽ khó diễn đạt bằng JavaScript.

Điều này có ý nghĩa gì đối với các ngôn ngữ kịch bản khác, đang chạy trong trình duyệt? Lấy ví dụ như python, nó sẽ

  • mã python được biên dịch thành wasm? hoặc là
  • trình thông dịch python (Cpython) được biên dịch thành wasm và thông dịch python?

Trong v.1, cách đơn giản nhất để chạy Python trong trình duyệt là biên dịch một trình thông dịch Python sang wasm, như bạn đã nói. Điều này có nghĩa là, ví dụ: Python GC đang chạy trong mã wasm và quản lý thủ công bộ nhớ tuyến tính wasm. Đã có một dự án thử nghiệm để thêm chương trình phụ trợ asm.js vào PyPy [ 5 ] (có thể hoạt động tốt với wasm). Nó hiện đang gặp phải những hạn chế của asm.js có thể được giải quyết bằng tính năng tương lai liên kết động của wasm. Đi xa hơn, wasm tìm cách cung cấp cả tích hợp GChỗ trợ biên dịch JIT, cả hai đều sẽ cho phép tích hợp tự nhiên và hiệu quả hơn với nền tảng Web.

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.