คอมไพเลอร์ C4wa เผชิญการแข่งขันจาก Clang และ Zig สำหรับการสร้าง WebAssembly ขนาดเล็ก

ทีมชุมชน BigGo
คอมไพเลอร์ C4wa เผชิญการแข่งขันจาก Clang และ Zig สำหรับการสร้าง WebAssembly ขนาดเล็ก

โปรเจค c4wa compiler ซึ่งมีเป้าหมายในการสร้าง WebAssembly ขนาดเล็กจากโค้ด C ได้จุดประกายการอภิปรายเกี่ยวกับแนวทางที่ดีที่สุดสำหรับการสร้างไฟล์ WASM ที่มีขนาดกะทัดรัด แม้ว่า c4wa จะสัญญาว่าจะให้ไบนารีขนาดเล็กโดยไม่ต้องพึ่งพา runtime แต่นักพัฒนาก็ตั้งคำถามว่าเครื่องมือที่มีอยู่แล้วอาจจะแก้ปัญหาเดียวกันได้อย่างมีประสิทธิภาพมากกว่าหรือไม่

คุณสมบัติหลักของ C4wa :

  • สร้างผลลัพธ์ WebAssembly แบบมินิมอล (ตัวอย่าง: ฟังก์ชัน Collatz ขนาด 99 ไบต์)
  • ไม่มีไลบรารีที่ฝังตัวหรือการพึ่งพา JavaScript
  • รองรับทั้งรูปแบบ WASM แบบไบนารีและรูปแบบข้อความ WAT ที่อ่านได้
  • ต้องการ Java 11 หรือสูงกว่า
  • อัปเดตล่าสุด: 29 มกราคม 2022

การพึ่งพา Java ทำให้เกิดข้อสงสัย

หนึ่งในการวิพากษ์วิจารณ์ที่เกิดขึ้นทันทีคือความต้องการของ c4wa ที่ต้องใช้ Java 11 หรือสูงกว่า การพึ่งพานี้ดูขัดแย้งกับเครื่องมือที่คอมไพล์ส่วนย่อยของ C ไปเป็น WebAssembly ความขัดแย้งนี้ไม่ได้หลุดไปจากนักพัฒนาที่ชี้ให้เห็นว่าตามหลักการแล้ว คอมไพเลอร์ดังกล่าวควรจะเขียนด้วยส่วนย่อยของ C ที่มันรองรับ ทำให้สามารถคอมไพล์ตัวเองไปเป็น WebAssembly ได้

Clang สามารถสร้าง WebAssembly ไบนารีขนาดเล็กได้แล้ว

การอภิปรายเผยให้เห็นว่า Clang สมัยใหม่สามารถสร้างเอาต์พุต WebAssembly ที่กะทัดรัดอย่างน่าทึ่งโดยใช้ตัวเลือก --target=wasm32 นักพัฒนาคนหนึ่งได้แบ่งปันเรื่องราวความสำเร็จของพวกเขาในการสร้างอีมูเลเตอร์ x86 16-bit ที่สมบูรณ์พร้อมกับ BIOS และการจำลอง DOS ในขนาดไม่ถึง 100KB ของ WebAssembly ความสำเร็จนี้แสดงให้เห็นว่า toolchain ที่มีอยู่แล้วสามารถสร้างไบนารีขนาดเล็กที่ c4wa สัญญาไว้ได้แล้ว

ข้อมูลเชิงลึกที่สำคัญจากชุมชนคือการตั้งค่าการปรับให้เหมาะสมมีความสำคัญอย่างมาก เมื่อเปรียบเทียบ c4wa กับ Emscripten ดูเหมือนว่าการเปรียบเทียบอาจจะไม่ยุติธรรมเพราะ Emscripten ไม่ได้รันด้วยการปรับให้เหมาะสมที่เปิดใช้งาน ด้วยแฟล็ก -O ที่เหมาะสม คอมไพเลอร์ที่มีชื่อเสียงสามารถสร้างคุณภาพโค้ดที่คล้ายกับที่ c4wa สร้างได้

Clang คือ compiler front-end สำหรับ C, C++ และภาษาอื่นๆ ที่เป็นส่วนหนึ่งของโปรเจค LLVM

เครื่องมือทางเลือกใหม่ๆ เกิดขึ้น

นอกเหนือจาก C compiler แบบดั้งเดิมแล้ว นักพัฒนายังสำรวจภาษาอื่นๆ ที่คอมไพล์ไปเป็น WebAssembly แบบสแตนด์อโลน Zig ได้รับความสนใจในความสามารถในการสร้างโมดูล WASM แบบ freestanding โดยไม่ต้องใช้สภาพแวดล้อม runtime ที่ซับซ้อน แนวทางนี้ดึงดูดนักพัฒนาที่สร้าง WebAssembly runtime แบบกำหนดเองที่ไม่ต้องการใช้งาน WASI หรือ Emscripten API ทั้งหมด

การอภิปรายของชุมชนยังเน้นการใช้งาน C library ขนาดเล็ก โดยนักพัฒนาบางคนสร้างทางเลือกที่มีน้ำหนักเบาของตัวเองที่เพิ่มโค้ดเพียงไม่กี่ร้อยบรรทัดในขณะที่ให้ฟังก์ชันการทำงานที่จำเป็น

WASI (WebAssembly System Interface) คือมาตรฐานที่กำหนดวิธีการที่โปรแกรม WebAssembly โต้ตอบกับระบบโฮสต์

คอมไพเลอร์ WebAssembly ทางเลือก:

  • Clang: ใช้แฟล็ก --target=wasm32 สามารถสร้างไฟล์ binary ที่มีขนาดต่ำกว่า 100KB
  • Zig: รองรับการคอมไพล์ WebAssembly แบบ freestanding
  • Emscripten: มีฟีเจอร์ครบครันแต่ต้องใช้แฟล็กการปรับให้เหมาะสมเพื่อให้ได้ผลลัพธ์ที่มีขนาดเล็กที่สุด
  • Custom minimal libc: นักพัฒนาบางคนสร้างการใช้งานที่มีเพียง 200 บรรทัด

ข้อกังวลเกี่ยวกับสถานะของโปรเจค

ข้อกังวลที่น่าสังเกตที่ถูกยกขึ้นในการอภิปรายคือ commit ล่าสุดของ c4wa เมื่อวันที่ 29 มกราคม 2022 ซึ่งบ่งบอกว่าโปรเจคอาจจะไม่ได้ใช้งานแล้ว ช่วงเวลานี้ทำให้เกิดคำถามเกี่ยวกับความเป็นไปได้ในระยะยาวของการใช้ c4wa เมื่อมีทางเลือกอื่นที่มีชื่อเสียงและได้รับการดูแลอย่างต่อเนื่องมากกว่า

การอภิปรายในที่สุดสะท้อนคำถามที่กว้างขึ้นในระบบนิเวศ WebAssembly ว่าเครื่องมือเฉพาะทางอย่าง c4wa เติมเต็มช่องว่างที่แท้จริงหรือไม่ หรือว่าคอมไพเลอร์ที่มีความเป็นผู้ใหญ่ที่มีอยู่แล้วพร้อมกับการกำหนดค่าที่เหมาะสมสามารถบรรลุเป้าหมายเดียวกันได้ในขณะที่ให้การสนับสนุนระยะยาวและความเข้ากันได้ที่ดีกว่า

อ้างอิง: C compiler for Web Assembly (c4wa)