- บริษัทแห่งหนึ่ง (ไม่เปิดเผยชื่อ) ที่ให้บริการแก่ผู้ใช้หลายร้อยล้านคน กำลังใช้ C และ C++ ในระบบหลัก
- ตลอดปี 2023 มีการถกเถียงกันว่าจะเลือกใช้ภาษา Rust หรือ Zig
- ประเด็นหลักที่ใช้พิจารณา:
- การทำงานร่วมกับภาษา C
- ความสามารถในการขยายทีมวิศวกร (การจ้างงาน การบำรุงรักษา ฯลฯ)
- ข้อสรุปสุดท้าย: Zig
- ผู้เขียนแชร์กระบวนการตัดสินใจนี้ เพราะคิดว่าสะท้อนให้เห็นได้ดีว่า “ปัจจัยที่องค์กรขนาดใหญ่พิจารณา เมื่อโค้ดต้องรันบนเป้าหมายที่หลากหลายและส่งผลกระทบต่อผู้ใช้หลายร้อยล้านคน” คืออะไร
ความสำคัญของการทำงานร่วมกับ C
- ไลบรารีที่ต้องการเขียนใหม่มีแนวโน้มจะถูกใช้งานบนทุกแพลตฟอร์ม (เว็บ มือถือ ชุดหูฟัง VR เกมคอนโซล เดสก์ท็อป ฯลฯ)
- ดังนั้น การมี C API และการใช้งานผ่าน FFI จึงเป็นวิธีเดียวที่รับประกันการทำงานได้บนทุกแพลตฟอร์ม
ประเด็นถกเถียงหลัก
Rust
- ในตอนนั้นได้รับความนิยมมากกว่า Zig มากกว่า 25 เท่า (อ้างอิงจากแบบสำรวจและซับเรดดิต)
- อยู่ในสถานะเสถียรมานานกว่า
- การสนับสนุนจากภาคอุตสาหกรรมผ่าน Rust Foundation ดูมั่นคง
- มี LSP และประสบการณ์นักพัฒนาที่ยอดเยี่ยม
- Cargo: ตัวจัดการแพ็กเกจระดับแนวหน้าของอุตสาหกรรม
- ความปลอดภัยของหน่วยความจำและ “ไม่มีพฤติกรรมที่ไม่กำหนดไว้” (แม้จะไม่จริงทั้งหมด แต่ถูกยกขึ้นมาในวงสนทนา)
- หากต้องการออกจาก C++ Rust เหมาะกว่าเพราะลดโอกาสเกิดข้อผิดพลาดด้านหน่วยความจำและพฤติกรรมที่ไม่กำหนดไว้
- รองรับ SIMD บนเวอร์ชัน
nightly
- รองรับ WASM ได้ลื่นไหลพอ ๆ กับ Zig
- ด้านประสิทธิภาพเทียบชั้น Zig หรือในบางกรณี “เร็วกว่าอย่างเห็นได้ชัด”
การทำงานร่วมกับ C ของ Rust:
- Rust มี ecosystem ของตัวเองที่อุดมสมบูรณ์ จึงทำให้ความสำคัญของการทำงานร่วมกับ C ลดลงเมื่อเทียบกัน
- มีศักยภาพที่ดีในการเชื่อมต่อกับภาษาแบบ high-level เช่น Python bindings
- มีความเห็นว่าข้อดีของการใช้ Rust ชดเชยข้อเสียของการต้องเปิดให้ใช้ C bindings ได้
Zig
- นักพัฒนาที่มีพื้นฐาน C/C++ หรือ TypeScript เรียนรู้ได้ง่าย
- มอบประสบการณ์การเขียนโค้ดที่สนุกสำหรับนักพัฒนาสาย C
- คอมไพเลอร์ของ Zig สามารถคอมไพล์ C และ C++ ได้ด้วย จึงเป็นประโยชน์ต่อการจัดการ dependencies และการสร้างไลบรารีแบบ C ABI
- รองรับแพลตฟอร์มเป้าหมายที่หลากหลายได้ง่ายมาก (
zig targets ได้รับคำชมมาก)
- เขียนซอฟต์แวร์ที่เร็วได้ง่าย (รองรับ
Vector แบบเนทีฟ การใช้ SIMD ฯลฯ)
- ใช้งานร่วมกับดีบักเกอร์ที่มีอยู่เดิมได้
- มีระบบ build ที่ยอดเยี่ยม (ดีกว่า Makefile เดิม 100 เท่า)
- Zig Software Foundation มีความโปร่งใสทางการเงินสูง
- สามารถค่อย ๆ พอร์ตโค้ด C++ เดิมและ “ทำให้เป็น Zig” ได้
- ช่วยแก้ปัญหาเรื่องการลิงก์/คอมไพล์สำหรับทุกแพลตฟอร์มเป้าหมายได้อย่างมั่นใจ
บทสรุป
- Zig ช่วยลดเวลาและความพยายามที่จำเป็นในการพอร์ตโค้ดเบสเดิม และรับประกันความเข้ากันได้กับทุกแพลตฟอร์มอย่างมาก
- ปัจจัยตัดสินใจที่เหนือความคาดหมาย:
- การเรียนรู้ได้ง่ายและการจ้างงานมีผลมากกว่าที่คาดไว้ (เป็นข้อได้เปรียบของ Zig)
- ประสบการณ์นักพัฒนาที่เกี่ยวข้องกับ toolchain มีบทบาทสำคัญ
- คอมไพเลอร์และระบบ build ของ Zig ช่วยได้มาก เพราะเข้ากันได้ดีกับโค้ดเบสเดิม
- ecosystem ชุมชน และการรับประกันด้าน memory safety ของ Rust มีอิทธิพลน้อยกว่าที่คาด
10 ความคิดเห็น
อ่านบทความสนุกมากครับ! ตอนกำลังหาข้อมูลเกี่ยวกับ node, bun และ deno ก็เห็นว่า bun เขียนด้วยภาษาแปลกใหม่ที่ชื่อว่า zig เลยสงสัยว่ามันเป็นภาษาแบบไหน ขอบคุณที่ทำให้ได้ลองทำความรู้จักแบบพอหอมปากหอมคอครับ!
ปัญหาใหญ่อย่างหนึ่งของ
zigคือ เวลาคอมไพล์แล้วโค้ดที่ผู้ใช้เขียนมีข้อผิดพลาด มันจะไม่บอกตำแหน่งหรือข้อมูลที่แม่นยำ ดูเหมือนว่าจะบอกได้แค่ถึง standard library เท่านั้นพออ่านประเด็นที่ต้องพิจารณา หัวข้อถกเถียง และข้อสรุปแล้ว ก็รู้สึกว่าแต่แรกมันไม่ใช่สภาพแวดล้อมที่จำเป็นต้องใช้ Rust อยู่แล้วนะครับ เคยเห็นพนักงานส่งอาหารขับรถออฟโรดไปส่งอาหารไหม?
ถึงจะต้องพัฒนาเป็นภาษาเนทีฟก็จริง แต่ถ้าไม่ใช่งานที่วิกฤตเรื่องหน่วยความจำ ก็ควรเลือกฝั่งที่พัฒนาได้สะดวกกว่านั่นแหละ จะเอาเรื่องนี้มาถกกันเป็นปีเลยก็เกินไปหน่อย...
มีผู้ใช้ระดับหลายร้อยล้านคน....
สงสัยจังว่าเป็นบริษัทไหน ดูเหมือนจะเป็นบริษัทที่ไม่ยึดติดกับขั้นตอนที่เป็นพิธีการอย่างการรับรอง... น่าอิจฉา...
ผมมักจะกลับไปดู Zig ปีละครั้ง แต่ดูเหมือนว่าแทบทุกปีก็จะมี breaking change อยู่เสมอ;;
แถมตัวภาษาเองก็ยังไม่มีไลบรารีสำหรับคิวหรือการส่งข้อความระหว่างเธรดเตรียมไว้ให้ ดังนั้นเมื่อเทียบกับความสุกงอมของ Rust แล้ว ก็ยังดูเหมือนว่าต้องไปอีกไกล
แน่นอนว่าถ้าผู้ใช้เชี่ยวชาญ OS API ต่าง ๆ มากพอ ก็อาจจะไม่ใช่ปัญหาใหญ่อะไร…
แม้ว่า Rust จะได้รับความนิยมมากกว่า Zig ถึงกว่า 25 เท่า แต่ดูเหมือนว่าเรื่องการจ้างงานจะเข้าทาง Zig มากกว่านะ
น่าจะเป็นเพราะข้อ 1 คือผู้พัฒนาที่มีพื้นฐาน C/C++ หรือ TypeScript สามารถเรียนรู้ได้ง่าย
มอบประสบการณ์การเขียนโค้ดที่สนุกให้กับนักพัฒนาที่มีพื้นฐาน C
เขียนซอฟต์แวร์ได้อย่างรวดเร็วและง่ายดาย (รองรับ Vector แบบเนทีฟ, การใช้ SIMD เป็นต้น)
ให้ความรู้สึกเหมือนตอนที่ได้เรียน Python ครั้งแรก
พอเห็นว่า Bun พัฒนาด้วยภาษา Zig ก็เคยสงสัยเหมือนกันว่าทำไมถึงเลือก Zig แต่พอได้อ่านบทความที่เปรียบเทียบกับ Rust ไว้อย่างดีก็เข้าใจเลยครับ ว่าแต่ดูเหมือนว่าภาษา C จะเป็นอมตะจริง ๆ