รีวิวภาษาโปรแกรม V
- นี่คือบทความรีวิวที่ผู้เขียนทดสอบฟีเจอร์ต่าง ๆ ที่ภาษา V เคยโฆษณาไว้ด้วยตนเองในปี 2022 ซึ่งผ่านมาหลายปีหลังจากภาษา V เปิดตัว
- ผู้เขียนแบ่งผลการประเมินฟีเจอร์เป็น ใช้งานไม่ได้, คำเตือน, และใช้งานได้ โดยด้านล่างคือผลลัพธ์ของรายการประเมินนั้น ตัวอย่างโค้ดสำหรับการประเมินและเหตุผลประกอบทั้งหมดอยู่ในเนื้อหาหลัก
- รายการด้านล่างนี้เป็นการแปลระหว่างฝึกภาษาอังกฤษ จึงอาจมีข้อผิดพลาดด้านข้อเท็จจริง โปรดใช้เพื่อการอ้างอิงเท่านั้น
- ภาษาที่เรียบง่ายและดูแลรักษาง่าย
- เป็นข้ออ้างเชิงอัตวิสัย
- N/A
ความปลอดภัย
- ไม่มี null
- ภาษา V สามารถสร้าง null pointer (V reference) ได้โดยไม่มี compiler error หรือ warning
- ไม่รองรับ
- ไม่มี undefined value
- สามารถอ่านหน่วยความจำที่ยังไม่ได้ initialize ได้โดยไม่มี compiler error หรือ warning
- ไม่รองรับ
- ไม่มี undefined behavior
- คอมไพเลอร์ V ไม่ได้ป้องกันการเขียน UB ได้ 3 รูปแบบที่แตกต่างกัน และ UB ก็เกิดขึ้นจริง
- ไม่รองรับ
- ไม่มี variable shadowing (ปรากฏการณ์ที่ชื่อถูกบังเมื่อมีชื่อเดียวกันในคนละ namespace)
- ไม่สามารถบังตัวแปร local ได้
- ไม่รองรับ
- การตรวจ bounds
- มีการตรวจพื้นฐานอยู่บ้าง แต่สามารถ bypass ได้อย่างง่ายดาย
- คำเตือน
- ตัวแปรเป็นค่าคงที่โดยปริยาย
- ตัวแปรไม่ได้เป็นค่าคงที่ที่มีความหมายจริง ๆ สามารถเปลี่ยนแปลงค่าคงที่ต้นฉบับได้อย่างง่ายดายโดยกำหนด reference แบบค่าคงที่ให้กับตัวแปรที่ประกาศเป็น
mut แล้วแก้ไขตัวแปรนั้น
- ไม่รองรับ
- ฟังก์ชันบริสุทธิ์เป็นค่าปริยาย
- ข้ออ้างนี้ไม่มีความหมาย เพราะเป็นการนิยามความบริสุทธิ์ใหม่ให้หมายถึงความไม่บริสุทธิ์
- (ผู้เขียนชี้ว่า การรองรับฟังก์ชัน I/O นั้นโดยเนื้อแท้ย่อมไม่บริสุทธิ์อยู่แล้ว และแม้เอกสารจะบอกว่าฟังก์ชันทั้งหมดยกเว้น I/O เป็นฟังก์ชันบริสุทธิ์ แต่เขาระบุว่าเมื่อสามารถเรียกฟังก์ชัน I/O ได้ ฟังก์ชันเหล่านั้นก็ไม่บริสุทธิ์แล้ว จึงดูเหมือนเขาหมายความว่าความหมายเดิมถูกกลบไป ในเนื้อหาหลักมีตัวอย่างตลก ๆ ที่ฟังก์ชันบริสุทธิ์ปล่อยค่าที่ไม่บริสุทธิ์ออกมา)
- ไม่รองรับ
- struct เป็นค่าคงที่โดยปริยาย
- ได้พิสูจน์ไปแล้วด้านบนว่าสามารถหลบเลี่ยงตัวแปรค่าคงที่ได้
- ไม่รองรับ
- มีการบังคับตรวจ error สำหรับ Option และค่าผลลัพธ์ของมัน
- Sum types (เป็นไวยากรณ์แบบ
type MyType = string | int)
- โดยทั่วไป Sum Types ดูเหมือนจะทำงานได้ แต่มีปัญหาในการ implement ภายใน (ด้วยการสร้าง type เพิ่มอีกสองตัว ทำให้สามารถใช้ reference ที่ภาษา V ปกติห้ามไว้เป็น Sum Types ได้)
- คำเตือน
- การทำให้เป็นทั่วไป (Generics)
- มี implementation พื้นฐานอยู่ แต่เต็มไปด้วยบั๊กอย่างมาก และดูเหมือนไม่สอดคล้องเลยกับเรื่องความปลอดภัยและประสิทธิภาพของคอมไพเลอร์ที่มันยกขึ้นมาเน้นเอง
- ไม่รองรับ
- ไม่มี global variable
- V ไม่ได้ป้องกันการสร้างหรือเปลี่ยนแปลงสถานะที่ถูกแชร์ทั่วโลกในทางที่มีความหมายแต่อย่างใด
- ไม่รองรับ
ประสิทธิภาพ
- เร็วเท่า C (คอมไพเลอร์ backend หลักของ V คือโค้ดภาษา C ที่มนุษย์อ่านได้)
- ข้ออ้างเรื่องประสิทธิภาพของ V ดูเหมือนยังไม่ได้รับการพิสูจน์
- ไม่รองรับ
- ทำงานร่วมกับ C ได้โดยไม่มีค่าใช้จ่ายเพิ่มเติม
- ลดการ allocation ให้ต่ำที่สุด
- เป็นข้ออ้างเชิงอัตวิสัย
- N/A. (ผู้เขียนแสดงให้เห็นว่าเมื่อโค้ด V ที่ประกาศ
int ถูกแปลเป็นภาษา C ผลลัพธ์ในฝั่ง C กลับเป็น int ที่ถูก malloc)
- มี serialization ในตัวโดยไม่ต้องใช้ runtime reflection
- คอมไพล์เป็น native binary ที่ไม่มี dependency ใด ๆ
- ดูเหมือนว่า V ยังทำข้ออ้างนี้ไม่สำเร็จ แต่ในภาพรวมก็มีความจริงอยู่บ้างว่าโปรแกรม V ค่อนข้างพึ่งพาตัวเองได้และมีขนาดเล็ก
- คำเตือน
คอมไพล์เร็ว
- V คอมไพล์ได้ 1 ล้านบรรทัดต่อวินาที และต่อหนึ่ง CPU core
- คอมไพเลอร์ V ยังไปไม่ถึงระดับประสิทธิภาพตามที่อ้างไว้เลย (แม้แต่บนเว็บไซต์ benchmark ของคอมไพเลอร์ V เองก็อยู่ที่ประมาณการคอมไพล์โค้ด V 200,000 บรรทัด)
- ไม่รองรับ
- V เขียนด้วย V และสามารถคอมไพล์ตัวเองได้ในเวลาต่ำกว่า 1 วินาที
- การจัดการหน่วยความจำแบบนวัตกรรม
- ข้ออ้างของ V ไม่มีหลักฐานรองรับที่ดี และ implementation ที่มีอยู่ในปัจจุบันก็ไม่อาจอธิบายได้ว่าเป็นนวัตกรรม
- ไม่รองรับ
1 ความคิดเห็น
อันที่จริงเป็นที่รู้กันทั่วไปว่า V ยังอีกไกล แต่บทความนี้เขียนกระบวนการพิสูจน์ว่า "ยังอีกไกล" ไว้ได้ดีมาก ลองเลือกประเด็นที่คุณสนใจจากรายการ แล้วตรวจดูการพิสูจน์ในส่วนนั้นสักครั้งดู