โลกของการเขียนโปรแกรมกำลังฮือฮาเกี่ยวกับระบบนิเวศที่กำลังเติบโตของ Zig โดยเฉพาะอย่างยิ่งกับการเปิดตัว Zio ไลบรารี asynchronous I/O และการทำงานพร้อมกันล่าสุด ซึ่งพัฒนาขึ้นโดยโปรแกรมเมอร์ที่เขียนระบบระบุเสียง (audio fingerprinting) ใหม่จาก C++ เป็น Zig เรียบร้อยแล้ว Zio สัญญาว่าจะให้การทำงานพร้อมกันแบบ Go พร้อมกับข้ออ้างเรื่องประสิทธิภาพอันยอดเยี่ยมที่ได้จุดประกายทั้งความตื่นเต้นและการตรวจสอบทางเทคนิคภายในชุมชนนักพัฒนา
บริบทการพัฒนา:
- Zio เกิดขึ้นจากความต้องการเชิงปฏิบัติในระบบลายนิ้วมือเสียง (AcoustID)
- มีประสบการณ์จากการพัฒนา NATS client มาก่อนหน้านี้
- แก้ไขปัญหาความซับซ้อนของ callback และปัญหาการจัดสรรหน่วยความจำในการเขียนโปรแกรมแบบ async
- ออกแบบมาเพื่อให้ประสบการณ์การเขียนโค้ดแบบ synchronous พร้อมประสิทธิภาพแบบ async
ข้ออ้างเรื่องประสิทธิภาพภายใต้การตรวจสอบ
ผู้สร้าง Zio อ้างถึงประสิทธิภาพอย่างกล้าหาญ โดยระบุว่าไลบรารีนี้ เอาชนะเฟรมเวิร์กใดๆ ที่ผมเคยลองมา และ เร็วกว่าทั้ง Go และ Tokio ของ Rust มาก ไลบรารีนี้ทำได้เช่นนี้ผ่านสแต็กฟูลคอรูทีน (stackful coroutines) ที่มีสแต็กขนาดคงที่ โดยการสลับบริบท (context switching) ถูกอธิบายว่า แทบจะไม่มีค่าใช้จ่าย และเทียบได้กับการเรียกฟังก์ชัน อย่างไรก็ตาม ข้ออ้างเหล่านี้ได้กระตุ้นให้มีการวิเคราะห์ทางเทคนิคอย่างละเอียดจากสมาชิกในชุมชนที่เข้าใจความซับซ้อนของสถาปัตยกรรมซีพียูสมัยใหม่
ผู้แสดงความคิดเห็นหนึ่งให้ข้อมูลเชิงลึกที่สำคัญเกี่ยวกับความท้าทายในการวัดประสิทธิภาพของคอรูทีนอย่างแม่นยำ: การสลับคอรูทีน ไม่ว่าจะถูกนำไปใช้ได้ดีเพียงใด ก็จะทำลายแนวคิดของตัวทำนายการแตกแขนง (branch predictor) เกี่ยวกับสแต็กการคืนค่าของคุณอย่างหลีกเลี่ยงไม่ได้ แต่ผลกระทบจากการคืนค่าที่ทำนายผิดจะถูกกระจายไปตลอดการทำงานของคอรูทีนเป้าหมาย แทนที่จะถูกรวมกันที่จุดของการสลับ สิ่งนี้เน้นย้ำถึงความยากในการสร้างเกณฑ์มาตรฐานที่เชื่อถือได้สำหรับระบบ async เนื่องจากผลกระทบต่อประสิทธิภาพอาจกระจายไปตลอดการทำงาน แทนที่จะปรากฏที่จุดวัดที่ชัดเจน
การสลับคอรูทีน ไม่ว่าจะถูกนำไปใช้ได้ดีเพียงใด ก็จะทำลายแนวคิดของตัวทำนายการแตกแขนงเกี่ยวกับสแต็กการคืนค่าของคุณอย่างหลีกเลี่ยงไม่ได้ แต่ผลกระทบจากการคืนค่าที่ทำนายผิดจะถูกกระจายไปตลอดการทำงานของคอรูทีนเป้าหมาย แทนที่จะถูกรวมกันที่จุดของการสลับ
การอภิปรายเผยให้เห็นว่าการกำหนดเกณฑ์มาตรฐานที่เหมาะสมจะต้องเปรียบเทียบเวลาการทำงานทั้งหมดของโปรแกรมที่ถูกผูกไว้กับการคำนวณ (compute-bound) ซึ่งสลับระหว่างงานอย่างต่อเนื่อง กับโปรแกรมที่ไม่ใช่ async ที่เทียบเท่าได้ โดยเฉพาะอย่างยิ่งกับสแต็กการเรียกที่ไม่เล็กน้อย (non-trivial call stacks) ซึ่งเป็นการตรวจสอบความถูกต้องของข้ออ้างประสิทธิภาพของ Zio ที่ท้าทายแต่จำเป็น
การอ้างสิทธิ์เปรียบเทียบประสิทธิภาพ:
- โหมดเธรดเดียวมีรายงานว่าเร็วกว่า Go และ Tokio ของ Rust
- การสลับบริบทถูกอธิบายว่า "แทบจะไม่มีค่าใช้จ่าย เทียบเท่ากับการเรียกใช้ฟังก์ชัน"
- โหมดหลายเธรดมีประสิทธิภาพใกล้เคียงกับ Go/Tokio พร้อมศักยภาพในการมีความเร็วที่เหนือกว่า
- หมายเหตุ: การอภิปรายในชุมชนเน้นย้ำถึงความท้าทายในการวัดประสิทธิภาพของ coroutine อย่างแม่นยำ
วิวัฒนาการของ Zig และการยอมรับในชุมชน
ช่วงเวลาที่ Zio ปรากฏตัวขึ้นตรงกับคำถามเกี่ยวกับความ成熟โดยรวมของ Zig สมาชิกในชุมชนบางส่วนแสดงความกังวลเกี่ยวกับการยอมรับ Zig ในช่วงเวลาที่ดูเหมือนว่าจะอยู่ในช่วงเปลี่ยนผ่าน นี่ไม่ใช่เวลาที่แย่ในการยอมรับ Zig หรอกหรือ? ขณะนี้มันกำลังผ่านการเปลี่ยนแปลงที่รุกล้ำของโมเดล I/O ของมัน ผู้แสดงความคิดเห็นหนึ่งตั้งคำถาม โดยแนะนำว่าอาจต้องใช้เวลาสองสามปีกว่าที่สิ่งต่างๆ จะลงตัว
ความกังวลนี้ได้รับการตอบโต้ด้วยข้อโต้แย้งที่ตรงไปตรงมาจากนักพัฒนาที่กำลังสร้างด้วยภาษานี้อยู่แล้ว สองสามปีคืออะไร? มันผ่านไปในชั่วพริบตา Zig เป็นภาษาที่ใช้งานได้อย่างสมบูรณ์ สมาชิกในชุมชนอีกคนตอบ สะท้อนให้เห็นถึงความแตกแยกระหว่างผู้ที่รอความมั่นคงและผู้ที่มีส่วนร่วมอย่างแข็งขันในวิวัฒนาการของ Zig ความตึงเครียดนี้สะท้อนให้เห็นรูปแบบทั่วไปในภาษาโปรแกรมที่เกิดขึ้นใหม่ ซึ่งผู้ใช้ในช่วงแรกจะปรับสมดุลระหว่างความสามารถในการใช้งานในปัจจุบันกับการเปลี่ยนแปลงในอนาคต
การประยุกต์ใช้จริงและระบบนิเวศของไลบรารี
เรื่องราวการพัฒนา Zio ให้ข้อมูลเชิงลึกเกี่ยวกับกรณีการใช้งานจริงที่ขับเคลื่อนวิวัฒนาการ async ของ Zig ไลบรารีนี้เกิดขึ้นจากความต้องการในทางปฏิบัติเมื่อผู้เขียนพบกับข้อจำกัดขณะเพิ่มอินเทอร์เฟซเซิร์ฟเวอร์ลงในระบบระบุเสียงของพวกเขา การเดินทางผ่านการนำไคลเอ็นต์ NATS ไปใช้ เผยให้เห็นถึงความต้องการโครงสร้างพื้นฐาน async ที่แข็งแรงยิ่งขึ้น ซึ่งในที่สุดก็นำไปสู่การสร้าง Zio
ปรัชญาการออกแบบของไลบรารีนี้เน้นความเรียบง่ายผ่านสิ่งที่ดูเหมือนจะเป็นโค้ดแบบซิงโครนัส ขณะที่จัดการการดำเนินการ async ที่ซับซ้อนในพื้นหลัง แนวทางนี้แก้ไขจุดที่มักเกิดปัญหาทั่วไปในการเขียนโปรแกรมแบบ async โดยเฉพาะ ความเจ็บปวดของระบบที่ใช้คอลแบ็ก และ การจัดสรรหน่วยความจำจำนวนมากที่จำเป็นสำหรับการจัดการสถานะข้ามคอลแบ็ก ความเข้ากันได้ของ Zio กับอินเทอร์เฟซตัวอ่าน/ตัวเขียนมาตรฐาน ทำให้ไลบรารีภายนอกสามารถทำงานภายในรันไทม์ของมันได้ โดยไม่รู้ตัวว่ากำลังทำงานในบริบท async ซึ่งมีศักยภาพที่จะเร่งการยอมรับในระบบนิเวศ
ในขณะที่ Zig ยังคงได้รับความนิยมผ่านโปรเจกต์ต่างๆ เช่น รันไทม์ JavaScript อย่าง Bun ไลบรารีอย่าง Zio ก็แสดงให้เห็นถึงความซับซ้อนที่เพิ่มขึ้นของระบบนิเวศของมัน การมีส่วนร่วมของชุมชนกับทั้งรายละเอียดทางเทคนิคและคำถามการยอมรับในวงกว้าง บ่งชี้ว่า Zig กำลังเปลี่ยนผ่านจากภาษาทดลองไปเป็นเครื่องมือทางปฏิบัติสำหรับการเขียนโปรแกรมระบบ โดยความสามารถ async เป็นเหตุการณ์สำคัญในเส้นทางนี้
การปรากฏตัวของ Zio และการอภิปรายที่เกี่ยวข้อง แสดงให้เห็นถึงการตรวจสอบของชุมชนอย่างมีสุขภาพดีเกี่ยวกับข้ออ้างด้านประสิทธิภาพ ขณะเดียวกันก็แสดงความตื่นเต้นอย่างแท้จริงสำหรับศักยภาพของ Zig ในการเขียนโปรแกรมเครือข่าย ขณะที่ภาษาพัฒนาต่อไป ความสมดุลระหว่างการสงสัยและความกระตือรือร้นนี้มีแนวโน้มที่จะขับเคลื่อนทั้งการนำไปใช้ที่ดีขึ้นและความคาดหวังที่สมจริงมากขึ้นสำหรับสิ่งที่ Zig สามารถส่งมอบได้ในภูมิทัศน์การแข่งขันของภาษาโปรแกรมระบบ
อ้างอิง: How I turned Zig into my favorite language to write network programs in
