Rust ในปี 2025: มุ่งสู่ซอฟต์แวร์รากฐาน
(smallcultfollowing.com)- Rust กำลังก้าวเข้าสู่ปีที่ 10 ในปีนี้ และกำลังวางตำแหน่งตัวเองเป็นภาษาหลักสำหรับการพัฒนา ซอฟต์แวร์รากฐาน (Foundational) ในอนาคต
- ซอฟต์แวร์รากฐานหมายถึง ชั้นที่เป็นฐานของทุกสิ่ง เช่น เคอร์เนลระบบปฏิบัติการ แพลตฟอร์มคลาวด์ อุปกรณ์ฝังตัว และเครื่องมือ CLI
- Rust มอบ ประสิทธิภาพและความน่าเชื่อถือ ระดับ C/C++ พร้อมทั้งลดอุปสรรคด้วยระบบชนิดข้อมูลที่รับประกันความปลอดภัยของหน่วยความจำ
- พันธกิจของ Rust ไม่ได้จำกัดอยู่แค่ในพื้นที่รากฐานเท่านั้น แต่ยังส่งอิทธิพลต่อการพัฒนาแอปพลิเคชันระดับบนผ่านโครงการอย่าง Dioxus, Tauri, Leptos
- ต่อจากนี้มีแผนลงทุนหลักในด้าน การทำงานร่วมกันระหว่างภาษา, การขยายระบบชนิดข้อมูล, การเสริมความแข็งแกร่งของ ecosystem เป็นต้น
วิสัยทัศน์ของ Rust: ซอฟต์แวร์รากฐาน
- วิสัยทัศน์หลักของ Rust คือการทำให้ การเขียนและดูแลรักษาซอฟต์แวร์รากฐานทำได้ง่ายขึ้น
- ซอฟต์แวร์รากฐานครอบคลุมเคอร์เนลระบบปฏิบัติการ โครงสร้างพื้นฐานคลาวด์ อุปกรณ์ฝังตัว เครื่องมือ CLI และอื่น ๆ ที่เป็นฐานของทุกระบบ
- ปัจจุบันถูกนำไปใช้แล้วในหลากหลายที่ เช่น Windows และ Linux kernel, เอนจินค้นหาของ VSCode อย่าง ripgrep, Deno, และตัวจัดการแพ็กเกจ Python อย่าง uv
- ซอฟต์แวร์ประเภทนี้ต้องให้ความสำคัญกับ ประสิทธิภาพ ความน่าเชื่อถือ และผลิตภาพ พร้อมกัน
- หากชั้นฐานพัง จะส่งผลต่อชั้นบนทั้งหมด จึงต้องมีเสถียรภาพเป็นสิ่งจำเป็น
- หากประสิทธิภาพลดลง ก็จะกลายเป็นเพดานประสิทธิภาพของชั้นบน จึงต้องมี overhead ให้น้อยที่สุด
ประสิทธิภาพ ความน่าเชื่อถือ และผลิตภาพของซอฟต์แวร์รากฐาน
- ซอฟต์แวร์รากฐานก็มีข้อกำหนดหลากหลายเช่นเดียวกับซอฟต์แวร์ทุกประเภท แต่ทุกปัจจัยล้วนสำคัญยิ่งกว่าเดิม
- ความน่าเชื่อถือ คือภารกิจอันดับแรก หากฐานล้ม สิ่งทั้งหมดที่อยู่บนนั้นก็จะล้มตามไปด้วย
- overhead ด้านประสิทธิภาพ เป็นตัวกำหนดขีดจำกัดของประสิทธิภาพชั้นบน จึงต้องลดให้ต่ำที่สุด
- ก่อนหน้านี้มีทางเลือกอยู่สองแบบในการตอบโจทย์ความต้องการเหล่านี้
- C/C++ : ให้อิสระสูง แต่ก็ต้องแลกมาด้วยความสมบูรณ์แบบในการใช้งานในระดับเดียวกัน
- ภาษา ระดับสูงอย่าง Java, Go เป็นต้น: จำเป็นต้องมีรูปแบบการเขียนโค้ดเฉพาะเพื่อรักษาประสิทธิภาพ และถูกจำกัดในการใช้ abstraction กับความสะดวกต่าง ๆ
- Rust เปลี่ยนแนวทางเดิมด้วยการผสาน zero-cost abstraction เข้ากับ ระบบชนิดข้อมูลที่รับประกันความปลอดภัยของหน่วยความจำ
- จึงกลายเป็นเครื่องมือที่ช่วยให้เขียนโค้ดระดับสูงได้อย่างปลอดภัย พร้อมบรรลุทั้งประสิทธิภาพระดับต่ำและความเสถียรของหน่วยความจำไปพร้อมกัน
ลดกำแพงการเริ่มต้นและเสริมพลังให้นักพัฒนา
- ในการนำเสนอเกี่ยวกับ Rust มักมีการเปรียบเทียบระบบชนิดข้อมูลและการตรวจสอบแบบสแตติกว่าเป็น "ผักโขม" (ของที่ดีแต่ไม่อยากกิน)
- แต่ในความเป็นจริง ระบบชนิดข้อมูล คืออาวุธทรงพลังสำหรับนักพัฒนา
- ผู้เริ่มต้นสามารถเรียนรู้โครงสร้างซอฟต์แวร์ที่ดีได้ผ่านการเรียนรู้ระบบชนิดข้อมูล
- ผู้เชี่ยวชาญก็สามารถค้นพบข้อผิดพลาดในโครงสร้างที่ออกแบบเองได้เร็วขึ้น
- คำพูดของ Yehuda Katz ที่ว่า "abstraction ที่สร้างขึ้นในช่วงมีสมาธิ ช่วยเหลือตัวฉันในอนาคตยามที่อ่อนล้า" ก็สรุปประเด็นนี้ได้อย่างดี
พื้นที่นอกเหนือจากซอฟต์แวร์รากฐาน
- แม้พันธกิจของ Rust จะมุ่งไปที่ซอฟต์แวร์รากฐาน แต่ก็ไม่ได้หมายความว่าพื้นที่อื่นจะถูกมองข้าม
- โครงการอย่าง Dioxus, Tauri, Leptos กำลังใช้ Rust ขยายไปสู่แอปพลิเคชันระดับสูงอย่าง GUI และเว็บเพจ
- จุดแข็งหลักของ Rust อาจมุ่งอยู่ที่ซอฟต์แวร์รากฐานโดยธรรมชาติ แต่ความพยายามเหล่านี้ก็ไม่ควรถูกมองข้าม
เป้าหมายแบบ stretching และการเติบโต
- เนื่องจากซอฟต์แวร์รากฐานต้องการการควบคุมรายละเอียดระดับล่าง จึงมักมีแนวโน้มจะมองว่า ความเข้าถึงง่ายและ ergonomics ไม่ใช่เรื่องสำคัญ
- แต่ยิ่งมีรายละเอียดที่ต้องควบคุมมากเท่าไร ความใช้งานง่ายก็ยิ่งสำคัญมากขึ้นเท่านั้น
- หากช่วยให้นักพัฒนาโฟกัสเฉพาะจุดที่สำคัญจริง ๆ ได้ ก็จะเพิ่มผลิตภาพได้อย่างมาก
- โครงการที่ผลักดันการใช้งาน Rust ในระดับสูง มอบโอกาสในการปรับปรุงให้การเขียนโปรแกรม Rust สะดวกขึ้นอีกมาก
- และการปรับปรุงเหล่านี้ก็สะท้อนกลับไปสู่การพัฒนาซอฟต์แวร์รากฐานโดยตรง
- หัวใจสำคัญคือการเพิ่มความใช้งานง่ายโดยไม่สูญเสีย การควบคุมและความน่าเชื่อถือ
ความสำคัญของการรองรับทั้งสแตก
- อีกเหตุผลที่ทำให้การพัฒนาแอปพลิเคชันระดับสูงใน Rust น่าใช้งานคือการที่สามารถสร้าง ทั้งสแตก ด้วยเทคโนโลยีเดียวได้
- นักพัฒนาหลายคนเริ่มต้นจากการใช้ Rust แค่บางส่วน เช่น บริการ data plane แต่ภายหลังก็มักขยายไปสู่ทุกส่วน
- เพราะ Rust มี ผลิตภาพ สูง และสามารถแชร์ไลบรารีกับโค้ดได้ภายในภาษาเดียว
- โดยเนื้อแท้แล้ว โค้ดที่เรียบง่ายก็ยังคงเรียบง่ายไม่ว่าจะเขียนด้วยภาษาใด
ประสบการณ์ของการลงลึกแบบค่อยเป็นค่อยไป (Iterative Deepening)
- ตามอุดมคติแล้ว ประสบการณ์ครั้งแรกของผู้ใช้ Rust ควรเรียบง่าย และเมื่อโปรเจ็กต์คืบหน้า ก็ควรสามารถขยายการควบคุมให้มากขึ้นได้แบบ เฉพาะจุด อย่างค่อยเป็นค่อยไป
- แม้ฟังดูเหมือนง่าย แต่ในความเป็นจริงเป็นโจทย์ที่ยากมาก
- หลายโครงการล้มเหลวเพราะมีอุปสรรคสูงสำหรับผู้เริ่มต้น หรือการเรียนรู้ระดับการควบคุมที่สูงขึ้นต้องใช้ความรู้จำนวนมาก
- Rust เองก็ไม่ได้ประสบความสำเร็จเสมอไป แต่กำลังพยายามปรับปรุงเรื่องนี้อย่างต่อเนื่อง
แผนต่อจากนี้
- บทความนี้เป็นตอนแรกของซีรีส์ และในอีกสี่ตอนถัดไปมีแผนจะนำเสนอ ด้านการลงทุนที่จำเป็นเพื่อให้ Rust เหมาะกับซอฟต์แวร์รากฐานมากยิ่งขึ้น
- การทำงานร่วมกันระหว่างภาษา (smooth language interop) และ ความสามารถในการขยาย (extensibility)
- การทำให้เป้าหมายชัดเจนผ่านระบบชนิดข้อมูล (clarity of purpose)
- การเสริม ecosystem: แนวทางปฏิบัติที่ดีขึ้น เครื่องมือที่ดีขึ้น และการใช้ประโยชน์จาก Rust Foundation
- บทความสุดท้ายจะกล่าวถึง การดำเนินงานขององค์กรโอเพนซอร์ส Rust โดยมุ่งหาวิธีทำให้การมีส่วนร่วมและการดูแลรักษาเป็นกิจกรรมที่ เข้าถึงง่ายและสนุกที่สุดเท่าที่จะเป็นไปได้
15 ความคิดเห็น
ถึง Rust จะดูเหมือนใช้ได้อยู่บ้าง แต่ก็รู้สึกว่าเป็นภาษาเดียวที่ไม่ค่อยอยากแตะเพราะแฟนด้อมสายพิษ(?)
คงจะดีถ้า C หรือ C++ มีตัวจัดการแพ็กเกจมาตรฐานนะครับ/ค่ะ พอเห็น Cargo ทีไรก็คิดแบบนั้นอยู่เสมอ
ผักโขมอร่อยจะตายไป....
ช่วงนี้แทบไม่มีที่ไหนที่ไม่ใช้ Rust
ถึงจะทำงานอยู่บริษัทใหญ่พอสมควร แต่ก็ไม่มีสายงานที่ใช้ Rust เลยครับ กรุณาอย่าชี้นำเกินจริง
อย่ามาหาเรื่องนะ
ว้าววววววว;;
อย่ามาหาเรื่องนะ shiver
โหดมาก ;;
โห;;;;
เอาเรื่องอื่นไว้ก่อน ทุกวันนี้พวกคลั่ง Rust ทำเอาแทบจะเป็นลมกันเลยทีเดียว ออฟไลน์นี่ก็เป็นชนกลุ่มน้อยมากๆ อยู่แล้ว แต่พอออนไลน์นี่แทบจะเป็น isis... เอ่อ คืออยากให้ไปรวมกันอยู่ที่ไหนสักแห่งแล้วเล่นกันเองมากกว่า...
หลายคนที่ทำตัวเหมือนสาวก Rust ก็ยังน่าสงสัยเลยว่าจริง ๆ แล้วตัวเองได้ใช้อย่างจริงจังแค่ไหน
ถึงอย่างนั้น... ก็ยังรัก Rust ใช่ไหม?
จะเกลียดสาวก Rust ก็ได้ แต่ช่วยรัก Rust ด้วยนะ ฮือๆ
ถึงจะโดน FFmpeg ซัดมาก็ยังจะให้เขียนโค้ดทั้งหมดด้วย rust อะไรทำนองนั้น
ความคิดเห็นบน Hacker News
เมื่อพูดถึงซอฟต์แวร์แกนหลัก สิ่งที่น่าเสียดายที่สุดใน Rust คือ ABI หากจะสร้าง OS ด้วย Rust และให้บริการที่หลากหลายได้ ต่อให้ OS อัปเกรดแล้ว แอปพลิเคชันก็ควรยังใช้งานได้โดยไม่ต้องคอมไพล์ไลบรารีใหม่ ฝั่ง Windows แก้ปัญหานี้ด้วย COM, Apple เคยใช้ dynamic dispatch ของ ObjC (และตอนนี้คือ Swift ABI), ส่วน Android ใช้ JVM และ bytecode แต่ Rust รองรับได้แทบแค่ extern "C" จึงมีข้อจำกัดในการใช้ dynamic library การให้ ABI โดยไม่มีชั้น VM (JVM, .NET) นั้นยากมาก และเมื่อกำหนดรายละเอียดการติดตั้งใช้งานแล้วก็แทบห้ามเปลี่ยน จึงเข้าใจได้ว่าทำไมเรื่องนี้ถึงไม่ใช่ลำดับความสำคัญสูง โมเดลแบบนี้ที่ประสบความสำเร็จจริง ๆ ก็มีประมาณ Swift กับ COM เท่านั้น ถ้า Rust มี ABI แบบสมบูรณ์ก็น่าจะเข้าใกล้ภาษาเกือบสมบูรณ์แบบมาก (และถ้าจัดการ dependency ในรูปแบบไบนารี เวลาคอมไพล์ก็จะลดลงมากด้วย)
ชอบ Rust มากจริง ๆ แต่ก็อยากให้มีคนสนใจปัญหาเรื้อรังที่ชวนหงุดหงิดอีกหลายเรื่องมากขึ้น
พอนึกทบทวนคำว่า “Smooth, iterative deepening” ก็รู้สึกว่า Rust ให้ความสำคัญกับ cross-language compatibility มากเกินไป จนอาจเพิ่มแต่ความซับซ้อนและเสี่ยงทำลายความปลอดภัย ในกรณีแบบนี้น่าจะเป็นประโยชน์กว่าถ้าทำในรูปแบบแทนที่ส่วนล่างสุดของระบบแบบ libc ฝั่ง Go แทบไม่ค่อยเรียกข้ามภาษา Google ลงมือสร้าง core library เองเพื่อวางรากฐานให้แน่น แต่ Rust กลับมี foundational library หลายเวอร์ชันกระจัดกระจาย และหลายตัวก็ยังไม่สมบูรณ์
มีการเน้นว่า “หลีกเลี่ยงการจัดสรรหน่วยความจำ, อย่าให้ GC ถูก trigger” นั้นไม่สอดคล้องกับแนวคิด GC และ JIT ยุคใหม่ GC สมัยใหม่หลายตัวแทบไม่มี stop-the-world latency แล้ว และการใช้ CPU ของ GC โดยรวมขึ้นกับสัดส่วนระหว่าง resident set กับขนาด heap เป็นหลัก ส่วน JIT มีโอกาสในการ optimize มากกว่า AOT และยังสำรวจได้เชิงรุกกว่า (ด้วย speculative optimization) สิ่งที่สำคัญจริง ๆ คือเวลาเริ่มต้น/วอร์มอัป, overhead ด้านหน่วยความจำ และประสิทธิภาพเฉลี่ย ไม่ใช่ worst-case ที่แย่ลงไป ยิ่งไปกว่านั้น การจัดการหน่วยความจำด้วยมือก็ไม่ได้แปลว่ามีประสิทธิภาพมากกว่าเสมอไป และถึงการใช้ RAM จริงจะเพิ่มขึ้น 3 เท่า ต้นทุนก็อาจไม่ต่างเลยก็ได้ ขอแนะนำ งานบรรยายในงานประชุม ISMM ที่พูดเรื่องนี้ได้ดี
มองว่าคอมเมนต์และการถกเถียงที่ถูกติดธงไว้ จับประเด็นสำคัญได้ดี ทั้งเรื่อง “มาสร้างมาตรฐานภาษาที่มีสเปกอย่างเป็นทางการกันเถอะ” และ “จำเป็นต้องมีหลาย implementation” ซึ่งเป็นคำถามสำคัญในโลกจริง โดยเฉพาะ @infogulch ที่ชี้ได้ดีว่า ถ้าภาษาจะเป็นรากฐานของอุตสาหกรรมจริง ก็ต้องมีสเปกอย่างเป็นทางการ (คอมเมนต์อ้างอิง)
ผู้คนมักตั้งคำถามกันตั้งแต่ต้นว่า Rust จำเป็นต้องมีสเปกจริงหรือไม่ ซึ่งยิ่งสะท้อนว่าใน software engineering มีความเป็นวิศวกรรมจริง ๆ น้อยเกินไป
ต่อคอมเมนต์ที่บอกว่า Rust เป็น “ภาษาที่มีแต่คนที่อยากดูเหมือนโปรแกรมเมอร์เท่านั้นที่ใช้” เจ้าตัวบอกว่าตนเองเป็นคนที่รักการเขียนโปรแกรมจริง ๆ และ Rust ก็เป็นประสบการณ์ที่สดใหม่มาก ไม่อยากย้อนกลับไปสู่ยุคที่ C++ ทรมานอย่างหนักอีกแล้ว และก็ไม่คิดว่ามาตรฐานภาษา (การบริจาคสเปก Ferrocene) หรือจำนวน implementation จะสำคัญขนาดนั้น Python กับ Java ก็พึ่ง implementation หลักตัวเดียวและเดินหน้าได้ดี C++ พยายามรองรับหลายคอมไพเลอร์ สุดท้ายก็มีแต่เพิ่มปัญหาซับซ้อนเฉพาะแพลตฟอร์ม ส่วนคำว่า cargo “ยุ่งเหยิง” หมายถึงอะไรนั้นก็ไม่ชัด เพราะมองว่าฝั่ง C++ ยุ่งยากกว่ามาก