Swift คือ Rust ที่ใช้งานสะดวกกว่า
(blog.namangoel.com)Rust
- Rust เป็นภาษาที่ได้รับความรักอย่างมาก เร็ว และมีคอมมูนิตี้ที่ยอดเยี่ยม
- Rust แก้ปัญหาการจัดการหน่วยความจำด้วยการนำแนวคิด ownership มาใช้
- มียูทิลิตีอย่าง
Rc,Arc,Cowเพื่อรองรับ reference counting และ "clone-on-write" - เมื่อต้องการทำงานระดับล่างมากขึ้น สามารถใช้ระบบ
unsafeเพื่อเข้าถึง raw C pointers ได้ - Rust มีคุณลักษณะของภาษาสาย functional หลายอย่าง เช่น tagged enums, match expressions, first-class functions และระบบ type ที่แข็งแกร่ง
- ใช้คอมไพเลอร์ที่อิงกับ LLVM จึงคอมไพล์เป็น native code และ WASM ได้
Swift
- ผู้เขียนก็ใช้ Swift มาหลายปี และระหว่างเรียนรู้ Rust ก็พบความคล้ายกับ Swift
- Swift เองก็มีคุณลักษณะของภาษาสาย functional เช่น tagged enums, match expressions และ first-class functions
- Swift ใช้ value types เป็นหลัก และมี semantics แบบ "copy-on-write"
- เมื่อต้องการประสิทธิภาพที่สูงขึ้น สามารถเลือกระบบ ownership เพื่อ "move" ค่าได้
- เมื่อต้องการทำงานระดับล่างมากขึ้น ก็สามารถใช้ระบบ
unsafeเพื่อเข้าถึง raw C pointers ได้ - Swift ก็ใช้คอมไพเลอร์ที่อิงกับ LLVM และคอมไพล์เป็น native code กับ WASM ได้เช่นกัน
เดจาวู?
- Swift และ Rust มีชุดความสามารถที่คล้ายกันมาก
- ความแตกต่างใหญ่จริงๆ อยู่ที่ มุมมอง
- เมื่อพิจารณาโมเดลหน่วยความจำพื้นฐาน ความต่างจะยิ่งชัดเจน
Rust เป็นแบบบนลงล่าง ส่วน Swift เป็นแบบล่างขึ้นบน
- Rust เริ่มจากการเป็นภาษาระบบระดับล่าง แล้วให้เครื่องมือสำหรับไต่ขึ้นไปสู่ระดับสูง
- Swift เริ่มจากการเป็นภาษาระดับสูง แล้วให้เครื่องมือสำหรับลงไปทำงานระดับล่าง
- โมเดลการจัดการหน่วยความจำคือตัวอย่างที่ชัดที่สุด
- Swift ใช้ value types เป็นหลัก และมี semantics แบบ "copy-on-write"
- Rust ทำให้การใช้ค่าที่ถูก "moved" และ "borrowed" เป็นเรื่องง่าย แต่ถ้าจะใช้ค่า
Cowต้องทำงานเพิ่ม - Swift ทำให้การใช้ค่าแบบ "copy-on-write" เป็นเรื่องง่าย แต่ต้องทำงานเพิ่มหากจะใช้การ borrow และ move
- Rust เร็วกว่าโดยปริยาย ส่วน Swift เรียบง่ายและใช้งานง่ายกว่าโดยปริยาย
Swift ซ่อนแนวคิดของ Rust ไว้ในไวยากรณ์แบบคล้าย C
- ไวยากรณ์ของ Swift ซ่อนแนวคิดจากภาษาสาย functional ไว้ในรูปแบบที่คล้าย C ทำให้นักพัฒนายอมรับได้ง่าย
- เปรียบเทียบคำสั่ง
matchของ Rust กับคำสั่งswitchของ Swift - ที่จริงแล้ว
switchของ Swift ก็คือmatchexpression เหมือนกัน เพียงแค่ใช้ชื่อและไวยากรณ์ต่างออกไป - Swift สามารถเพิ่มเมธอดให้กับ
enumได้โดยตรง
Optional types
- Rust ไม่มี
nullแต่มีNone - Swift มี
nilแต่จริงๆ แล้วก็คือNoneแบบเดียวกัน - Swift ใช้
T?แทนOptionและบังคับให้คอมไพเลอร์ตรวจสอบว่าไม่ใช่nil - ใน Swift การใช้งาน optional types ทำได้ง่าย
การจัดการข้อผิดพลาด
- Rust ไม่มี
try-catchแต่ใช้ชนิดข้อมูลResult - Swift ใช้
do-catchแทนtry-catchและต้องใส่tryไว้หน้าการเรียกฟังก์ชัน - การจัดการข้อผิดพลาดของ Swift คล้ายกับ Rust แต่ถูกซ่อนไว้ด้วยไวยากรณ์ที่คุ้นเคยกว่า
คอมไพเลอร์ของ Rust จับปัญหาได้ ส่วนคอมไพเลอร์ของ Swift ช่วยแก้บางปัญหา
- คอมไพเลอร์ของ Rust จับปัญหาทั่วไปได้จำนวนมากตั้งแต่ตอนคอมไพล์ และยังเสนอวิธีแก้ให้ด้วย
- ตัวอย่างเช่น self-referential enums
- Swift ใช้คีย์เวิร์ด
indirectเพื่อระบุชนิดข้อมูลแบบ recursive และให้คอมไพเลอร์จัดการที่เหลือ
Swift "บริสุทธิ์" น้อยกว่า
- Swift ถูกออกแบบมาเพื่อแทนที่ Objective-C และจึงต้องสามารถเชื่อมต่อกับโค้ดเดิมได้
- Swift ตัดสินใจเชิงปฏิบัติหลายอย่าง ทำให้เป็นภาษาที่ใหญ่กว่า Rust
- Swift ถูกออกแบบโดยคำนึงถึง "progressive disclosure" ยิ่งเรียนรู้ภาษาไปมากขึ้น ก็ยิ่งเห็นความสามารถเพิ่มขึ้น
- ฟีเจอร์ภาษาบางส่วนของ Swift:
- classes / inheritance
- async-await
- async-sequences
- actors
- getter และ setter
- lazy properties
- property wrappers
- Result Builders (เช่น HTML / SwiftUI)
ราคาที่ต้องจ่ายเพื่อความสะดวก
- Swift เป็นภาษาที่เริ่มต้นได้ง่ายกว่าและช่วยให้ทำงานได้เร็วขึ้น
- ไวยากรณ์คุ้นเคยกว่า และมีหลายอย่างที่ระบบจัดการให้อัตโนมัติ
- Swift เป็นภาษาระดับสูงกว่า ซึ่งก็มาพร้อม trade-off แบบเดียวกัน
- โดยพื้นฐานแล้ว โปรแกรม Rust เร็วกว่าโปรแกรม Swift มาก
- Rust เร็วโดยปริยายและเปิดให้ทำให้ช้าลงได้ ส่วน Swift ง่ายโดยปริยายและเปิดให้ทำให้เร็วขึ้นได้
- ทั้งสองภาษามีพื้นที่ใช้งานของตัวเอง
- Rust เหมาะกับ system และ embedded programming มากกว่า
- Swift เหมาะกับการเขียน UI และเซิร์ฟเวอร์มากกว่า
- เมื่อเวลาผ่านไป คาดว่าพื้นที่ที่ทั้งสองภาษาทับซ้อนกันจะยิ่งมากขึ้น
สรุปโดย GN⁺
- บทความนี้อธิบายความเหมือนและความต่างระหว่าง Swift กับ Rust ในเชิงเปรียบเทียบ
- Swift หยิบยืมแนวคิดหลายอย่างจาก Rust แล้วนำเสนอด้วยไวยากรณ์ที่คุ้นเคยกว่า
- ทั้งสองภาษามีจุดแข็งและการใช้งานของตัวเอง และคาดว่าเมื่อเวลาผ่านไปจะยิ่งมีส่วนที่ทับซ้อนกันมากขึ้น
- ช่วยให้เข้าใจความแตกต่างในหลายด้าน เช่น โมเดลการจัดการหน่วยความจำ การจัดการข้อผิดพลาด และ optional types ของ Swift กับ Rust
- ภาษาที่มีความสามารถคล้ายกันยังมี Kotlin, TypeScript เป็นต้น
1 ความคิดเห็น
ความเห็นจาก Hacker News
เหตุผลที่คนเพิ่งเริ่มใช้ Rust ชอบ Rust ก็เพราะพวกเขาเพิ่งได้รู้จักภาษาในสาย ML เป็นครั้งแรก
Rust เป็นภาษาแรกที่พาแนวทางจัดการหน่วยความจำอัตโนมัติแบบไม่มี GC เข้าสู่กระแสหลัก
ยุคของ Smalltalk จบลงแล้ว ตอนนี้เป็นยุคของ ML
ระหว่างทำงานผสาน Rust เข้ากับแอป iOS ที่เขียนด้วย Swift ก็ทำให้อยากใช้ Swift มากขึ้น
Rust นำแนวคิด ownership มาใช้เพื่อแก้ปัญหาการจัดการหน่วยความจำ แต่ไม่ได้เป็นผู้คิดค้นแนวคิดนี้
Rust และ Swift ต่างก็มีจุดแข็งของตัวเอง
เครื่องมือของ Swift ใช้งานลำบากกว่า Rust
เคยพยายามเรียน Rust แต่เจอปัญหาเพราะตัวอย่างซับซ้อนเกินไป
Swift สามารถเพิ่มเมธอดลงใน enum ได้โดยตรง
Swift ใช้ value type เป็นพื้นฐาน และใช้ copy-on-write semantics
ทุกครั้งที่อ่านบทความชื่นชม Swift ก็จะสงสัยถึงประสบการณ์ของนักพัฒนาที่ไม่ได้ใช้ระบบนิเวศ Apple/macOS
สงสัยว่าตัวเองเป็นคนเดียวหรือเปล่าที่ไม่ชอบ dot syntax ของ Zig และ Swift
.variantvsType::Variant