WebAssembly vs asm.js
Pertama, mari kita lihat bagaimana, pada prinsipnya, WebAssembly berbeda dari asm.js , dan apakah ada potensi untuk menggunakan kembali pengetahuan dan perkakas yang ada. Berikut ini memberikan gambaran umum yang cukup bagus:
Mari kita rekapitulasi, WebAssembly (MVP, karena ada lebih banyak tentang peta jalannya , secara kasar):
- adalah format biner AST dengan pengetikan statis, yang dapat dijalankan oleh mesin JavaScript yang ada (dan dengan demikian dapat JIT atau AOT yang dikompilasi),
- ini 10-20% lebih ringkas (perbandingan gzip) dan urutan besarnya lebih cepat untuk diurai daripada JavaScript,
- itu dapat mengekspresikan lebih banyak operasi tingkat rendah yang tidak sesuai dengan sintaks JavaScript, baca asm.js (misalnya bilangan bulat 64-bit, instruksi CPU khusus, SIMD, dll)
- dapat dikonversi (sampai batas tertentu) ke / dari asm.js.
Jadi, saat ini WebAssembly merupakan iterasi pada asm.js dan hanya menargetkan C / C ++ (dan bahasa serupa).
Python di Web
Sepertinya GC bukanlah satu-satunya hal yang menghentikan kode Python untuk menargetkan WebAssembly / asm.js. Keduanya mewakili kode yang diketik secara statis tingkat rendah, di mana kode Python tidak dapat (secara realistis) diwakili. Karena rantai alat WebAssembly / asm.js saat ini didasarkan pada LLVM, bahasa yang dapat dengan mudah dikompilasi ke LLVM IR dapat diubah menjadi WebAssembly / asm.js. Namun sayang, Python terlalu dinamis untuk menyesuaikannya juga, seperti yang dibuktikan oleh Unladen Swallow dan beberapa percobaan PyPy.
Presentasi asm.js ini memiliki slide tentang status bahasa dinamis . Artinya, saat ini hanya mungkin untuk mengkompilasi seluruh VM (implementasi bahasa dalam C / C ++) ke WebAssembly / asm.js dan menafsirkan (dengan JIT jika memungkinkan) sumber asli. Untuk Python, ada beberapa proyek yang sudah ada:
PyPy: PyPy.js ( ceramah penulis di PyCon ). Berikut rilis repo . File JS utama pypyjs.vm.js
,, berukuran 13 MB (2MB setelahnya gzip -6
) + Python stdlib + hal lainnya.
CPython: pyodide , EmPython , CPython-Emscripten , EmCPython , dll. Berukuranempython.js
5,8 MB (2,1 MB setelahnya gzip -6
), tidak ada stdlib.
Micropython: garpu ini .
Tidak ada file JS yang dibuat di sana, jadi saya bisa membuatnya dengan trzeci/emscripten/
, toolchain Emscripten yang sudah jadi. Sesuatu seperti:
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
Ini menghasilkan micropython.js
1,1 MB (225 KB setelah gzip -d
). Yang terakhir ini sudah menjadi pertimbangan, jika Anda hanya membutuhkan implementasi yang sangat patuh tanpa stdlib.
Untuk menghasilkan build WebAssembly Anda dapat mengubah baris 13 dari Makefile
menjadi
CC = emcc -s RESERVED_FUNCTION_POINTERS=20 -s WASM=1
Kemudian make -j
menghasilkan:
113 KB micropython.js
240 KB micropython.wasm
Anda dapat melihat keluaran HTML emcc hello.c -s WASM=1 -o hello.html
, untuk melihat bagaimana menggunakan file-file ini.
Dengan cara ini Anda juga berpotensi membangun PyPy dan CPython di WebAssembly untuk menafsirkan aplikasi Python Anda di browser yang sesuai.
Hal lain yang berpotensi menarik di sini adalah Nuitka , kompiler Python ke C ++. Secara potensial dimungkinkan untuk membangun aplikasi Python Anda ke C ++ dan kemudian mengkompilasinya bersama CPython dengan Emscripten. Tapi secara praktis saya tidak tahu bagaimana melakukannya.
Solusi
Untuk saat ini, jika Anda membangun situs web atau aplikasi web konvensional di mana mengunduh file JS beberapa megabyte hampir tidak ada pilihan lain, lihat transpiler Python-to-JavaScript ( mis.Transcrypt ) atau implementasi JavaScript Python (mis. Brython ). Atau coba keberuntungan Anda dengan orang lain dari daftar bahasa yang dikompilasi ke JavaScript .
Jika tidak, jika ukuran unduhan tidak menjadi masalah, dan Anda siap untuk mengatasi banyak kesulitan, pilih di antara tiga di atas.
Pembaruan Q3 2020
Port JavaScript diintegrasikan ke MicroPython. Itu tinggal di
port / javascript .
Porta ini tersedia sebagai paket npm yang disebut MicroPython.js . Anda dapat mencobanya di RunKit .
Ada implementasi Python yang dikembangkan secara aktif di Rust, yang disebut
RustPython . Karena Rust secara resmi mendukung WebAssembly sebagai target kompilasi , tidak heran ada tautan demo tepat di bagian atas readme. Padahal, ini masih dini. Penafian mereka mengikuti.
RustPython sedang dalam fase pengembangan dan tidak boleh digunakan dalam produksi atau pengaturan yang tidak toleran terhadap kesalahan.
Build kami saat ini hanya mendukung subset sintaks Python.