ช่วงหลายปีที่ผ่านมา เราเห็น Rust ถูกนำไปใช้เขียนซอฟต์แวร์พื้นฐานสำคัญๆ หลายตัวที่เดิมสร้างด้วย C/C++ ด้วยเหตุผลด้านความปลอดภัยที่ระดับตัวภาษา Rust เอง ตัวอย่างโครงการลักษณะนี้คือ su/sudo ตัวใหม่ที่เขียนด้วย Rust, Rustls โครงการทดแทน OpenSSL, mod_tls ของ Apache เป็นต้น
ในโลกของลินุกซ์ยังมีซอฟต์แวร์พื้นฐานที่เรียกรวมๆ ว่า coreutils (ย่อมาจาก Core Utilities) ตัวอย่างที่ใช้บ่อยๆ คือคำสั่งอย่าง ls, ln, more, chmod, chown, cat, printenv, wc เป็นต้น ซอฟต์แวร์เหล่านี้ถูกสร้างโดยโครงการ GNU มายาวนานตั้งแต่ยุค 90s และพัฒนาด้วยภาษา C
นับตั้งแต่ปี 2021 เป็นต้นมา มีโครงการชื่อ uutils ตั้งเป้าเขียนซฮฟต์แวร์ในชุด coreutils กับซอฟต์แวร์ชุดใกล้เคียงคือ findutils (find, locate) และ diffutils ขึ้นมาใหม่ด้วยภาษา Rust โดยได้รับสปอนเซอร์บางส่วนจากกองทุน Sovereign Tech Fund ของเยอรมนี เป้าหมายของโครงการคือทดแทนซอฟต์แวร์เดิมแบบเข้ากันได้ 100% ผู้ใช้พิมพ์คำสั่งแบบเดิม ได้ผลเหมือนเดิม ไม่ต้องสนใจว่าเบื้องหลังเปลี่ยนไปอย่างไร
ตอนนี้โครงการคืบหน้าไปพอสมควร เวอร์ชันล่าสุด 0.0.25 ผ่านชุดทดสอบความเข้ากันได้กับ GNU coreutils ของเดิมแล้ว 72.35% ดูจากกราฟความคืบหน้าแล้วก็น่าจะเสร็จสมบูรณ์ ทดแทน coreutils ของเดิมได้ในเวลาอีกไม่กี่ปีข้างหน้า
Comments
ดีใจที่มีการพัฒนาใหม่ด้วยภาษา Rust แต่การเปลี่ยนจากซอฟต์แวร์ลิขสิทธิ์แบบ GPL ไปเป็นแบบ MIT/X11 เป็นเรื่องที่น่ากังวล ต่างจาก GPL ตรงที่สัญญาอนุญาตแบบ MIT/X11 ไม่มีการคุ้มครองใด ๆ จากคดีความละเมิดสิทธิบัตร และไม่กระตุ้นให้บริษัทต่างๆ นำเอาการปรับแต่งของพวกเขาปล่อยกลับคืนสู่สาธารณะ
อนาคตเราจะมี basic command 2 ตัวที่มันทับซ้อนกันหรือว่าสุดท้ายแล้วในโลกของลินุกซ์จะมาใช้ตัว Rush กันหมดนะ
ถ้าย้ายมาใช้ Rush กันหมด GNU/Linux ก็จะเหลือแค่ Linux แน่ ๆ ครับ
บล็อก: wannaphong.com และ Python 3
บางทีผมก็รู้สึกนะว่าทำไมเค้าชอบประดิษฐ์ล้อใหม่กันจัง?
ข้างบนล้อเล่น แต่ที่สงสัยจริง ๆ คือ มันเขียนโค๊ดให้ปลอดภัยด้วยภาษาอื่นไม่ได้จริง ๆ เหรอ?
หลังจากใช้ fish ripgrep fd อยู่สักพัก ผมเริ่มเข้าใจแล้ว ว่าทำไมต้อง compatible กับของเก่า
ได้ โดยเฉพาะอย่างยิ่ง coreutils ที่ทำงาน thread เดียว
หรือถ้าจะป้องกันคนเขียนหลาย thread แล้วแย่งกันเขียนข้อมูลก็ใช้ Erlang ก็ได้ครับ
ผมมองว่ามันเป็นค่านิยมน่ะครับ
ที่คิดว่าการ implement ที่ low-level มัน unsafe ไปเสียทั้งหมด
ผมเคยเจอ programmer ที่ไม่กล้าแม้แต่จะเขียน sql ตรงๆ จะใช้แต่ abstract API (พวก object model) ลูกเดียว (แม้ว่า API มันแย่แค่ไหนก็ตาม) เขามองว่าการเขียน sql เองไม่ปลอดภัย
Rust ก็ไม่ได้ high level ขนาดนั้นและไม่ได้ map ระหว่าง model ครับ uutils ก็เรียก syscall เช่น kill wait เหมือนเดิมนี่ล่ะ เพียงแต่ว่า compiler ช่วยกันไม่ให้ลืม free หรือ free ซ้ำ หรือแย่งกันเขียน memory จาก thread คนละตัว ซึ่งแต่ละอย่างที่ว่ามาก็เป็นปัญหาที่พบบ่อย ๆ
ผมหมายถึง low level API อย่าง pointer
หรือ mechanism ทั่วไป อย่างเขียน semaphore/mutex เองน่ะครับ
ผมว่าถ้าเราเข้าใจของพวกนี้ไม่ว่าจะภาษาไหนเราก็ทำให้มัน safe ได้ล่ะครับ
Rust ใช้ pointer ได้และ uutils ก็ใช้ด้วย นอกจากนั้นก็ใช้ mutex lock ด้วยครับ
ต่อให้เข้าใจก็พลาดได้ครับ และทางปฏิบัติคนพลาดก็เยอะด้วย เฉพาะกรณี buffer overflow ของ Chrome อย่างเดียวก็มากแล้ว
ปัญหาคือเรามีโค้ดที่มีช่องโหว่หลุดออกมาทั่วไปนะครับ 🥲
คือผมมองว่า code ที่เราเขียนจะ safe หรือไม่นั้น
มันอยู่ที่คนเขียนสัก 60% ภาษา 40% น่ะครับ (ไม่ว่าจะเป็นภาษาไหนก็ตาม)
ขนาดภาษาที่น่าจะ safe กว่า Rust อย่าง Go ผมยังเคยเห็น segmentation fault เลย
ผมเห็นด้วยว่าเขียน Rust ไม่ได้ป้องกันช่องโหว่ได้ 100% และ Go ก็มีแง่มุมดี ๆ เช่น บังคับให้ใส่ขนาดของ channel เสมอ ทำให้ channel ไม่ขยายไปเรื่อย ๆ จนหน่วยความจำเต็ม
แต่ compiler ของ Go ไม่ได้ตรวจสอบกรณีที่ thread หลายตัว ๆ ซึ่งอาจจะเรียกว่า goroutine ก็ตาม เขียนหน่วยความจำที่เดียวกันโดยที่ไม่ได้ lock เฉพาะประเด็นนี้ประเด็นเดียวก็ทำให้ Go ไม่ได้ safe กว่า Rust แล้วครับ
segmentation fault ส่วนใหญ่เกิดจากการใช้ pointer ผิดวิธีครับ
แต่ Go มี garbage collector เลยไม่ต้อง handle pointer เอง
พอไม่ต้อง handle pointer เองผมเลยคิดว่ามันควร safe กว่า Rust ไงครับ
จริงครับ แต่ Rust ก็มี RAII ช่วยจัดการด้วย เฉพาะในกรณีที่เป็นถึงจะใช้ pointer แบบ unsafe ซึ่งก็จะคล้าย ๆ ใช้ cgo
เห็นด้วยครับ แต่ผมมองว่าภาษามันเสริมให้พลาดได้ยากขึ้นมากด้วยสำหรับคนที่เขียนได้ปลอดภัยอยู่แล้ว
Rust น่าจะค่อยๆแทรกซึมเข้าไปในจุดที่ตัวภาษาทำหน้าที่ได้ดี แต่ Rust เองก็คงอยู่ในจุดที่ถูกหยิบไปใช้กับงานที่เหมาะสมเหมือนกับภาษาอื่นๆ และไม่น่าโตได้กว้างเท่า C++ ด้วยลักษณะของตัวภาษาเอง
..: เรื่อยไป
C++ ยังนำอยู่มากทั้ง code เก่าและโปรแกรมเมอร์ที่มีประสบการณ์ แต่ว่า Rust ก็มีหลายอย่างออกมาให้ลุ้นคล้าย ๆ uutils นี่ล่ะครับ เช่น Servo ที่เป็น web browser และ Bevy ที่เป็น game engine ถึงดูห่างจากตัวเก่าที่ใช้ C++ เขียนอยู่มาก็ตาม
ผมชอบอ่าน comments ของคุณ veer มากเลย ได้ความรู้ใหม่ๆตลอด เขียนแบบนี้ต่อไปเรื่อยๆนะครับ
จะว่าไป Rust นี่ผมตั้งใจจะศึกษาพื้นฐานให้จบภายในปีที่แล้ว แต่ยังไปไม่ถึงไหนเลย งานประจำก็ยุ่งเกิ๊นนน ไม่มีเวลา หมดแรงไปทำอย่างอื่น เฮ้อ
..: เรื่อยไป