- ชุมชน Swift ได้พัฒนาการรองรับ WebAssembly (Wasm) อย่างต่อเนื่อง และจากพื้นฐานนี้ได้เสนอวิสัยทัศน์ระยะยาว
- WebAssembly คือ ชุดคำสั่งของเครื่องเสมือน ที่ให้ความสำคัญกับ การพกพา ความปลอดภัย และประสิทธิภาพ และสามารถรันได้บนหลากหลายแพลตฟอร์ม
- หาก Swift รองรับ Wasm ก็จะสามารถใช้งาน Swift ได้ใน สภาพแวดล้อมใหม่รวมถึงเบราว์เซอร์ และขยายโอกาสการใช้งานได้ทั้งใน แอปพลิเคชันฝั่งไคลเอนต์/เซิร์ฟเวอร์
คุณลักษณะด้านความปลอดภัยและอินเทอร์เฟซระบบ
- Wasm สามารถ รันได้เฉพาะฟังก์ชันที่ถูก import มาอย่างชัดเจนโดยไม่มีการเข้าถึงระบบโดยตรง จึงได้เปรียบด้านความปลอดภัย
- WASI (WebAssembly System Interface) มอบ API มาตรฐานเพื่อให้ Wasm โต้ตอบกับโฮสต์ OS ได้
- Swift ทำงานบน target
wasm32-unknown-wasi โดยอาศัย WASI libc และสามารถใช้งานได้แล้วผ่าน C interop
- W3C กำลังจัดการการบูรณาการระบบชนิดและการเชื่อมต่อโมดูลของ Wasm แบบรวมศูนย์ผ่าน Component Model
- สามารถสร้าง
.wit จากการประกาศของ Swift ผ่าน wit-tool ได้ และรองรับทิศทางกลับกันด้วย
กรณีการใช้งานหลัก
- สามารถคอมไพล์ Swift macro เป็น Wasm และแจกจ่ายเป็นไบนารีที่รันได้ทุกที่
- เสริมความปลอดภัยโดย ทำให้การรัน SwiftPM plugin, manifest, macro ฯลฯ อยู่ในสภาพแวดล้อมเสมือน
- Wasm สามารถสร้างไบนารีที่ปรับแต่งประสิทธิภาพผ่านการคอมไพล์แบบ JIT หรือ AOT ได้ จึง ลดการสูญเสียประสิทธิภาพให้เหลือน้อยที่สุด
- คอมโพเนนต์ Swift ที่ถูกทำให้เป็นเสมือนด้วย Wasm สามารถ รันได้โดยไม่ต้องมีโปรเซสแยก จึงตัด overhead ของ IPC ออกไป
เป้าหมายที่เสนอ
- ขยายขอบเขต API ที่รองรับ WASI ใน Swift Standard Library
- จำเป็นต้องสร้างสภาพแวดล้อม CI สำหรับการทดสอบอัตโนมัติ
- ปรับปรุงเครื่องมือ cross-compilation
- ทำให้การจัดการเวอร์ชันและการติดตั้ง Swift SDK ง่ายขึ้น
- บูรณาการ Component Model
- รองรับให้สามารถใช้สเปก WASI ล่าสุดใน Swift ได้
- ปรับปรุง interop กับคอมโพเนนต์ Wasm อื่น ๆ
- เป้าหมายคือทำให้ประสบการณ์การใช้งานคอมโพเนนต์ Wasm จาก Swift เทียบเท่ากับ C/C++
- ปรับปรุงสภาพแวดล้อมการดีบักของ Swift บน Wasm
ประเด็นเกี่ยวกับการดีบัก
- การดีบักของ Wasm ยังมีข้อจำกัด และไม่มีความสามารถ introspection ในตัว
- มีแนวทางหลักอยู่สองแบบ
- Wasm runtime ที่รองรับ LLDB และ GDB protocol
- debugger ที่ฝังมากับ Wasm engine
- สภาพแวดล้อมแบบเบราว์เซอร์และไม่ใช่เบราว์เซอร์ต้องการแนวทางการดีบักที่แตกต่างกัน
- เครื่องมืออย่าง Chrome DevTools สามารถใช้ข้อมูล DWARF ได้ แต่ยังต้องมีการบูรณาการเพิ่มเติมสำหรับ Swift metadata และความสามารถในการประเมิน JIT expression
มัลติเธรดและ concurrency
- ขณะนี้ Wasm มีเพียง atomic operation ที่รองรับ sequential consistency
- การสร้างเธรด ขึ้นอยู่กับสภาพแวดล้อมโฮสต์
- มีข้อเสนอด้าน threading อยู่สองแบบ:
wasi-threads (แนวทางเดิม ซึ่งเครื่องมือและ runtime บางส่วนรองรับแล้ว)
shared-everything-threads (ข้อเสนอใหม่ ซึ่งอาจกลายเป็นมาตรฐานในอนาคต)
- Swift รองรับ
wasm32-unknown-wasi (single-thread) และ wasm32-unknown-wasip1-threads (multi-thread)
- ปัจจุบัน libdispatch ยังไม่รองรับ wasi-threads จึงใช้งาน Swift Concurrency executor แบบ single-thread อยู่
พื้นที่แอดเดรส 64 บิต
- โดยพื้นฐานแล้ว Wasm ใช้ พื้นที่แอดเดรส 32 บิต
- ข้อเสนอหน่วยความจำ 64 บิต (memory64) อยู่ระหว่างการนำไปใช้งาน
- หากต้องการรองรับใน Swift จำเป็นต้องอาศัย ความร่วมมือจาก WebAssembly toolchain หรือ การเปลี่ยนโครงสร้าง Swift metadata
Shared library
- มีอยู่สองแนวทาง
- dynamic linking แบบ Emscripten: ไม่ใช่มาตรฐานและขึ้นอยู่กับความสามารถของ runtime
- static linking บนพื้นฐาน Component Model: ใช้งานได้โดยไม่ต้องพึ่งความสามารถพิเศษของ runtime แต่ไม่สามารถโหลดขณะรันไทม์ได้
- หากต้องการใช้ shared library ใน Swift จำเป็นต้องคอมไพล์ในโหมด PIC (Position-Independent Code) และปฏิบัติตาม ข้อกำหนดการลิงก์ที่กำหนดไว้
1 ความคิดเห็น
Swift ก็ดีนะ แต่ Swift ที่ถูกทอดทิ้งจะกลับมามีชีวิตอีกครั้งได้ไหม..