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 GC và hỗ 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.