อะไรทำให้ภาษาโปรแกรม Zig มีความโดดเด่น?
(erikexplores.substack.com)- ผู้เชี่ยวชาญเคยชี้ว่า "โค้ดที่สามารถรันได้ในช่วงคอมไพล์" เป็น "ไอเดียที่งี่เง่า" แต่ Andrew Kelley ผู้สร้าง Zig ก็ยังเดินหน้าต่อและลงมือทำจริง
- หลายปีต่อมา สิ่งนี้ได้กลายเป็นหนึ่งในฟีเจอร์เด็ดของ Zig
- ใน Zig สิ่งที่เรียกว่า
comptimeคือโค้ดที่ต้องรันในช่วงคอมไพล์- นักพัฒนา Zig สามารถอาศัยความสามารถในการรันโค้ด Zig ระหว่างการคอมไพล์ เพื่อเขียนโค้ดแบบ generic และทำ metaprogramming ได้ แม้จะไม่ต้องรองรับ generics/templates โดยตรง
2 ความคิดเห็น
มีปัญหาตั้งแต่ย่อหน้าแรกเลย... ในแวดวงภาษาโปรแกรมมิง การคำนวณขณะคอมไพล์คือสิ่งที่เรียกว่า multi-stage programming ซึ่งเป็นหนึ่งในวิธีการทำ metaprogramming ไม่ใช่ไอเดียที่โง่เขลาเลย
ภาษาที่ดันไปมีการทำ multi-stage programming แบบ "บังเอิญ" อย่าง C++ มักมีปัญหาที่โค้ดในแต่ละสเตจ (ในกรณีนี้คือช่วงคอมไพล์กับช่วงรันไทม์) แตกต่างกันอย่างมาก (ทุกวันนี้ C++ มี
constexprแล้ว แต่ก็ยังขาด ๆ เกิน ๆ อยู่ดี) แต่ Zig ออกแบบภาษามาตั้งแต่แรกโดยคำนึงถึง multi-stage programming ทำให้มีข้อดีคือสามารถใช้โค้ดที่แทบจะเหมือนกันได้ทั้งตอนคอมไพล์และตอนรันไทม์ ขณะเดียวกันก็มีข้อเสียคือมีสิ่งที่คาดเดาได้ล่วงหน้าในช่วงคอมไพล์ค่อนข้างน้อยคือว่า... ก็คงพอเข้าใจได้ว่าใช้
unittestที่เลี่ยงไม่ได้มารันดูก่อนตั้งแต่ตอนคอมไพล์แล้วดึงสิ่งที่มีแนวโน้มจะกลายเป็น runtime error ให้กลายมาเป็น compile error แทน... ประมาณนั้นนะครับ
พอดูเอกสารหรือถามตอบคร่าว ๆ แล้ว การที่มันสามารถมาแทนที่ C แบบ drop-in ได้ก็น่าสนใจมากเหมือนกัน ต่างจาก Rust ตรงที่ไวยากรง่ายกว่าก็ดีอยู่ แน่นอนว่าอาจจะไม่ปลอดภัยเท่า Rust... แต่ก็น่าจะให้ความรู้สึกโอเวอร์เอนจิเนียร์น้อยกว่าตอนใช้ Rust อยู่บ้าง ส่วน Go ก็ถูกพูดถึงเป็นตัวเปรียบเทียบเหมือนกัน แต่ในสถานการณ์ที่ฝั่ง Zig ซึ่งไม่มี runtime ดูจะเป็นภาระน้อยกว่า ก็น่าจะมีอยู่ โดยเฉพาะถ้าต้องลงไปทำงานระดับล่างกว่านี้ หรือไม่ได้จำเป็นต้องรองรับคำขอจำนวนมาก มันก็อาจเป็นตัวเลือกที่ทำให้อยากหยิบมาใช้มากกว่า Go ได้เหมือนกัน...
เพราะงั้นถ้ามันวางตำแหน่งตัวเองได้ดีระหว่าง Rust กับ Go ก็รู้สึกว่าอาจจะกลายเป็นตัวเลือกที่ดีกว่าที่คิดก็ได้ครับ