ภาษาโปรแกรมมิ่ง Zig ได้เปิดตัว linker ใหม่ที่ล้ำสมัยชื่อ Elf2 ที่ช่วยปรับปรุงความเร็วในขั้นตอนการพัฒนาอย่างมาก linker ที่สร้างขึ้นเองนี้เป็นก้าวสำคัญต่อเป้าหมายของ Zig ในการสร้าง compilation toolchain แบบบูรณาการที่สามารถเอาชนะเครื่องมือพัฒนาแบบดั้งเดิมได้
วิธีการเปิดใช้งาน Linker Elf2
- Command line: ใช้ flag
-fnew-linker
- Build script: ตั้งค่า
exe.use_new_linker = true
- อัตโนมัติ: เปิดใช้งานโดยอัตโนมัติด้วย
-fincremental
บนเป้าหมาย ELF - การรองรับปัจจุบัน: รองรับเฉพาะรูปแบบ ELF เท่านั้น (วางแผนเพิ่มแพลตฟอร์มอื่นๆ)
การปรับปรุงประสิทธิภาพที่เปลี่ยนแปลงขั้นตอนการพัฒนา
Linker Elf2 ใหม่ให้การปรับปรุงความเร็วที่น่าทึ่งสำหรับ incremental build เมื่อทำการเปลี่ยนแปลงโค้ดเล็กน้อยใน compiler ของ Zig เอง เวลาในการ build ลดลงจากประมาณ 750-850 มิลลิวินาทีด้วย linker เก่าเหลือเพียง 72-73 มิลลิวินาทีด้วย Elf2 ซึ่งแสดงถึงการปรับปรุงความเร็วในการ incremental compilation ถึง 11 เท่า
สิ่งที่น่าประทับใจมากกว่านั้นคือประสิทธิภาพนี้ใกล้เคียงกับการข้าม code generation ทั้งหมด เมื่อนักพัฒนาปิดใช้งานทั้ง backend และ linker อย่างสมบูรณ์ incremental build ใช้เวลาประมาณ 69-70 มิลลิวินาที linker ใหม่เพิ่ม overhead เพียง 4% เมื่อเปรียบเทียบกับการ type-checking เพียงอย่างเดียว ทำให้ขั้นตอน build แบบ -Dno-bin
แบบดั้งเดิมเกือบจะไม่จำเป็น
การเปรียบเทียบประสิทธิภาพ: Linker เก่า vs ใหม่
สถานการณ์ | Linker เก่า | Linker ใหม่ (Elf2) | Type-check เท่านั้น |
---|---|---|---|
การ build ครั้งแรก | 18s | 18s | 17s |
การ build แบบ Incremental ครั้งที่ 1 | 754ms | 73ms | 70ms |
การ build แบบ Incremental ครั้งที่ 2 | 858ms | 72ms | 69ms |
การปรับปรุงความเร็ว | Baseline | เร็วขึ้น 11 เท่า | เร็วขึ้น 11.6 เท่า |
Overhead เทียบกับ type-check | ~1100% | ~4% | 0% |
ชุมชนถกเถียงปรัชญาการออกแบบของ Zig
การประกาศ linker ใหม่ได้จุดประกายการอพิพากษาที่กว้างขึ้นเกี่ยวกับทิศทางโดยรวมของ Zig นักพัฒนาบางคนชื่นชมแนวทางแบบ vertically integrated ของภาษานี้ โดยสังเกตเห็นว่าคอมโพเนนต์ที่กำหนดเองเช่น linker นี้ช่วยให้เกิดการปรับปรุงประสิทธิภาพที่เป็นเอกลักษณ์ซึ่งเป็นไปไม่ได้กับ toolchain แบบดั้งเดิม ส่วนคนอื่นแสดงความกังวลเกี่ยวกับตัวเลือกการออกแบบบางอย่าง โดยเฉพาะเรื่องการจัดการ interface และสิ่งที่บางคนมองว่าเป็นความซับซ้อนที่ไม่จำเป็น
ยิ่งฟังเรื่อง Zig มากเท่าไหร่ ยิ่งชื่นชมมากเท่านั้น stack แบบ vertically integrated (ด้วย custom linker และ code-generation backends) โดดเด่นสำหรับผมในฐานะฟีเจอร์ที่น่าสนใจจริงๆ ที่ช่วยให้เกิดการปรับปรุงประสิทธิภาพที่น่าสนใจ
ชุมชนยังคงแบ่งแยกเกี่ยวกับการเปลี่ยนแปลงล่าสุดในระบบ IO ของ Zig ซึ่งตอนนี้พึ่งพา interface มากขึ้นแม้ว่าภาษานี้จะไม่สนับสนุนการใช้งานมาโดยตลอด สิ่งนี้สร้างความตึงเครียดระหว่างปรัชญาที่ระบุไว้ของภาษากับความต้องการในการใช้งานจริง
ศักยภาพ Cross-Platform Toolchain
นอกเหนือจากการพัฒนา Zig แบบบริสุทธิ์แล้ว linker ใหม่ยังทำให้ Zig ใกล้เคียงกับการเป็นโซลูชัน cross-compilation ที่สมบูรณ์สำหรับโปรเจกต์ C และ C++ นักพัฒนาหลายคนใช้ Zig เป็น drop-in replacement สำหรับ cross-compiler แบบดั้งเดิมอยู่แล้วเนื่องจากความเรียบง่ายเมื่อเปรียบเทียบกับการจัดการ toolchain แยกต่างหากสำหรับแพลตฟอร์มต่างๆ
Linker Elf2 ปัจจุบันทำงานกับ ELF target และเปิดใช้งานโดยอัตโนมัติเมื่อใช้โหมด incremental compilation นักพัฒนายังสามารถเปิดใช้งานด้วยตนเองผ่าน command-line flag หรือการตั้งค่า build script เมื่อการสนับสนุนขยายไปยังแพลตฟอร์มและรูปแบบไฟล์มากขึ้น สิ่งนี้อาจทำให้ Zig กลายเป็นทางเลือกที่จริงจังต่อการรวมกัน toolchain ที่มีอยู่
การปรับปรุงประสิทธิภาพแสดงให้เห็นว่าการออกแบบ linker สมัยใหม่สามารถขจัดคอขวดแบบดั้งเดิมในวงจรการพัฒนาได้ ด้วย incremental build ที่ใช้เวลาต่ำกว่า 100 มิลลิวินาที นักพัฒนาสามารถรักษา feedback loop ที่แน่นขึ้นมากในระหว่างเซสชันการเขียนโค้ดที่ใช้งานอยู่