นักพัฒนาจำนวนมากพบว่าตัวเองกำลังสร้างคอมไพเลอร์โดยไม่ได้ตั้งใจ ทั้งที่พยายามหลีกเลี่ยงการทำเช่นนั้น ปรากฏการณ์นี้มีความเกี่ยวข้องอย่างใกล้ชิดกับผลกระทบแบบ inner-platform และกลายเป็นรูปแบบที่พบเห็นได้ทั่วไปในการพัฒนาซอฟต์แวร์ ซึ่งยังคงเป็นประเด็นที่มีการถกเถียงกันในชุมชนเทคนิค
การพัฒนาเป็นคอมไพเลอร์อย่างค่อยเป็นค่อยไป
สิ่งที่มักเริ่มต้นจากสคริปต์ง่ายๆ หรือต้นแบบ สามารถพัฒนากลายเป็นคอมไพเลอร์เต็มรูปแบบผ่านขั้นตอนที่ดูเหมือนไม่มีอะไรซับซ้อน นักพัฒนามักเริ่มต้นด้วยการจัดการข้อความและการแยกวิเคราะห์พื้นฐาน แต่กลับพบว่าตัวเองต้องพัฒนาฟีเจอร์ที่ซับซ้อนมากขึ้นเพื่อรองรับกรณีพิเศษต่างๆ ชุมชนได้ระบุว่านี่เป็นรูปแบบที่เกิดขึ้นซ้ำๆ โดยเฉพาะในโครงการที่เกี่ยวข้องกับการแปลงโค้ดหรือภาษาเฉพาะทาง
มันเริ่มต้นอย่างไม่น่าเป็นห่วง เช่น การทำไฟล์เทมเพลตและแทนที่ค่าง่ายๆ จากนั้นคุณก็เริ่มต้องทำการแทนที่มากขึ้นและการแยกวิเคราะห์ที่ 'ฉลาด' มากขึ้น จนถึงจุดหนึ่งก็สายเกินไปแล้ว ตามที่บทความได้กล่าวไว้
ขั้นตอนทั่วไปในการพัฒนาคอมไพเลอร์โดยไม่ตั้งใจ:
- การเขียนสคริปต์จัดการข้อความเบื้องต้น
- การผสานรวมไลบรารี AST
- การพัฒนาส่วนแปลงข้อมูลแบบกำหนดเอง
- การพัฒนาการแสดงผลขั้นกลาง
- ชั้นการสร้างโค้ด
กับดักของโครงสร้างพื้นฐาน
นักพัฒนาหลายคนพยายามหลีกเลี่ยงการสร้างโครงสร้างพื้นฐานของคอมไพเลอร์โดยใช้ไลบรารี AST ที่มีอยู่แล้วหรือสร้างเครื่องมือแปลงแบบง่ายๆ อย่างไรก็ตาม การอภิปรายในชุมชนเผยให้เห็นว่าแนวทางนี้มักนำไปสู่การดูแลระบบที่ซับซ้อนที่มีสมมติฐานที่ไม่ชัดเจนและโค้ดที่เปราะบาง สิ่งที่เริ่มต้นจากการจัดการโหนด AST เพียง 50 โหนด มักขยายตัวเพื่อรองรับโครงสร้างซ้อน การควบคุมการทำงาน และฟีเจอร์ภาษาต่างๆ ที่ไม่ได้คาดคิดไว้แต่แรก
แนวทางแก้ไขและทางเลือกสมัยใหม่
ชุมชนนักพัฒนาแนะนำหลายแนวทางในการจัดการสถานการณ์นี้อย่างมีประสิทธิภาพมากขึ้น บางคนแนะนำให้ยอมรับการสร้างคอมไพเลอร์ตั้งแต่เริ่มต้นเมื่อเหมาะสม ในขณะที่คนอื่นๆ สนับสนุนให้ใช้เครื่องมือที่มีอยู่แล้วเช่น LLVM หรือฟีเจอร์ภาษาของ Racket การอภิปรายชี้ให้เห็นว่าเฟรมเวิร์คและเครื่องมือสมัยใหม่สามารถช่วยให้นักพัฒนาหลีกเลี่ยงการประดิษฐ์สิ่งที่มีอยู่แล้วใหม่ ในขณะที่ยังคงรักษาการควบคุมความต้องการในการแปลงโค้ดของตน
ทางเลือกที่แนะนำ:
- LLVM
- เครื่องมือภาษา Racket
- เฟรมเวิร์คคอมไพเลอร์ที่มีอยู่
- เครื่องมือเฉพาะสำหรับแต่ละภาษา (เช่น Roslyn สำหรับ .NET)
บทบาทของประสบการณ์
น่าสนใจที่ชุมชนสังเกตว่ารูปแบบนี้พบเห็นได้น้อยลงในทศวรรษที่ผ่านมาเมื่อเทียบกับปีก่อนๆ การเปลี่ยนแปลงนี้อาจเป็นผลมาจากเครื่องมือที่ดีขึ้น โครงสร้างพื้นฐานของคอมไพเลอร์ที่เข้าถึงได้ง่ายขึ้น และการตระหนักถึงข้อเสียของการสร้างคอมไพเลอร์โดยไม่ตั้งใจที่เพิ่มมากขึ้น อย่างไรก็ตาม ความท้าทายนี้ยังคงมีอยู่ โดยเฉพาะในสภาพแวดล้อมที่แรงกดดันทางธุรกิจหรือข้อจำกัดด้านทรัพยากรมีอิทธิพลต่อการตัดสินใจทางเทคนิค
สรุปแล้ว แม้ว่าการสร้างคอมไพเลอร์จะไม่ใช่ปัญหาในตัวเอง แต่สิ่งสำคัญคือการตัดสินใจอย่างมีสติมากกว่าการเดินเข้าไปสู่มันโดยไม่ตั้งใจ การเข้าใจว่าเมื่อไหร่ควรใช้เครื่องมือที่มีอยู่แล้วหรือสร้างโซลูชันเองยังคงเป็นทักษะที่สำคัญในการพัฒนาซอฟต์แวร์
แหล่งอ้างอิง: Dear Sir, You Have Built a Compiler