ภาษาโปรแกรม Zig เปิดตัวการเปลี่ยนแปลงครั้งใหญ่พร้อมปรับปรุงระบบ I/O ใหม่หมด

ทีมชุมชน BigGo
ภาษาโปรแกรม Zig เปิดตัวการเปลี่ยนแปลงครั้งใหญ่พร้อมปรับปรุงระบบ I/O ใหม่หมด

ภาษาโปรแกรม 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.readerstd.fs.File.deprecatedReader
  • std.fs.File.writerstd.fs.File.deprecatedWriter
  • std.fmtstd.fmt.deprecatedFormat
  • std.fmt.fmtSliceEscapeLowerstd.ascii.hexEscape
  • std.fmt.fmtSliceEscapeUpperstd.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