Saya telah membaca bahwa dimungkinkan untuk mengubah kode Python 2.7 ke Web Assembly, tetapi saya tidak dapat menemukan panduan pasti tentang cara melakukannya.
Sejauh ini saya telah menyusun program C ke Web Assembly menggunakan Emscripten dan semua komponen yang diperlukan, jadi saya tahu itu berfungsi (panduan yang digunakan: http://webassembly.org/getting-started/developers-guide/ )
Apa langkah-langkah yang harus saya ambil untuk melakukan ini di mesin Ubuntu? Apakah saya harus mengubah kode python menjadi LLVM bitcode kemudian mengkompilasinya menggunakan Emscripten? Jika demikian, bagaimana saya mencapai ini?
python
emscripten
webassembly
Robbie
sumber
sumber
pyodide
: hacks.mozilla.org/2019/04/…Jawaban:
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):
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 setelahnyagzip -6
) + Python stdlib + hal lainnya.CPython: pyodide , EmPython , CPython-Emscripten , EmCPython , dll. Berukuran
empython.js
5,8 MB (2,1 MB setelahnyagzip -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 # to run REPL: npm install && nodejs server.js
Ini menghasilkan
micropython.js
1,1 MB (225 KB setelahgzip -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
menjadiCC = 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.
sumber
Ini tidak akan mungkin sampai perakitan web menerapkan pengumpulan sampah. Anda dapat mengikuti kemajuannya di sini: https://github.com/WebAssembly/proposals/issues/16
sumber
Singkatnya: Ada transpiler, tetapi Anda tidak dapat secara otomatis mengonversi Python sembarang ke Web Assembly, dan saya ragu Anda akan bisa melakukannya untuk waktu yang lama. Meskipun secara teoritis bahasanya sama kuatnya, dan terjemahan manual selalu dimungkinkan, Python memungkinkan untuk beberapa struktur data dan mode ekspresif yang membutuhkan kompiler antar-bahasa (atau transpiler) yang sangat cerdas [lihat di bawah]. Solusinya mungkin Python ke C to Web Assembly karena teknologi python-to-C cukup matang, tetapi itu umumnya tidak akan berhasil karena Python-to-C juga rapuh (lihat di bawah).
WebAssembly secara khusus ditargetkan ke bahasa mirip C seperti yang Anda lihat di http://webassembly.org/docs/high-level-goals/
Menerjemahkan dari Python ke C dapat dilakukan dengan alat seperti PyPy, yang telah dikembangkan untuk waktu yang lama, tetapi masih tidak berfungsi untuk kode sembarang Python. Ada beberapa alasan untuk ini:
Jika Anda melihat lebih teliti mengapa Python-to-C (atau Python ke C ++) begitu rumit, Anda dapat melihat alasan terperinci di balik jawaban singkat ini, tetapi saya pikir itu di luar cakupan pertanyaan Anda.
sumber