บทความล่าสุดที่กล่าวถึงจุดยากลำบากในการใช้ OCaml สำหรับการพัฒนา compiler ได้จุดประกายการอภิปรายอย่างคึกคักภายในชุมชนนักพัฒนาโปรแกรม ขณะที่นักพัฒนาเปรียบเทียบประสบการณ์ของพวกเขากับภาษาเช่น Rust และ Standard ML มีหลายประเด็นสำคัญที่ปรากฏชัดเกี่ยวกับจุดแข็ง จุดอ่อน และระบบนิเวศที่กำลังพัฒนาของภาษา
ความแตกแยกเรื่องไวยากรณ์: รักมันหรือเกลียดมัน
ไวยากรณ์ของ OCaml ได้กลายเป็นจุดโต้แย้งในหมู่นักพัฒนา แม้ว่าบทความต้นฉบับจะวิจารณ์การขาดเครื่องหมายวรรคตอนและความกำกวมของคำสั่ง match ที่ซ้อนกัน แต่การตอบสนองจากชุมชนกลับเผยให้เห็นภาพที่ละเอียดลึกซึ้งยิ่งขึ้น นักพัฒนา OCaml ที่มีประสบการณ์หลายคนแย้งว่าไวยากรณ์จะกลายเป็นเรื่องธรรมชาติเมื่อใช้ไปนาน ๆ โดยเปรียบเทียบความรู้สึกไม่คุ้นเคยในตอนแรกกับการเรียนรู้กระบวนทัศน์การเขียนโปรแกรมใหม่ใด ๆ การอภิปรายนี้ชี้ให้เห็นว่าความชอบในไวยากรณ์มักขึ้นอยู่กับพื้นฐานและประสบการณ์ที่เคย接触กับภาษาตระกูลต่าง ๆ ของนักพัฒนา
ผู้แสดงความคิดเห็นบางคนระบุว่าไวยากรณ์ตระกูล ML นำเสนอข้อได้เปรียบด้านการอ่านที่独特 เมื่อนักพัฒนาผ่านเส้นโค้งการเรียนรู้ในตอนแรกแล้ว การถกเถียงนี้ขยายไปไกลกว่า OCaml เพื่อรวมการเปรียบเทียบกับ Standard ML และแม้แต่ Erlang ชี้ให้เห็นว่าสิ่งที่บางคนรับรู้ว่าเป็นไวยากรณ์ที่แปลกประหลาด กลับถูกมองว่าสวยงามและมีความ expressive โดยคนอื่น ๆ ความแตกแยกนี้แสดงให้เห็นว่าความชอบส่วนบุคคลต่อไวยากรณ์สามารถเป็นอย่างไรในการออกแบบภาษาโปรแกรม
จุดเปรียบเทียบภาษา
- Type Inference: OCaml (global inference) เทียบกับ Rust (local inference ที่ต้องระบุ function annotations)
- รูปแบบ Syntax: ตระกูล ML (OCaml) เทียบกับความชอบ syntax ตระกูล C (Rust)
- ข้อความแสดงข้อผิดพลาด: ทั้งสองภาษาต่างเผชิญความท้าทายกับข้อผิดพลาดของ type ที่ซับซ้อน
- ความเสถียรของ Ecosystem: OCaml ได้รับคำชมในเรื่องความเสถียรของ C interface ขณะที่ Rust มีการเปลี่ยนแปลงที่ทำให้เกิด breaking changes บ่อยครั้งในบางพื้นที่
การประนีประนอมของระบบชนิดข้อมูล: การอนุมาน vs ความชัดเจน
ระบบการอนุมานชนิดข้อมูล (type inference) ที่ซับซ้อนของ OCaml ได้สร้างการอภิปรายอย่างมีนัยสำคัญเกี่ยวกับความสมดุลระหว่างความสวยงามและความแข็งแกร่ง ในขณะที่ผู้เขียนต้นฉบับชอบข้อกำหนดของ Rust ที่ให้ใส่คำอธิบายชนิดข้อมูล (type annotations) อย่างชัดเจนบนพารามิเตอร์ฟังก์ชัน สมาชิกในชุมชนหลายคนกลับปกป้องแนวทางของ OCaml พวกเขาแย้งว่า OCaml ประนีประนอมได้อย่างสมเหตุสมผลโดยอนุญาตให้ใส่คำอธิบายเพิ่มเติมได้แบบเลือกได้ ในขณะที่ยังคงความสามารถในการอนุมานอันทรงพลัง
โมเดลของ OCaml นั้นใกล้เคียงกับจุดที่เหมาะสมที่สุด: คุณยังสามารถใส่คำอธิบายเพิ่มเติมให้ฟังก์ชันได้ และบางทีคุณก็ควรทำ แต่ประโยชน์หลักคือคุณสามารถใช้ช่องว่าง (holes) ในการนิยามเช่นนั้นได้ด้วย
มุมมองนี้ชี้ให้เห็นว่าระบบชนิดข้อมูลของ OCaml นำเสนอความยืดหยุ่นที่อาจมีค่าอย่างยิ่งในสถานการณ์ที่มีชนิดข้อมูลซับซ้อน เช่น เมื่อทำงานกับ nested generic types ที่การใส่คำอธิบายเพิ่มเติมอย่างชัดเจนในภาษาอื่นอาจกลายเป็นเรื่องยาวเหยียด การอภิปรายเผยให้เห็นความตึงเครียดอย่างต่อเนื่องระหว่างความต้องการโค้ดที่กระชับ กับความต้องการลายเซ็นชนิดข้อมูลที่ชัดเจนและบำรุงรักษาได้ใน codebase ขนาดใหญ่
วิวัฒนาการของระบบนิเวศและการปรับปรุงเครื่องมือพัฒนา
ภูมิทัศน์เครื่องมือพัฒนา OCaml ได้เห็นการปรับปรุงอย่างมากในช่วงไม่กี่ปีที่ผ่านมา โดยมี Dune ปรากฏขึ้นในฐานะระบบการ build ที่成熟แล้ว เทียบเคียงได้กับ Cargo ของ Rust อย่างไรก็ตาม การอภิปรายในชุมชนชี้ให้เห็นถึงความท้าทายอย่างต่อเนื่องเกี่ยวกับการแตกแยกของระบบนิเวศภาษา การครอบงำของไลบรารีทางเลือก Core ของ Jane Street แทนที่ standard library ยังคงเป็นหัวข้อที่ถกเถียงกัน โดยนักพัฒนาแตกแยกในประเด็นว่านี่แสดงถึงความหลากหลายที่ดีหรือการแตกแยกที่เป็นปัญหา
ผู้แสดงความคิดเห็นหลายคนกล่าวว่า PPX derivers ได้ปรับปรุงคุณสมบัติที่เพิ่มความสะดวกสบายในการใช้ชีวิตอย่างมีนัยสำคัญ เช่น การพิมพ์การ implement อัตโนมัติ ซึ่งเป็นการแก้ไขข้อร้องเรียนหนึ่งจากบทความต้นฉบับ การอภิปรายยังกล่าวถึงความเสถียรของ OCaml เมื่อเทียบกับภาษาอื่น โดยนักพัฒนาบางคนระบุว่า OCaml รักษาความเข้ากันได้ย้อนหลังได้ดีกว่า Rust ในบางด้าน โดยเฉพาะอย่างยิ่งเกี่ยวกับความเสถียรของอินเทอร์เฟซ C
ระบบนิเวศเครื่องมือของ OCaml
- Dune: ระบบ build สมัยใหม่ที่เทียบเคียงได้กับ Cargo ของ Rust
- Menhir: ตัวสร้าง parser (ตัวทดแทนที่ดีกว่าของ ocamlyacc)
- ocamllex: ตัวสร้าง lexer
- ppx_deriving: ส่วนขยายไวยากรณ์สำหรับการสร้างฟังก์ชันอัตโนมัติ
- Core: ไลบรารีมาตรฐานทางเลือกจาก Jane Street
เส้นโค้งการเรียนรู้และการประนีประนอมด้านผลผลิต
ผู้แสดงความคิดเห็นหลายคนยอมรับว่า OCaml นำเสนอเส้นโค้งการเรียนรู้ที่สูงชัน โดยเฉพาะสำหรับนักพัฒนาที่มาจากพื้นฐานการเขียนโปรแกรมแบบ imperative การเปลี่ยนกระบวนทัศน์ ร่วมกับข้อความแสดงข้อผิดพลาดที่ในตอนแรกเข้าใจยาก สามารถทำให้ผู้มาใหม่รู้สึกโง่และ/หรือไม่เกิดผลผลิตเป็นเวลานานมาก ตามที่นักพัฒนาคนหนึ่งระบุ อย่างไรก็ตาม ผู้ที่ยืนหยัดอยู่มักพบว่าการลงทุนนั้นให้ผลตอบแทนในด้านคุณภาพโค้ดและความ expressive
การอภิปรายในชุมชนเผยให้เห็นว่า OCaml ยังคงดึงดูดนักพัฒนาที่ทำงานกับ compiler และระบบที่ซับซ้อนอื่น ๆ ที่รูปแบบการเขียนโปรแกรมเชิงฟังก์ชันและระบบชนิดข้อมูลอันทรงพลังให้ข้อได้เปรียบอย่างมีนัยสำคัญ แม้จะยอมรับจุดที่ยากลำบาก นักพัฒนาหลายคนแสดงความเต็มใจที่จะใช้ OCaml อีกครั้งสำหรับโครงการที่เหมาะสม โดยเฉพาะเมื่อการสร้างต้นแบบอย่างรวดเร็วและโซลูชันที่สวยงามถูกให้ความสำคัญเหนือความคุ้นเคยในทันที
บทสนทนาที่กำลังดำเนินอยู่ชี้ให้เห็นว่า OCaml ครองตำแหน่งเฉพาะในภูมิทัศน์ภาษาโปรแกรม ดึงดูดนักพัฒนาที่ให้คุณค่ากับความสวยงามทางคณิตศาสตร์และระบบชนิดข้อมูลที่มีความ expressive ในขณะที่ยอมรับการประนีประนอมบางประการของระบบนิเวศ ขณะที่เครื่องมือพัฒนายังคง成熟และข้อความแสดงข้อผิดพลาดดีขึ้น ภาษานี้อาจจะเข้าถึงได้สำหรับผู้ชมที่กว้างขึ้น ในขณะที่ยังคงรักษาลักษณะเฉพาะตัวของมันไว้
อ้างอิง: Pain points of OCaml
