ภาษาโปรแกรม Zig ได้เปิดตัวชุดการเปลี่ยนแปลงที่สำคัญอีกครั้งในการอัปเดตล่าสุด โดยปรับปรุงระบบ input/output (I/O) ใหม่หมด การเปลี่ยนแปลงนี้ที่เรียกว่า Writergate #24329 ถือเป็นหนึ่งในการปรับเปลี่ยนที่สำคัญที่สุดของ standard library ของภาษานี้ และได้จุดประกายการถกเถียงอย่างเข้มข้นในชุมชนนักพัฒนาเกี่ยวกับความสมดุลระหว่างนวัตกรรมและความเสถียร
การอัปเดตนี้แทนที่ I/O readers และ writers เดิมทั้งหมดด้วยเวอร์ชัน non-generic ใหม่ที่สัญญาว่าจะให้ประสิทธิภาพและการปรับแต่งที่ดีกว่า ระบบใหม่ย้าย buffers ไปอยู่เหนือ vtable หมายความว่า buffer ตอนนี้เป็นส่วนหนึ่งของ interface แทนที่จะเป็น implementation การเปลี่ยนแปลงทางสถาปัตยกรรมนี้ช่วยให้สามารถปรับแต่งได้อย่างโปร่งใสในขณะที่ยังคงรักษา concrete hot paths สำหรับการทำงานของ buffer
การเปลี่ยนแปลง API หลักในการอัปเดต Writergate:
std.fs.File.reader
→std.fs.File.deprecatedReader
std.fs.File.writer
→std.fs.File.deprecatedWriter
std.fmt
→std.fmt.deprecatedFormat
std.fmt.fmtSliceEscapeLower
→std.ascii.hexEscape
std.fmt.fmtSliceEscapeUpper
→std.ascii.hexEscape
- การเปลี่ยนแปลง signature ของ Format method จาก
anytype.*
เป็น*std.io.Writer
- การเปลี่ยนแปลงการจัดการข้อผิดพลาดจาก inferred error set เป็น
error(WriteFailed)
ชุมชนแบ่งแยกเรื่องปรัชญาการเปลี่ยนแปลง
ชุมชนนักพัฒนายังคงแบ่งแยกอย่างลึกซึ้งเกี่ยวกับแนวทางของ Zig ในการเปลี่ยนแปลงบ่อยครั้ง นักพัฒนาหลายคนแสดงความไม่พอใจกับความจำเป็นในการอัปเดตโค้ดอย่างต่อเนื่อง โดยเฉพาะผู้ที่ทำงานบนระบบฝังตัวและไมโครคอนโทรลเลอร์ที่ความเสถียรเป็นสิ่งสำคัญ บางคนได้ละทิ้งโปรเจกต์ Zig ไปเลย โดยอ้างถึงภาระในการดูแลรักษาเพื่อให้ทันกับการเปลี่ยนแปลงของภาษา
อย่างไรก็ตาม ผู้สนับสนุนโต้แย้งว่าการเปลี่ยนแปลงเหล่านี้จำเป็นสำหรับสุขภาพของภาษาในระยะยาว บริษัทอย่าง TigerBeetle ที่ใช้ Zig ในการผลิต ได้รับการอัปเดตเหล่านี้อย่างแข็งขัน พวกเขามองการเปลี่ยนแปลงเหล่านี้เป็นหลักฐานของการตัดสินใจออกแบบที่รอบคอบซึ่งจะเป็นประโยชน์ต่อภาษาในทศวรรษที่จะมาถึง
นี่คือเหตุผลที่เราเลือก Zig การตัดสินใจออกแบบของ Andrew ในภาษานี้มักจะไร้ที่ติเสมอ
ความแบ่งแยกนี้เน้นให้เห็นความตึงเครียดพื้นฐานในการพัฒนาภาษาโปรแกรมระหว่างการเคลื่อนไหวอย่างรวดเร็วเพื่อแก้ไขปัญหาการออกแบบและการรักษาความเสถียรสำหรับผู้ใช้ที่มีอยู่
การปรับปรุงทางเทคนิคและฟีเจอร์ใหม่
ระบบ I/O ใหม่นำเสนอแนวคิดนวัตกรรมหลายอย่างที่ไม่พบบ่อยในภาษาโปรแกรมอื่น ระบบนี้รวมถึงแนวคิด discarding สำหรับการอ่าน ซึ่งช่วยให้สามารถข้ามข้อมูลได้อย่างมีประสิทธิภาพโดยไม่ต้องประมวลผล สำหรับการเขียน มันนำเสนอ splatting - การดำเนินการ logical memset ที่สามารถผ่าน I/O pipelines ได้โดยไม่ต้องคัดลอกหน่วยความจำ ซึ่งอาจเปลี่ยนการดำเนินการที่มีราคาแพง O(MN) ให้เป็น O(M)
การอัปเดตยังเพิ่มความสามารถในการจัดการไฟล์ใหม่ที่จดจำข้อมูลสำคัญเกี่ยวกับ file handles รวมถึงขนาดจาก stat calls ตำแหน่ง seek ปัจจุบัน และสถานะข้อผิดพลาด แนวทางนี้ให้ concrete type สำหรับการส่งผ่านข้อมูลไฟล์ ซึ่งนักพัฒนารายงานว่ามีประโยชน์อย่างยิ่งในทางปฏิบัติ
หมายเหตุ: vtable (virtual table) เป็นกลไกที่ใช้ในการโปรแกรมเพื่อสนับสนุน dynamic dispatch ของการเรียกใช้ฟังก์ชัน
คุณสมบัติใหม่ของระบบ I/O:
- การออกแบบแบบไม่ใช้ generic: ย้าย Buffer ไปไว้เหนือ vtable เพื่อการปรับแต่งที่ดีกว่า
- แนวคิดการทิ้งข้อมูล (Discarding): การข้ามข้อมูลอย่างมีประสิทธิภาพระหว่างการอ่านโดยไม่ต้องประมวลผล
- การดำเนินการ Splatting: memset เชิงตรรกะที่ส่งผ่านไปยัง I/O pipeline โดยไม่ต้องคัดลอกหน่วยความจำ
- การจดจำไฟล์ (File memoization): การแคชอัตโนมัติของขนาดไฟล์ ตำแหน่ง seek และสถานะข้อผิดพลาด
- การคัดลอก fd-to-fd โดยตรง: รองรับการดำเนินการแบบ sendfile เมื่อ OS รองรับ
- บัฟเฟอร์ที่ผู้ใช้จัดหาให้: ผู้ใช้ Stream จัดหาบัฟเฟอร์ในขณะที่การใช้งานจริงตัดสินใจขนาดต่ำสุด
ข้อกังวลการใช้งานในการผลิต
ความถี่ของการเปลี่ยนแปลงทำให้เกิดคำถามเกี่ยวกับความพร้อมของ Zig สำหรับการใช้งานในการผลิต ภาษานี้ยังคงอยู่ในเวอร์ชัน 0.14 ซึ่งบ่งชี้ว่ายังไม่ถึงการเปิดตัวเสถียรครั้งแรก สถานะ pre-1.0 นี้หมายความว่าการเปลี่ยนแปลงเป็นสิ่งที่คาดหวัง แต่ขอบเขตและความถี่ยังคงเป็นข้อกังวลของนักพัฒนาหลายคน
บางคนโต้แย้งว่าหมายเลขเวอร์ชันต่ำกว่า 1.0 ได้สูญเสียความหมายแบบดั้งเดิมไปแล้ว โดยชี้ไปที่โปรเจกต์ที่ประสบความสำเร็จซึ่งรักษาเวอร์ชัน 0.x ไว้เป็นระยะเวลานาน คนอื่นโต้แย้งว่าเป้าหมาย 1.0 ที่มีเอกสารดีของ Zig ชี้แจงความไม่เสถียรปัจจุบัน ในขณะที่ภาษาทำงานไปสู่เป้าหมายเฉพาะรวมถึงฟังก์ชัน async/await
ความเสี่ยงของการแยกส่วนระบบนิเวศเป็นเรื่องใหญ่ โดยนักพัฒนากังวลเกี่ยวกับ prisoner's dilemma ที่ผู้ดูแล package ต้องเผชิญ ซึ่งต้องเลือกระหว่างการสนับสนุนเวอร์ชันเก่าหรือก้าวไปข้างหน้าด้วยการเปลี่ยนแปลง
มองไปข้างหน้า
การปรับปรุง I/O ครั้งนี้เป็นส่วนหนึ่งของชุดการเปลี่ยนแปลงที่ใหญ่กว่าที่นำไปสู่การใช้งาน async/await ของ Zig และเป้าหมาย I/O as an Interface ทีมพัฒนาได้ระบุว่าการเปลี่ยนแปลงเพิ่มเติมจะตามมาขณะที่พวกเขาทำงานผ่านระบบที่เกี่ยวข้องรวมถึง TLS, HTTP, JSON และการจัดการ package
ความมุ่งมั่นของทีม Zig ในการทำให้การออกแบบพื้นฐานถูกต้องก่อนการเปิดตัว 1.0 สะท้อนวิสัยทัศน์ระยะยาวของพวกเขาสำหรับภาษา ว่าแนวทางนี้จะเป็นประโยชน์หรือเป็นอุปสรรคต่อการยอมรับในที่สุดยังคงต้องติดตาม แต่เป็นที่ชัดเจนว่า Zig ให้ความสำคัญกับความเป็นเลิศทางเทคนิคมากกว่าข้อกังวลเรื่องความเสถียรระยะสั้น
อ้างอิง: Writergate #24329