Rust Glancer: ทางเลือกใหม่สำหรับ Rust LSP ที่ประหยัดหน่วยความจำ 🚀
สำหรับนักพัฒนา Rust ที่ประสบปัญหาเรื่องการใช้หน่วยความจำที่สูงเกินไปของเครื่องมือ LSP (Language Server Protocol) ในปัจจุบัน โดยเฉพาะอย่างยิ่งกับโปรเจกต์ขนาดใหญ่ หรือบนคอมพิวเตอร์ที่มีทรัพยากรจำกัด วันนี้มีทางเลือกใหม่ที่น่าสนใจมานำเสนอ นั่นคือ Rust Glancer โปรเจกต์ที่ใช้เวลาพัฒนามากว่า 4 เดือน โดยมีจุดเด่นหลักอยู่ที่การใช้หน่วยความจำที่ต่ำมาก และความสามารถในการกลับมาทำงานได้ทันทีหลังจากการรีสตาร์ท
Rust Glancer คืออะไร? 🤔
Rust Glancer คือการพัฒนา Rust LSP ขึ้นมาใหม่ โดยมีเป้าหมายหลักคือการลดการใช้หน่วยความจำให้ได้มากที่สุด โดยตั้งเป้าให้ใช้ RAM ไม่เกิน 100MB สำหรับโปรเจกต์ทั่วไป (มีข้อจำกัดบางประการที่อธิบายเพิ่มเติมด้านล่าง) นอกจากนี้ ยังมีความสามารถที่โดดเด่นคือ การทำ Indexing ได้ทันทีหลังจากรีสตาร์ท หากโปรเจกต์เคยถูก Index ไว้แล้ว การเปิด Editor ขึ้นมาใหม่จะไม่ต้องเสียเวลา Index ซ้ำอีกครั้ง
คุณสมบัติเด่นที่น่าสนใจ ✨
- ประหยัดหน่วยความจำ: สามารถทำงานได้ดีแม้บนเครื่องที่มี RAM เพียง 8GB เช่น MacBook Pro M1 2020 ที่ผู้พัฒนาได้ทดลองใช้
- Indexing รวดเร็วหลังรีสตาร์ท: ไม่ต้องรอ Index ใหม่ทุกครั้งที่เปิดโปรแกรม ทำให้เริ่มทำงานได้ไวขึ้น
- มีความสามารถพื้นฐานครบครัน: แม้จะเป็นโปรเจกต์ที่ยังพัฒนาไม่เสร็จสมบูรณ์ แต่ก็มี Pipeline สำหรับ Indexing ที่ครอบคลุม, การอนุมานชนิดข้อมูล (Type Inference), และการแก้ปัญหา Trait (Trait Solver) โดยใช้ Chalk รองรับ Syntax ของ Rust ส่วนใหญ่ และการทำงาน LSP พื้นฐาน เช่น Goto Definition, Hover, Inlay Hints, Completions
ทำไม Rust Glancer ถึงประหยัดหน่วยความจำ? 💡
Rust Glancer มีแนวคิดที่แตกต่างจาก rust-analyzer ในการจัดการข้อมูล ซึ่งเป็นสาเหตุหลักของการใช้หน่วยความจำที่สูงใน rust-analyzer:
- การจัดการข้อมูลของ Rust Workspaces: โปรเจกต์ Rust โดยทั่วไปมีข้อมูลจำนวนมหาศาลที่ต้อง Index เช่น ฟังก์ชัน, โครงสร้างข้อมูล (Structs), Traits, ความสัมพันธ์ระหว่างสิ่งเหล่านี้, เนื้อหาในฟังก์ชัน ซึ่งแต่ละส่วนต้องถูกวิเคราะห์และจดจำ
- สถาปัตยกรรมของ rust-analyzer:
- Salsa Database: เป็นฐานข้อมูลแบบ Incremental Query-based ที่คำนวณข้อมูลตามต้องการ แต่ถูกผูกติดกับหน่วยความจำ ทำให้ยากต่อการย้ายข้อมูลบางส่วนออกไปเก็บที่อื่น
- Rowan Syntax Tree: แม้จะช่วยให้การ Parse เร็วขึ้นเมื่อมีการเปลี่ยนแปลงบางส่วนของไฟล์ แต่โครงสร้างแบบ Tree นี้อาจทำให้เกิด Memory Fragmentation (RAM ที่ใช้จริงน้อยกว่า RAM ที่ระบบจัดสรร)
Rust Glancer เลือกที่จะ ไม่เน้นการทำ Incremental LSP แต่จะใช้วิธีการ เก็บผลการวิเคราะห์ (Analysis Result) ไว้บน Filesystem และโหลดเข้ามาในหน่วยความจำเฉพาะเมื่อจำเป็นต้องใช้งานเท่านั้น วิธีนี้ทำให้:
- ผลการวิเคราะห์สามารถ Offload ไปยัง Filesystem และโหลดเข้ามาเมื่อต้องการใช้
- ผลการวิเคราะห์ที่บันทึกไว้สามารถนำกลับมาใช้ใหม่ได้หลังจากการ Restart Editor
ข้อจำกัดและข้อควรพิจารณา ⚠️
Rust Glancer ยังคงเป็นโปรเจกต์ที่อยู่ระหว่างการพัฒนา มีฟังก์ชันที่ยังขาดหายไป และมี Bug ที่ทราบอยู่บ้าง การเลือกใช้ Rust Glancer อาจต้องแลกมาด้วยข้อจำกัดบางประการเมื่อเทียบกับ rust-analyzer:
- ความเร็วในการวิเคราะห์: การโหลดและ Deserialize ข้อมูลจาก Filesystem ย่อมช้ากว่าการโหลดจากหน่วยความจำโดยตรง
- การ Indexing รายการใหม่: เมื่อมีการพิมพ์โค้ด Rust Glancer จะทำการวิเคราะห์ส่วนที่พิมพ์เพียงเล็กน้อย และใช้ Index เดิมที่มีอยู่ การเพิ่มรายการใหม่ๆ (เช่น Imports, Structs, Traits) จะยังไม่ถูก Index จนกว่าจะมีการ Save ไฟล์
- ความสมบูรณ์: อาจยังไม่รองรับฟีเจอร์ขั้นสูง หรือการใช้งานที่ซับซ้อนเท่า rust-analyzer
อย่างไรก็ตาม ผู้พัฒนาได้พยายามลดผลกระทบจากข้อจำกัดเหล่านี้ เช่น การใช้เทคนิค Shallow Analysis ขณะพิมพ์โค้ด และการตั้งค่า Priority ที่ต่ำกว่าสำหรับการเปลี่ยนแปลงโค้ดที่เกิดจาก Agent หรือ Script ภายนอก เพื่อไม่ให้กระทบต่อการทำงานหลัก
Rust Glancer เหมาะกับใคร? 🤔
- นักพัฒนาที่มีคอมพิวเตอร์ทรัพยากรจำกัด: ผู้ที่ต้องการเครื่องมือ LSP ที่ประหยัด RAM
- ผู้ที่ยอมรับข้อจำกัดบางประการได้: เพื่อแลกกับการใช้หน่วยความจำที่น้อยลง
- ผู้ที่สนใจทดลองเทคโนโลยีใหม่: และต้องการเห็นการพัฒนาเครื่องมือ Rust ที่แตกต่าง
การทดลองใช้งาน 🛠️
คุณสามารถทดลองใช้งาน Rust Glancer ได้แล้ว โดยการติดตั้ง VS Code Extension หรือ Build และ Install ไฟล์ .vsix จาก Repository โดยตรง
สรุป 🌟
Rust Glancer เป็นโปรเจกต์ที่น่าจับตามองสำหรับนักพัฒนา Rust ที่กำลังมองหาทางเลือกของ LSP ที่ประหยัดทรัพยากร โดยเฉพาะหน่วยความจำ ด้วยแนวคิดการจัดการข้อมูลที่แตกต่างออกไป แม้จะยังมีข้อจำกัดอยู่บ้าง แต่ก็ถือเป็นจุดเริ่มต้นที่ดีและมีศักยภาพในการพัฒนาต่อไปในอนาคต
#Rust #RustLang #LSP #Programming #DeveloperTools
ขอบคุณ แหล่งข้อมูล
https://rust-glancer.github.io/blog/hello-world/