4 điểm bởi GN⁺ 2024-09-07 | 1 bình luận | Chia sẻ qua WhatsApp

Rust

  • Rust là một ngôn ngữ rất được yêu thích, nhanh và có cộng đồng tuyệt vời
  • Rust giải quyết các vấn đề quản lý bộ nhớ bằng cách giới thiệu khái niệm ownership
  • Cung cấp các tiện ích như Rc, Arc, Cow để hỗ trợ đếm tham chiếu và "clone-on-write"
  • Khi cần làm việc ở mức thấp hơn, có thể dùng hệ thống unsafe để truy cập raw C pointer
  • Rust có nhiều đặc điểm của ngôn ngữ hàm như tagged enum, biểu thức match, hàm hạng nhất và hệ thống kiểu mạnh
  • Sử dụng trình biên dịch dựa trên LLVM nên có thể biên dịch sang mã native và WASM

Swift

  • Swift cũng đã được tác giả sử dụng trong vài năm, và khi học Rust thì nhận ra những điểm tương đồng với Swift
  • Swift cũng có các đặc điểm của ngôn ngữ hàm như tagged enum, biểu thức match, hàm hạng nhất
  • Swift mặc định dùng value type và có ngữ nghĩa "copy-on-write"
  • Khi cần hiệu năng cao hơn, có thể chọn hệ thống ownership để "move" giá trị
  • Khi cần làm việc ở mức thấp hơn, có thể dùng hệ thống unsafe để truy cập raw C pointer
  • Swift cũng dùng trình biên dịch dựa trên LLVM nên có thể biên dịch sang mã native và WASM

Cảm giác déjà vu?

  • Swift và Rust có bộ tính năng rất giống nhau
  • Khác biệt lớn nằm ở góc nhìn
  • Khi xét mô hình bộ nhớ mặc định thì sự khác biệt trở nên rõ ràng

Rust đi từ trên xuống, Swift đi từ dưới lên

  • Rust bắt đầu là ngôn ngữ hệ thống cấp thấp rồi cung cấp công cụ để đi lên cấp cao hơn
  • Swift bắt đầu là ngôn ngữ cấp cao rồi cung cấp công cụ để đi xuống cấp thấp hơn
  • Mô hình quản lý bộ nhớ là ví dụ rõ ràng nhất
  • Swift mặc định dùng value type và có ngữ nghĩa "copy-on-write"
  • Rust giúp việc dùng giá trị "moved" và "borrowed" trở nên dễ dàng, nhưng cần thêm công sức nếu muốn dùng giá trị Cow
  • Swift giúp việc dùng giá trị "copy-on-write" trở nên dễ dàng, nhưng ngược lại cần thêm công sức khi dùng borrowing và moving
  • Rust mặc định nhanh hơn, còn Swift mặc định đơn giản và dễ hơn
Quảng cáo

Swift giấu các ý tưởng của Rust trong cú pháp kiểu C

  • Cú pháp của Swift giấu các khái niệm của ngôn ngữ hàm trong cú pháp kiểu C để lập trình viên dễ tiếp nhận hơn
  • So sánh câu lệnh match của Rust với câu lệnh switch của Swift
  • Câu lệnh switch của Swift thực chất giống hệt biểu thức match, chỉ khác tên và cú pháp
  • Swift cho phép thêm method trực tiếp vào enum

Kiểu optional

  • Rust không có null nhưng có None
  • Swift có nil, nhưng thực ra nó cũng giống None
  • Swift dùng T? thay cho Option, và buộc trình biên dịch phải kiểm tra rằng giá trị không phải nil
  • Trong Swift, việc dùng kiểu optional rất dễ dàng

Xử lý lỗi

  • Rust không có try-catch mà dùng kiểu Result
  • Swift dùng do-catch thay cho try-catch, và phải đặt try trước lời gọi hàm
  • Cách xử lý lỗi của Swift giống Rust, nhưng được che đi bằng cú pháp quen thuộc hơn

Trình biên dịch Rust bắt lỗi, còn trình biên dịch Swift giải quyết một phần lỗi

  • Trình biên dịch Rust phát hiện nhiều vấn đề phổ biến ngay tại thời điểm biên dịch và gợi ý cách sửa
  • Ví dụ về enum tự tham chiếu
  • Swift dùng từ khóa indirect để đánh dấu kiểu đệ quy, và trình biên dịch xử lý phần còn lại

Swift ít "thuần" hơn

  • Swift được thiết kế để thay thế Objective-C, nên cần có khả năng giao tiếp với mã hiện có
  • Swift đã đưa ra nhiều lựa chọn thực dụng và là một ngôn ngữ lớn hơn Rust
  • Swift được thiết kế với ý tưởng "tiết lộ dần", nên càng học sâu về ngôn ngữ sẽ càng thấy thêm nhiều tính năng
  • Một số tính năng ngôn ngữ của Swift:
    • class / kế thừa
    • async-await
    • async-sequences
    • actors
    • getter và setter
    • lazy properties
    • property wrappers
    • Result Builders (ví dụ: HTML / SwiftUI)
    Quảng cáo

Cái giá của sự tiện dụng

  • Swift là ngôn ngữ dễ bắt đầu và dễ nâng cao năng suất hơn
  • Cú pháp quen thuộc hơn và nhiều việc được xử lý tự động
  • Swift là ngôn ngữ cấp cao hơn, và điều đó đi kèm cùng những trade-off tương tự
  • Mặc định, chương trình Rust nhanh hơn đáng kể so với chương trình Swift
  • Rust mặc định là nhanh, nhưng cho phép làm nó chậm hơn; còn Swift mặc định là dễ, nhưng cho phép làm nó nhanh hơn
  • Hai ngôn ngữ đều có mục đích sử dụng riêng
    • Rust phù hợp hơn với lập trình hệ thống và embedded
    • Swift phù hợp hơn với việc viết UI và máy chủ
  • Theo thời gian, phần giao nhau giữa hai ngôn ngữ được kỳ vọng sẽ ngày càng lớn hơn

Tóm tắt của GN⁺

  • Bài viết này so sánh và giải thích những điểm tương đồng và khác biệt giữa Swift và Rust
  • Swift vay mượn nhiều ý tưởng của Rust và cung cấp chúng bằng cú pháp quen thuộc hơn
  • Mỗi ngôn ngữ đều có điểm mạnh và mục đích sử dụng riêng, và theo thời gian sẽ có nhiều phần giao nhau hơn
  • Giúp hiểu sự khác biệt ở nhiều khía cạnh như mô hình quản lý bộ nhớ, xử lý lỗi, kiểu optional giữa Swift và Rust
  • Những ngôn ngữ có tính năng tương tự gồm Kotlin, TypeScript, v.v.

1 bình luận

 
GN⁺ 2024-09-07
Ý kiến trên Hacker News
  • Lý do những người lần đầu dùng Rust thích Rust là vì đây cũng là lần đầu họ tiếp xúc với các ngôn ngữ họ ML

    • Rust mang lại một cộng đồng quen thuộc với các Unix hacker
  • Rust là ngôn ngữ đầu tiên đưa quản lý bộ nhớ tự động không dùng GC vào dòng chính

    • Cũng có các lựa chọn thay thế như Swift, OCaml, Scala
  • Thời của Smalltalk đã kết thúc, giờ là thời của ML

    • Các ngôn ngữ của thập niên 2000 bắt nguồn từ Smalltalk
    • Các ngôn ngữ mới thuộc họ ML
    • Nếu học Scala thì cũng sẽ dễ học Rust hoặc Swift
  • Khi làm việc tích hợp Rust vào ứng dụng iOS viết bằng Swift, tôi lại muốn dùng Swift nhiều hơn

    • Swift có thể dùng đa nền tảng, nhưng chủ yếu vẫn nhắm tới nền tảng Apple
    • Rust có nhiều hệ thống package khác nhau
    • Package Swift thường phụ thuộc vào API của OS nên không chạy trên Linux hay WASM
    • Có trường hợp IBM đã từ bỏ Swift trên máy chủ
  • Rust đưa vào khái niệm ownership để giải quyết vấn đề quản lý bộ nhớ, nhưng không phải là bên phát minh ra nó

    • Những ngôn ngữ như Cyclone đã tạo ảnh hưởng
  • Rust và Swift mỗi bên đều có thế mạnh riêng

    • Swift có cú pháp gọn hơn, nhưng một số phần lại chỉ dành riêng cho compiler
    • Ngoài hệ sinh thái Apple, Swift chỉ là ngôn ngữ quan trọng thứ hai hoặc thứ ba
    • Nếu vấn đề này không được giải quyết, Swift có lẽ sẽ chủ yếu vẫn là ngôn ngữ dành cho Apple
  • Công cụ của Swift bất tiện hơn Rust

    • Xcode không hỗ trợ MacBook Air 2018 đang dùng macOS 12
    • SourceKit-LSP bị đối xử như công cụ quan trọng thứ hai
    • Rust 1.81 và rust-analyzer hoạt động tốt
  • Tôi đã thử học Rust nhưng gặp khó vì ví dụ quá phức tạp

    • Mã ví dụ trên website Rust khá phức tạp
  • Swift có thể thêm trực tiếp phương thức vào enum

    • Rust cũng có thể làm điều tương tự
  • Swift mặc định dùng value type và áp dụng copy-on-write semantics

    • Điều này chỉ áp dụng cho mảng, dictionary và chuỗi
    • Value type trong Swift được sao chép ngay lập tức
  • Mỗi lần đọc bài khen Swift, tôi lại tò mò về trải nghiệm của các lập trình viên không dùng hệ sinh thái Apple/macOS

    • Tôi chưa từng gặp lập trình viên Swift nào không dùng macOS
    • Không chỉ standard library mà cả công cụ, LSP, thư viện, tutorial... cũng đều quan trọng
    • Tôi tin Swift là một ngôn ngữ tốt, nhưng có vẻ chỉ tốt trên macOS
  • Tôi tự hỏi có phải mình là người duy nhất không thích cú pháp dấu chấm của Zig và Swift

    • .variant vs Type::Variant
    • Với đoạn mã đủ dài hoặc đủ phức tạp, nếu tên kiểu không ở gần thì sẽ rất bất tiện
    • Điều này đặc biệt đúng khi dùng editor không có các tính năng như IDE