4 คะแนน โดย GN⁺ 2024-09-07 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

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 ก็คือ match expression เหมือนกัน เพียงแค่ใช้ชื่อและไวยากรณ์ต่างออกไป
  • 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 ความคิดเห็น

 
GN⁺ 2024-09-07
ความเห็นจาก Hacker News
  • เหตุผลที่คนเพิ่งเริ่มใช้ Rust ชอบ Rust ก็เพราะพวกเขาเพิ่งได้รู้จักภาษาในสาย ML เป็นครั้งแรก

    • Rust มีชุมชนที่ให้ความรู้สึกคุ้นเคยสำหรับเหล่า Unix hacker
  • Rust เป็นภาษาแรกที่พาแนวทางจัดการหน่วยความจำอัตโนมัติแบบไม่มี GC เข้าสู่กระแสหลัก

    • ยังมีทางเลือกอื่นอย่าง Swift, OCaml และ Scala
  • ยุคของ Smalltalk จบลงแล้ว ตอนนี้เป็นยุคของ ML

    • ภาษาในยุค 2000s ได้รับอิทธิพลมาจาก Smalltalk
    • ภาษาใหม่ ๆ เป็นภาษาในสาย ML
    • ถ้าเรียน Scala แล้ว ก็จะเรียน Rust หรือ Swift ได้ง่ายเช่นกัน
  • ระหว่างทำงานผสาน Rust เข้ากับแอป iOS ที่เขียนด้วย Swift ก็ทำให้อยากใช้ Swift มากขึ้น

    • Swift ใช้งานข้ามแพลตฟอร์มได้ แต่โดยหลักแล้วมุ่งเป้าไปที่แพลตฟอร์มของ Apple
    • Rust มีระบบแพ็กเกจที่หลากหลาย
    • แพ็กเกจ Swift มักพึ่งพา OS API จึงทำงานบน Linux หรือ WASM ไม่ได้
    • มีกรณีที่ IBM เลิกใช้ Swift ฝั่งเซิร์ฟเวอร์
  • Rust นำแนวคิด ownership มาใช้เพื่อแก้ปัญหาการจัดการหน่วยความจำ แต่ไม่ได้เป็นผู้คิดค้นแนวคิดนี้

    • ภาษาอย่าง Cyclone มีอิทธิพลต่อเรื่องนี้
  • Rust และ Swift ต่างก็มีจุดแข็งของตัวเอง

    • Swift มีไวยากรณ์ที่กระชับกว่า แต่บางส่วนก็เป็นเขตเฉพาะของคอมไพเลอร์
    • นอกระบบนิเวศของ Apple แล้ว Swift เป็นเพียงภาษาที่สำคัญลำดับสองหรือสาม
    • ถ้าปัญหานี้ไม่ถูกแก้ Swift ก็น่าจะยังคงเป็นภาษาที่เน้นใช้กับ Apple เป็นหลัก
  • เครื่องมือของ Swift ใช้งานลำบากกว่า Rust

    • Xcode ไม่รองรับ MacBook Air ปี 2018 ที่ใช้ macOS 12
    • SourceKit-LSP ถูกปฏิบัติราวกับเป็นเครื่องมือสำคัญลำดับรอง
    • Rust 1.81 และ rust-analyzer ทำงานได้ดี
  • เคยพยายามเรียน Rust แต่เจอปัญหาเพราะตัวอย่างซับซ้อนเกินไป

    • โค้ดตัวอย่างบนเว็บไซต์ Rust ซับซ้อน
  • Swift สามารถเพิ่มเมธอดลงใน enum ได้โดยตรง

    • ใน Rust ก็ทำแบบเดียวกันได้
  • Swift ใช้ value type เป็นพื้นฐาน และใช้ copy-on-write semantics

    • แต่สิ่งนี้ใช้กับแค่ array, dictionary และ string เท่านั้น
    • value type ของ Swift จะถูกคัดลอกทันที
  • ทุกครั้งที่อ่านบทความชื่นชม Swift ก็จะสงสัยถึงประสบการณ์ของนักพัฒนาที่ไม่ได้ใช้ระบบนิเวศ Apple/macOS

    • ไม่เคยเจอนักพัฒนา Swift ที่ไม่ได้ใช้ macOS
    • สิ่งสำคัญไม่ได้มีแค่ standard library แต่ยังรวมถึงเครื่องมือ, LSP, ไลบรารี, บทช่วยสอน ด้วย
    • เชื่อว่า Swift เป็นภาษาที่ดี แต่ดูเหมือนจะดีเฉพาะบน macOS
  • สงสัยว่าตัวเองเป็นคนเดียวหรือเปล่าที่ไม่ชอบ dot syntax ของ Zig และ Swift

    • .variant vs Type::Variant
    • ถ้าโค้ดยาวหรือซับซ้อนพอ การไม่มีชื่อ type อยู่ใกล้ ๆ ก็คงทำให้ใช้งานไม่สะดวก
    • โดยเฉพาะเมื่อใช้เอดิเตอร์ที่ไม่มีความสามารถแบบ IDE