WebAssembly so với asm.js
Trước tiên, hãy xem xét về nguyên tắc, WebAssembly khác với asm.js như thế nào và liệu có tiềm năng sử dụng lại kiến thức và công cụ hiện có hay không. Sau đây là tổng quan khá tốt:
Hãy tóm tắt lại, WebAssembly (MVP, vì có nhiều hơn trong lộ trình của nó , gần như):
- là một định dạng nhị phân của AST với kiểu nhập tĩnh, có thể được thực thi bởi các công cụ JavaScript hiện có (và do đó, có thể JIT hoặc AOT được biên dịch),
- nó nhỏ gọn hơn 10-20% (so sánh được nén) và phân tích thứ tự nhanh hơn JavaScript,
- nó có thể thể hiện hoạt động cấp thấp hơn không phù hợp với cú pháp JavaScript, đọc asm.js (ví dụ: số nguyên 64 bit, lệnh CPU đặc biệt, SIMD, v.v.)
- có thể chuyển đổi (ở một mức độ nào đó) sang / từ asm.js.
Do đó, hiện tại WebAssembly là một phiên bản lặp lại trên asm.js và chỉ nhắm mục tiêu C / C ++ (và các ngôn ngữ tương tự).
Python trên web
Có vẻ như GC không phải là thứ duy nhất ngăn mã Python nhắm mục tiêu WebAssembly / asm.js. Cả hai đều đại diện cho mã được nhập tĩnh cấp thấp, trong đó mã Python không thể (thực tế) được. Vì chuỗi công cụ hiện tại của WebAssembly / asm.js dựa trên LLVM, một ngôn ngữ có thể dễ dàng biên dịch sang LLVM IR có thể được chuyển đổi thành WebAssembly / asm.js. Nhưng than ôi, Python quá năng động để phù hợp với nó, như đã được chứng minh bởi Unladen Swallow và một số nỗ lực của PyPy.
Bản trình bày asm.js này có các trang trình bày về trạng thái của các ngôn ngữ động . Điều đó có nghĩa là hiện tại chỉ có thể biên dịch toàn bộ VM (triển khai ngôn ngữ trong C / C ++) sang WebAssembly / asm.js và thông dịch (với JIT nếu có thể) các nguồn gốc. Đối với Python, có một số dự án hiện có:
PyPy: PyPy.js (bài nói của tác giả tại PyCon ). Đây là repo phát hành . Tệp JS chính pypyjs.vm.js
, là 13 MB (2MB sau gzip -6
) + Python stdlib + các thứ khác.
CPython: pyodide , EmPython , CPython-Emscripten , EmCPython , v.v. empython.js
là 5,8 MB (sau 2,1 MB gzip -6
), không có stdlib.
Micropython: ngã ba này .
Không có tệp JS nào được tạo ở đó, vì vậy tôi đã có thể tạo nó bằng trzeci/emscripten/
chuỗi công cụ Emscripten được tạo sẵn. Cái gì đó như:
git clone https://github.com/matthewelse/micropython.git
cd micropython
docker run --rm -it -v $(pwd):/src trzeci/emscripten bash
apt-get update && apt-get install -y python3
cd emscripten
make -j
Nó tạo ra micropython.js
1,1 MB (sau 225 KB gzip -d
). Cái sau đã là một cái gì đó cần xem xét, nếu bạn chỉ cần triển khai rất tuân thủ mà không cần stdlib.
Để sản xuất WebAssembly xây dựng bạn có thể thay đổi dòng 13 của Makefile
để
CC = emcc -s RESERVED_FUNCTION_POINTERS=20 -s WASM=1
Sau đó make -j
sản xuất:
113 KB micropython.js
240 KB micropython.wasm
Bạn có thể xem đầu ra HTML của emcc hello.c -s WASM=1 -o hello.html
, để xem cách sử dụng các tệp này.
Bằng cách này, bạn cũng có thể xây dựng PyPy và CPython trong WebAssembly để diễn giải ứng dụng Python của bạn trong một trình duyệt tuân thủ.
Một điều thú vị khác ở đây là Nuitka , một trình biên dịch từ Python sang C ++. Về khả năng, có thể xây dựng ứng dụng Python của bạn sang C ++ và sau đó biên dịch nó cùng với CPython với Emscripten. Nhưng thực tế tôi không biết phải làm thế nào.
Các giải pháp
Hiện tại, nếu bạn đang xây dựng một trang web hoặc ứng dụng web thông thường trong đó tải xuống tệp JS vài megabyte hầu như không phải là một tùy chọn, hãy xem các bộ chuyển đổi Python-sang-JavaScript (ví dụ: Transcrypt ) hoặc triển khai JavaScript Python (ví dụ: Brython ). Hoặc thử vận may của bạn với những người khác từ danh sách các ngôn ngữ biên dịch sang JavaScript .
Nếu không, nếu kích thước tải xuống không phải là vấn đề và bạn đã sẵn sàng giải quyết nhiều cạnh thô, hãy chọn giữa ba điều trên.
Cập nhật Q3 2020
Cổng JavaScript đã được tích hợp vào MicroPython. Nó sống trong
các cổng / javascript .
Cổng có sẵn dưới dạng gói npm được gọi là MicroPython.js . Bạn có thể dùng thử trong RunKit .
Có một triển khai Python được phát triển tích cực trong Rust, được gọi là
RustPython . Vì Rust chính thức hỗ trợ WebAssembly dưới dạng mục tiêu biên dịch , nên không có gì ngạc nhiên khi có liên kết demo ngay trên đầu readme. Tuy nhiên, vẫn còn sớm. Tuyên bố từ chối trách nhiệm của họ sau đây.
RustPython đang trong giai đoạn phát triển và không được sử dụng trong sản xuất hoặc cài đặt không dung nạp lỗi.
Bản dựng hiện tại của chúng tôi chỉ hỗ trợ một tập hợp con cú pháp Python.