โลกของการเขียนโปรแกรมมีการพัฒนาที่ไม่เคยหยุดนิ่ง เมื่อบรรลุเป้าหมายยาก ๆ ได้ เหล่านักเขียนโปรแกรมก็จะเริ่มมุ่งหน้าสู่เป้าหมายใหม่ตัวอย่างเช่น การพัฒนาภาษาโปรแกรมมิ่งใหม่ ๆ เดิมทีเราก็มีภาษาที่แข็งแกร่งอยู่แล้ว อย่างเช่น C, C++, Rust และ Go แต่ตอนนี้เรากำลังจะมี "Zig" ซึ่งเป็นภาษาใหม่ที่พยายามนำเอาจุดเด่นของภาษาเหล่านี้มารวมกัน พร้อมทั้งยังมีประสิทธิภาพการทำงานที่เทียบเคียงกับภาษาเหล่านั้นด้วย
ในบทความนี้จะพาทุกคนมารู้จักกับ Zig ความหมาย, จุดเด่น, ความสามารถในการจัดการหน่วยความจำ, การทำงาน และอนาคตของภาษา Zig
ภาพจาก : https://en.wikipedia.org/wiki/Zig_%28programming_language%29
Zig เป็นภาษาเขียนโปรแกรมอเนกประสงค์ (General-Purpose Programming Language) แบบคอมไพล์ (Compiled Language) ที่ออกแบบมาเพื่อมอบประสิทธิภาพ, ความปลอดภัย และความเรียบง่าย เหมาะสำหรับการใช้เขียนระบบ, ซอฟต์แวร์แบบฝัง (Embedded Software) และ เว็บแอปพลิเคชัน (Web Application)
Zig เป็นโปรเจคที่ได้รับความสนใจจากเหล่านักพัฒนาเป็นอย่างมาก มันเริ่มต้นขึ้นโดย Andrew Kelley ในปี ค.ศ. 2015 (พ.ศ. 2558) เป็นภาษา Imperative, ใช้งานทั่วไป, มีการกำหนดชนิดข้อมูลแบบคงที่ (Static) และต้องคอมไพล์ โดยมีขนาดเล็ก, เขียนโปรแกรมได้ง่าย แต่มีฟังก์ชันการทำงานที่หลากหลาย Zig เป็น ซอฟต์แวร์แบบ เปิดเผยซอร์สโค้ด (Open-Source Software) แบบฟรี ภายใต้ใบอนุญาตจาก MIT
ภาพจาก Youtube : Interview with Zig language creator Andrew Kelley
ชื่อ "Zig" นั้นมีที่มาที่น่าสนใจอยู่พอสมควร ตามที่เล่ากันมาว่าชื่อนี้ถูกเลือกโดยใช้สคริปต์ภาษา Python สร้างคำขึ้นมาแบบสุ่ม โดยเริ่มต้นจากตัวอักษร 'Z' ตามด้วยสระหรือตัว 'Y' เพื่อสร้างคำสี่ตัวอักษร แม้ว่าตั้งใจจะได้คำสี่ตัว แต่สุดท้ายกลับเลือกคำว่า "Zig" ซึ่งเป็นคำสามตัวอักษรแทนนั่นเอง
และในช่วงที่ผ่านมานี้ดูเหมือนว่ามันจะได้รับความนิยมอย่างสูง ซึ่งเป้าหมายของ Zig นั้นมีความยิ่งใหญ่มากในประวัติศาสตร์ของซอฟต์แวร์ นั่นคือการเป็นทายาทสืบทอดภาษาระดับโลกอย่างภาษา C ซึ่งใช้งานมาหลายทศวรรษในฐานะภาษาพื้นฐานที่สะดวก และเป็นมาตรฐานที่ภาษาอื่น ๆ ถูกนำมาเปรียบเทียบอยู่บ่อยครั้ง
Zig เป็นภาษาที่ช่วยให้โปรแกรมเมอร์ทำงานกับหน่วยความจำของระบบได้โดยตรง ซึ่งเป็นสิ่งสำคัญสำหรับการเขียนโค้ดที่ทำงานได้อย่างมีประสิทธิภาพสูงสุด คล้ายกับภาษาตระกูล C, Rust และภาษาอื่น ๆ สำหรับระบบเบื้องล่าง แต่ Zig พยายามที่จะปรับปรุงให้ดีขึ้นในหลาย ๆ ด้าน
Zig ตั้งเป้าหมายที่จะเป็นภาษาสำหรับระบบที่ใช้งานง่ายกว่ารุ่นก่อน ๆ และช่วยให้เขียนโค้ดที่ปลอดภัยและถูกต้องง่ายมากขึ้น นอกจากนี้ยังมุ่งเน้นที่จะมอบประสบการณ์ที่ดีขึ้นให้กับนักพัฒนาโดยการลดความยุ่งยากที่พบในการเขียนซอฟต์แวร์แนว C ถึงแม้ว่าฟีเจอร์ของ Zig อาจจะดูไม่หวือหวามากนัก แต่โดยรวมแล้ว Zig เป็นแพลตฟอร์มที่ปลอดภัยกว่า และนักพัฒนาเรียนรู้ได้ง่ายกว่ามากนั่นเอง
ตัวอย่างการใช้งาน Zig ที่โดดเด่นคือ การสร้าง Bun.js ซึ่งเป็นรันไทม์สำหรับ JavaScript เป็นทางเลือกแทน Node.js ผู้สร้าง Bun.js คือ Jarred Sumner บอกว่า "Zig คล้ายกับการเขียน C แต่มีฟีเจอร์ด้านความปลอดภัยของหน่วยความจำที่ดีกว่าในโหมด Debug และมีฟีเจอร์สมัยใหม่ เช่น Defer (คล้ายกับ Go) และสามารถรันโค้ดได้ตั้งแต่ตอนคอมไพล์ด้วย Comptime นอกจากนี้แล้ว Zig ยังมีวากยสัมพันธ์ (Syntax) น้อยมาก ทำให้เรียนรู้ได้ง่ายกว่า C++ หรือ Rust"
ภาพจาก : https://jinoantony.com/blog/bunjs-a-new-js-runtime
สิ่งที่พิเศษของ Zig คือตัวภาษาเองไม่ได้จัดการการจัดสรรหน่วยความจำโดยตรง ซึ่งใน Zig ไม่มีคำสั่ง "Malloc" เหมือนใน C หรือ C++ แต่การเข้าถึงพื้นที่ (Heap) จะถูกจัดการอย่างชัดเจนในไลบรารีมาตรฐาน เวลาที่ต้องการฟีเจอร์นี้จะต้องส่งค่าเป็น "Object" ประเภท "Allocator" ผลที่ได้คือ ช่วยให้มองเห็นชัดเจนว่าไลบรารีต่าง ๆ กำลังใช้หน่วยความจำอยู่ ขณะเดียวกันก็แยกการจัดการออกไป ทำให้โค้ดของเราสามารถเลือกประเภทของ "Allocator" ที่เหมาะสมได้นั่นเอง
การทำให้การเข้าถึงหน่วยความจำเป็นลักษณะเด่นของไลบรารี จะช่วยหลีกเลี่ยงการจัดสรรหน่วยความจำแบบซ่อนเร้น (Hidden Allocation) ซึ่งมีประโยชน์สำหรับสภาพแวดล้อมที่มีทรัพยากรจำกัด และทำงานแบบเรียลไทม์ แทนที่การจัดการหน่วยความจำจะอยู่ในไวยากรณ์ของภาษาซึ่งอาจปรากฏได้ทุกที่ Zig ยกเอาส่วนนี้แยกออกไป ทำให้การจัดการหน่วยความจำชัดเจนยิ่งขึ้น
การอนุญาตให้โค้ดฝั่งผู้ใช้ระบุประเภทของ Allocator ที่ส่งเข้าไปใน API ทำให้โค้ดสามารถเลือกตามสภาพแวดล้อมที่ใช้งาน สิ่งนี้หมายความว่า โค้ดของไลบรารีจะชัดเจน และนำไปใช้ซ้ำได้ง่ายขึ้น แอปพลิเคชันสามารถกำหนดได้ว่าไลบรารีที่กำลังใช้งานจะเข้าถึงหน่วยความจำเมื่อใด ? และส่งประเภทของ Allocator ที่เหมาะสมที่สุดสำหรับรันไทม์นั้นให้ ไม่ว่าจะเป็นแบบฝังตัว (Embedded), เซิร์ฟเวอร์ หรือ WebAssembly เป็นต้น
ตัวอย่างเช่น ไลบรารีมาตรฐานของ Zig มาพร้อมกับตัวจัดสรรหน่วยความจำพื้นฐานที่เรียกว่า "Page Allocator" ซึ่งร้องขอหน่วยความจำจากระบบปฏิบัติการด้วยคำสั่ง " const allocator = std.heap.page_allocator; "
ภาพจาก : https://github.com/andrewrk/zig-general-purpose-allocator
นอกจากนี้ Zig ยังมีฟีเจอร์ด้านความปลอดภัยสำหรับป้องกันการล้นของบัฟเฟอร์ (Buffer Overflow) และยังมาพร้อมกับตัวจัดสรรหน่วยความจำสำหรับ Debug ที่ช่วยตรวจจับการรั่วไหลของหน่วยความจำอีกด้วย
การคอมไพล์ หรือการแปลงคำสั่งจากภาษาเขียนให้เป็นภาษาที่หน่วยประมวลผลเข้าใจ แบบเงื่อนไขใน Zig ช่วยให้ควบคุมว่าส่วนใดของโค้ดที่จะรวมอยู่ในโปรแกรมที่คอมไพล์เสร็จสมบูรณ์ โดยขึ้นอยู่กับเงื่อนไขที่กำหนด ต่างจากภาษา C ที่ใช้คำสั่ง Preprocessor หรือการเตรียมโปรแกรมแยกต่างหากที่ทำงานก่อนการคอมไพล์ เห็นได้ชัดว่า Zig นั้นมีความสามารถในการจัดการการคอมไพล์โค้ดได้ดีกว่า
แทนที่จะใช้ Macro (คำสั่งพิเศษที่ช่วยแทนที่ข้อความในโค้ดด้วยข้อความอื่น ๆ โดยอัตโนมัติระหว่างขั้นตอนการเตรียมโค้ด (Preprocessor) ซึ่งเกิดขึ้นก่อนการคอมไพล์จริง ๆ) แบบในภาษา C เช่น #define ทางคอมไพเลอร์ของ Zig จะประเมินว่าโค้ดส่วนไหนสามารถจัดการได้ตั้งแต่ตอนคอมไพล์ ตัวอย่างเช่น คำสั่ง If จะตัดสินใจลบเงื่อนไขที่ไม่จำเป็นออกตั้งแต่ตอนคอมไพล์เลย ถ้าเป็นไปได้
จุดเด่นอีกอย่างของ Zig ได้แก่คำสำคัญ (Keyword) คือ Comptime ซึ่งเป็นฟีเจอร์พิเศษของ Zig ช่วยให้โปรแกรมเมอร์เขียนโค้ดที่รันได้ตั้งแต่ตอนคอมไพล์แทนที่จะรอจนถึงรันไทม์ ปกติแล้วภาษาโปรแกรมทั่วไปจะอนุญาตให้ใช้ Generic (หรือ Template เป็นฟีเจอร์ของภาษาโปรแกรมที่ช่วยให้โปรแกรมเมอร์สามารถเขียนโค้ดที่ทำงานกับชนิดข้อมูลที่แตกต่างกันได้โดยไม่ต้องเขียนโค้ดซ้ำ) ได้ในเฉพาะช่วง Runtime (คือช่วงที่โปรแกรมทำงาน)
แต่ Zig ไปไกลกว่านั้นโดยอนุญาตให้ใช้ Generic กับโค้ดที่รันตอนคอมไพล์ด้วย ช่วยให้โปรแกรมเมอร์สามารถตรวจสอบชนิดข้อมูลของ Generic ได้อย่างละเอียดตั้งแต่ตอนคอมไพล์ สามารถช่วยเพิ่มประสิทธิภาพการทำงานของโปรแกรม โดยคำนวณค่าคงที่หรือค่าซ้ำ ๆ ไว้ล่วงหน้าตั้งแต่ตอนคอมไพล์ หรือตรวจสอบชนิดข้อมูลของ Generic นั้นถูกต้องตามที่ต้องการหรือไม่ก่อนสร้างโครงสร้างข้อมูล เหล่านี้ล้วนลดระยะเวลาการทำงานในรันไทม์ได้ ซึ่งจะส่งผลดีต่อประสิทธิภาพโดยรวม
Zig มีระบบจัดการข้อผิดพลาดที่เป็นเอกลักษณ์ ในฐานะที่เป็นส่วนหนึ่งของปรัชญาการออกแบบ "หลีกเลี่ยงการควบคุมการไหลแบบซ่อนเร้น (Avoid Hidden Control Flow)" ภาษา Zig จึงไม่ใช้คำสั่ง Throw เพื่อโยนข้อยกเว้น (Exception) ฟังก์ชัน Throw สามารถแยกการทำงานออกไปในลักษณะที่ติดตามได้ยากเกินไป
แทนที่ Zig จะอนุญาตให้คำสั่ง (Statement) และฟังก์ชันสามารถส่งคืนค่าเป็นประเภทข้อมูลของข้อผิดพลาด (Error Type) ซึ่งเป็นส่วนหนึ่งของ Union Yype ร่วมกับค่าที่ส่งคืนตามปกติ โค้ดสามารถใช้ Object ของข้อผิดพลาดเพื่อตอบสนองตามสถานการณ์ หรือใช้คำสำคัญ Try เพื่อส่งต่อข้อผิดพลาดขึ้นไป
Union Type ของข้อผิดพลาดมีไวยากรณ์เป็น ! สามารถดูตัวอย่างนี้ได้จากโค้ด "Hello, world" ง่าย ๆ ดังนี้
ภาพจาก : https://www.infoworld.com/article/2338081/meet-the-zig-programming-language.html
โค้ดส่วนใหญ่ในภาพนี้สามารถเข้าใจได้ ไวยากรณ์ !void มึความน่าสนใจ มันบอกว่าฟังก์ชันสามารถส่งคืนค่าได้ทั้ง Void หรือข้อ Error ซึ่งหมายความว่าถ้าฟังก์ชัน "main()" รันโดยไม่มีข้อผิดพลาด มันจะไม่ส่งคืนค่าอะไรเลย แต่ถ้าเกิดข้อผิดพลาด มันจะส่งคืน Object ของข้อผิดพลาด เพื่ออธิบายสถานการณ์ของข้อผิดพลาดนั้น
จะเห็นวิธีที่โค้ดฝั่งผู้ใช้สามารถใช้ Object ของข้อผิดพลาดได้ในบรรทัดที่มีคำสั่ง Try เนื่องจาก "stdout.print " สามารถส่งคืนค่าเป็นข้อผิดพลาดได้ นิพจน์ Try ในกรณีนี้หมายความว่า ข้อผิดพลาดจะถูกส่งต่อไปยังค่าที่ฟังก์ชัน "main()" ส่งคืน
ตัว Zig เองยังมีเครื่องมือ (Toolchain) สำหรับการ Build โปรแกรม ตัวอย่างเช่น เราสามารถ Build และ Run โปรแกรมที่ยกตัวอย่างจากภาพที่แล้ว ด้วยคำสั่งในภาพด้านล่างเลย
ภาพจาก : https://www.infoworld.com/article/2338081/meet-the-zig-programming-language.html
Zig อาจจะเข้าใจได้ง่ายกว่าเมื่อเทียบกับภาษา C เพราะเป็นภาษาอเนกประสงค์ ซึ่งในปัจจุบันนี้ โครงสร้างพื้นฐานเกือบทั้งหมดของการเขียนโปรแกรม อาศัยภาษา C ในหลาย ๆ ด้าน รวมถึงการเป็นพื้นฐานของภาษาโปรแกรมอื่น ๆ เช่น Java, JavaScript และ Python ลองนึกภาพผลกระทบเป็นลูกคลื่น หากเราเปลี่ยนไปใช้ภาษาที่คล้ายกับ C แต่ปลอดภัยกว่า, มีบั๊กน้อยกว่า และดูแลรักษาง่ายกว่า หาก Zig ได้รับการยอมรับในฐานะภาษาทางเลือกแทน C มันอาจส่งผลดีต่อระบบโดยรวมมหาศาลเลยทีเดียว
Zig มีศักยภาพที่จะกลายเป็นภาษาหลักสำหรับการเขียนซิสเต็มในอนาคต ด้วยความสามารถ และจุดเด่นที่กล่าวมา Zig มีโอกาสที่จะเข้ามาแทนที่ภาษา C ได้ในบางกรณี และกลายเป็นตัวเลือกยอดนิยมสำหรับนักพัฒนาซอฟต์แวร์
ภาพจาก : https://ziglang.org/download/0.9.0/release-notes.html
จุดเด่นของ Zig คือ มีฟีเจอร์ไม่เยอะจนเกินไป ซึ่งเป็นผลมาจากแนวคิดในการออกแบบที่ชัดเจน นั่นก็คือ "มีเพียงวิธีเดียวที่ชัดเจนในการทำสิ่งต่าง ๆ" นักพัฒนาของ Zig ยึดมั่นในแนวคิดนี้มาก จนกระทั่ง Zig ไม่มีลูป For เพราะมองว่าเป็นการขยายไวยากรณ์ที่ไม่จำเป็น นั่นเป็นเพราะว่ามีลูป While ให้ใช้งานอยู่แล้ว
Kevin Lynagh ผู้มีพื้นฐานมาจากภาษา Rust บอกว่า "ภาษา Zig มีขนาดเล็ก และสอดคล้องกันมาก หลังจากเรียนรู้เพียงไม่กี่ชั่วโมง ก็สามารถจำหลักการพื้นฐานได้มากพอที่จะทำงานได้ " และ Nathan Craddock นักพัฒนามาจาก C ก็เห็นด้วยเช่นกัน โปรแกรมเมอร์ส่วนใหญ่ชื่นชอบความกระชับ และเรียบง่ายของไวยากรณ์ของภาษา Zig ซึ่งทำให้พวกเขาใช้งานมันได้ง่ายมากยิ่งขึ้น
Zig มีจุดเด่นที่สามารถทำงานร่วมกับ C และ C++ ได้อย่างยอดเยี่ยม ตามเอกสารจากทาง Zig เองก็ยอมรับว่า "ในทางปฏิบัติ C ยังคงเป็นภาษาที่ใช้งานได้หลากหลาย และพกพาได้สะดวกที่สุด ภาษาใดก็ตามที่ไม่สามารถทำงานร่วมกับโค้ด C ย่อมเสี่ยงต่อการสูญหายไป"
Zig สามารถคอมไพล์โค้ด C และ C++ ได้ นอกจากนี้ยังมาพร้อมกับไลบรารี Libc สำหรับแพลตฟอร์มต่าง ๆ อีกด้วย Zig สามารถสร้างไลบรารีเหล่านี้ได้โดยไม่ต้องเชื่อมโยงกับไลบรารี Libc ภายนอก
ภาพจาก : https://zig.news/kristoff/compile-a-c-c-project-with-zig-368j
แม้ Zig จะเป็นภาษาที่มีจุดเด่นที่น่าสนใจ แต่ก็ยังคงมีจุดด้อยที่น่าเป็นห่วงอยู่บ้างดังนี้
Zig เน้นการปรับแต่งคอมไพล์ไทม์ เพื่อเพิ่มความปลอดภัย และประสิทธิภาพ ซึ่งอาจส่งผลให้ใช้ทรัพยากรประมวลผล (Performance) มากขึ้นเมื่อเทียบกับภาษาอย่าง C โดยเฉพาะสำหรับแอปพลิเคชันที่เน้นประสิทธิภาพสูง ๆ
ด้วยคุณสมบัติเฉพาะตัว และ Learning Curve ที่อาจจะสูงเพราะเป็นภาษาที่ใหม่ Zig อาจเหมาะกับการใช้งานเฉพาะด้าน เช่น การเขียนโปรแกรมระบบ (Systems Programming), ระบบแบบฝัง (Embedded Systems) หรือการคำนวณประสิทธิภาพสูง (High-Performance Computing) มากกว่าที่จะเป็นภาษาอเนกประสงค์ (General-Purpose) สำหรับโปรเจคทั่วไป
Zig ยังไม่ถูกนำไปใช้อย่างแพร่หลายในอุตสาหกรรม โดยเฉพาะโครงการขนาดใหญ่ขององค์กร บริษัทต่าง ๆ อาจลังเลที่จะนำไปใช้เนื่องจากกังวลเรื่องความเข้ากันได้, บุคลากรที่มีความสามารถมีน้อย, การสนับสนุนในระยะยาวยังน่าเป็นห่วง และยังมีการสนับสนุนจาก IDE ต่ำกว่าภาษาอื่น ๆ ส่งผลให้ภาษา Zig ยังไม่เป็นที่ยอมรับในมุมกว้างเท่าที่ควร
Zig มีชุมชนบน Discord และ GitHub ที่มีคึกคัก รวมทั้งเอกสารประกอบของ Zig เองนั้นค่อนข้างมีความละเอียด ผู้ใช้ Zig ยังร่วมกันสร้างสรรค์คลังเอกสารภายนอกจำนวนมากอีกด้วย
ในตอนนี้ Zig ยังคงเอยู่ในช่วงทดสอบอยู่ นั่นคือยังไม่อยู่ในรุ่น 1.0 แต่ผู้สร้างบอกว่ามันใกล้จะพร้อมสำหรับการใช้งานจริงแล้ว เกี่ยวกับความพร้อมใช้งานจริงนั้น ทางผู้พัฒนาของภาษา Zig เองก็ได้แจ้งว่าบางฟีเจอร์ยังอยู่ในช่วงพัฒนาอยู่ แต่ที่ไม่แนะนำให้ใช้ Zig เลยคือการจัดการข้อมูล (Data Wrangling) ซึ่งภาษาแบบ Dynamic อย่าง Python หรือ Julia น่าจะมีเหมาะสมกว่า
โดยรวมแล้ว Zig เป็นทางเลือกที่น่าสนใจทดแทน C นำเสนอบาลานซ์ระหว่างความง่าย, ความปลอดภัย, ประสิทธิภาพ และความหลากหลาย ฟีเจอร์ที่โดดเด่น และชุมชนที่แข็งแกร่ง ทำให้ Zig เป็นภาษาที่น่าจับตามองในอนาคตของวงการเขียนโปรแกรม
|