• คอมไพเลอร์ที่แปลงโปรแกรม Python เป็น WebAssembly
  • ทำงานได้เร็วกว่า CPython(WASM) 3 เท่า เพราะตัดโอเวอร์เฮดของอินเทอร์พรีเตอร์ออกไป
    • เมื่อเทียบกับ CPython(Native) จะมีความเร็วประมาณ 60%
  • มีหลายวิธีในการรัน Python บน WebAssembly ให้เร็วขึ้น
    • ใช้ชุดย่อยของ Python ที่สามารถคอมไพล์เป็นโค้ดประสิทธิภาพสูงได้: CPython, RPython(PyPy) และ Codon
    • ใช้ JIT ภายใน Python: PyPy
    • ปรับแต่งโค้ดที่สร้างขึ้นด้วยการวิเคราะห์แบบสถิต: mypy & mypy-c, Nuitka
  • สุดท้ายจึงตัดสินใจใช้ Nuitka ซึ่งเป็นคอมไพเลอร์เพิ่มประสิทธิภาพสำหรับ Python

Nuitka

  • Nuitka ทำงานโดยแปลงการเรียก Python ที่โปรแกรมทำงานอยู่ให้เป็น C ผ่านการเรียกใช้ CPython API ภายใน
  • รองรับโปรแกรม Python ส่วนใหญ่ และแปลงโค้ด Python ให้เป็นการเรียกใช้ CPython ดังกล่าว
  • ยังสามารถทำหน้าที่เป็นตัวทำโค้ดให้อ่านยากได้ด้วย (ไม่มีใครดีคอมไพล์โปรแกรมได้!)
  • หลังจากวิเคราะห์ทุกตัวเลือกอย่างละเอียด ก็พบว่าวิธีที่เร็วที่สุดในการรัน Python บน WebAssembly น่าจะเป็นการใช้ Nuitka

คอมไพล์ Python เป็น WebAssembly ด้วย Nuitka

  • เนื่องจาก Nuitka ทำงานส่วนใหญ่ในการแปลงโค้ด Python ไปเป็นการเรียกใช้อินเทอร์พรีเตอร์ CPython พื้นฐานไว้แล้ว จึงดูเป็นตัวเลือกที่ง่ายที่สุดในการเพิ่มความเร็วของ Python ในบริบทของ WebAssembly
  • Nuitka ยังไม่รองรับ Python 3.12 จึงต้องคอมไพล์ Python 3.11 สำหรับ WASI ใหม่ และใช้ไฟล์ archive libpython.a ที่ได้
  • เมื่อลองรันไฟล์ Wasm ที่สร้างขึ้น ก็พบปัญหาอีกอย่าง จึงได้ส่ง PR เพื่ออัปสตรีมการเปลี่ยนแปลงไปยัง Nuitka
  • ตอนนี้ py2wasm ใช้ฟอร์กของ Nuitka อยู่ แต่เมื่อการเปลี่ยนแปลงถูกรวมเข้าอัปสตรีมแล้ว ก็มีแผนจะทำให้ py2wasm เป็นเลเยอร์บาง ๆ บน Nuitka
  • ความต้องการเริ่มต้นของเราคือเร่งความเร็วการรัน Python ให้ได้มากที่สุด เพื่อย้าย Django backend ของ Python จาก Google Cloud ไปยัง Wasmer Edge
  • py2wasm จะช่วยให้เข้าใกล้การรันแอป backend ของ Python บน Edge ด้วยประสิทธิภาพที่น่าทึ่งมากขึ้นอีกก้าว และช่วยให้สามารถเสนอทางเลือกที่ถูกกว่ามากสำหรับการโฮสต์แอปเหล่านี้เมื่อเทียบกับผู้ให้บริการคลาวด์ในปัจจุบัน

โรดแมปในอนาคต

  • ในอนาคตหวังว่าจะเผยแพร่ py2wasm เป็นแพ็กเกจของ Wasmer เพื่อให้สามารถใช้งานได้ด้วยการรันคำสั่งต่อไปนี้เท่านั้น
    wasmer run py2wasm --dir=. -- myfile.py -o myfile.wasm  
    

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น