WebAssembly กับ asm.js
ก่อนอื่นมาดูกันว่าโดยหลักการแล้วWebAssemblyแตกต่างจากasm.jsอย่างไรและมีศักยภาพที่จะนำความรู้และเครื่องมือที่มีอยู่กลับมาใช้ใหม่ได้หรือไม่ ข้อมูลต่อไปนี้ให้ภาพรวมที่ค่อนข้างดี:
มาสรุปกันใหม่ WebAssembly (MVP เนื่องจากมีข้อมูลเพิ่มเติมเกี่ยวกับแผนงานโดยประมาณ):
- เป็นรูปแบบไบนารีของ AST ที่มีการพิมพ์แบบคงที่ซึ่งสามารถดำเนินการได้โดยเอ็นจิ้น JavaScript ที่มีอยู่ (และทำให้ JIT สามารถหรือคอมไพล์ AOT ได้)
- มีขนาดกะทัดรัดกว่า 10-20% (การเปรียบเทียบแบบ gzipped) และลำดับความสำคัญในการแยกวิเคราะห์เร็วกว่า JavaScript
- สามารถแสดงการทำงานในระดับต่ำมากขึ้นซึ่งไม่พอดีกับไวยากรณ์ของ JavaScript อ่าน asm.js (เช่นจำนวนเต็ม 64 บิตคำแนะนำพิเศษของ CPU SIMD ฯลฯ )
- สามารถเปลี่ยนแปลงได้ (ในบางส่วน) ถึง / จาก asm.js
ดังนั้นปัจจุบัน WebAssembly เป็นการทำซ้ำบน asm.js และกำหนดเป้าหมายเฉพาะ C / C ++ (และภาษาที่คล้ายกัน)
Python บนเว็บ
ดูเหมือนว่า GC จะไม่เป็นสิ่งเดียวที่หยุดโค้ด Python จากการกำหนดเป้าหมาย WebAssembly / asm.js ทั้งสองเป็นตัวแทนของรหัสที่พิมพ์แบบคงที่ระดับต่ำซึ่งโค้ด Python ไม่สามารถแสดงได้ (ตามความเป็นจริง) เนื่องจาก toolchain ปัจจุบันของ WebAssembly / asm.js ใช้ LLVM ภาษาที่สามารถคอมไพล์เป็น LLVM IR ได้อย่างง่ายดายจึงสามารถแปลงเป็น WebAssembly / asm.js แต่อนิจจา Python มีไดนามิกเกินกว่าที่จะใส่เข้าไปได้เช่นกันซึ่งพิสูจน์แล้วโดยUnladen Swallowและความพยายามหลายครั้งของ PyPy
นำเสนอ asm.js นี้มีภาพนิ่งเกี่ยวกับสถานะของภาษาแบบไดนามิก ความหมายคือขณะนี้สามารถรวบรวม VM ทั้งหมด (การใช้ภาษาใน C / C ++) ไปยัง WebAssembly / asm.js และตีความ (ด้วย JIT หากเป็นไปได้) ต้นฉบับ สำหรับ Python มีหลายโครงการที่มีอยู่:
PyPy: PyPy.js (ผู้เขียนพูดคุยที่ PyCon ) นี่คือการเปิดตัว repo ไฟล์ JS หลักpypyjs.vm.js
คือ 13 MB (หลัง 2MB gzip -6
) + Python stdlib + สิ่งอื่น ๆ
CPython: pyodide , EmPython , CPython-Emscripten , EmCPythonฯลฯempython.js
คือ 5.8 MB (หลัง 2.1 MB gzip -6
) ไม่มี stdlib
Micropython: ส้อมนี้
ไม่มีไฟล์ JS ที่สร้างขึ้นที่นั่นดังนั้นฉันจึงสามารถสร้างมันด้วยtrzeci/emscripten/
Emscripten toolchain สำเร็จรูป สิ่งที่ต้องการ:
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
มีmicropython.js
ขนาด 1.1 MB (225 KB หลังgzip -d
) สิ่งหลังนี้เป็นสิ่งที่ต้องพิจารณาหากคุณต้องการเพียงการใช้งานที่สอดคล้องกับมาตรฐานโดยไม่ต้องใช้ stdlib
ในการสร้าง WebAssembly คุณสามารถเปลี่ยนบรรทัดที่ 13 ของMakefile
to
CC = emcc -s RESERVED_FUNCTION_POINTERS=20 -s WASM=1
จากนั้นmake -j
ผลิต:
113 KB micropython.js
240 KB micropython.wasm
คุณสามารถดูผลลัพธ์ HTML ของemcc hello.c -s WASM=1 -o hello.html
เพื่อดูวิธีใช้ไฟล์เหล่านี้
ด้วยวิธีนี้คุณสามารถสร้าง PyPy และ CPython ใน WebAssembly เพื่อตีความแอปพลิเคชัน Python ของคุณในเบราว์เซอร์ที่เข้ากันได้
สิ่งที่น่าสนใจอีกอย่างที่นี่คือNuitkaซึ่งเป็นคอมไพเลอร์ Python ถึง C ++ อาจเป็นไปได้ที่จะสร้างแอพ Python ของคุณเป็น C ++ แล้วคอมไพล์พร้อมกับ CPython ด้วย Emscripten แต่ในทางปฏิบัติฉันไม่รู้ว่าจะทำอย่างไร
แนวทางแก้ไข
ในขณะนี้หากคุณกำลังสร้างเว็บไซต์หรือเว็บแอปทั่วไปที่ดาวน์โหลดไฟล์ JS ขนาดหลายเมกะไบต์แทบจะไม่มีตัวเลือกให้ดูที่Transcrypt -to-JavaScript (เช่นTranscrypt ) หรือการใช้งาน JavaScript Python (เช่นBrython ). หรือลองโชคของคุณกับคนอื่น ๆ จากรายการภาษาที่รวบรวม JavaScript
มิฉะนั้นหากขนาดการดาวน์โหลดไม่ใช่ปัญหาและคุณพร้อมที่จะจัดการกับขอบหยาบจำนวนมากให้เลือกระหว่างสามข้อด้านบน
การอัปเดต Q3 2020
พอร์ต JavaScript ถูกรวมเข้ากับ MicroPython มันอาศัยอยู่ใน
พอร์ต javascript /
พอร์ตสามารถใช้ได้เป็นแพคเกจที่เรียกว่า NPM MicroPython.js คุณสามารถลองมันออกมาในRunKit
มีการดำเนินการหลามพัฒนาอย่างแข็งขันใน Rust ที่เรียกว่า
RustPython เนื่องจาก Rust สนับสนุนWebAssembly เป็นเป้าหมายการคอมไพล์อย่างเป็นทางการจึงไม่ต้องแปลกใจเลยว่ามีลิงก์สาธิตอยู่ด้านบนสุดของ readme แม้ว่าจะยังเร็วอยู่ คำปฏิเสธของพวกเขาดังต่อไปนี้
RustPython อยู่ในขั้นตอนการพัฒนาและไม่ควรใช้ในการผลิตหรือการตั้งค่าที่ทนต่อความผิดพลาด
บิลด์ปัจจุบันของเรารองรับไวยากรณ์ Python เพียงบางส่วนเท่านั้น