Swift là Rust tiện dụng hơn
(blog.namangoel.com)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
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
matchcủa Rust với câu lệnhswitchcủa Swift - Câu lệnh
switchcủa Swift thực chất giống hệt biểu thứcmatch, 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ó
nullnhưng cóNone - Swift có
nil, nhưng thực ra nó cũng giốngNone - Swift dùng
T?thay choOption, và buộc trình biên dịch phải kiểm tra rằng giá trị không phảinil - Trong Swift, việc dùng kiểu optional rất dễ dàng
Xử lý lỗi
- Rust không có
try-catchmà dùng kiểuResult - Swift dùng
do-catchthay chotry-catch, và phải đặttrytrướ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)
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
Ý 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 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
Thời của Smalltalk đã kết thúc, giờ là thời của ML
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
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ó
Rust và Swift mỗi bên đều có thế mạnh riêng
Công cụ của Swift bất tiện hơn Rust
Tôi đã thử học Rust nhưng gặp khó vì ví dụ quá phức tạp
Swift có thể thêm trực tiếp phương thức vào enum
Swift mặc định dùng value type và áp dụng copy-on-write semantics
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 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
.variantvsType::Variant