~/VibeHandbook
PDF miễn phí

Ngôn ngữ

rust-lang.org

Rust

Rust là gì

Rust là một ngôn ngữ lập trình hệ thống (systems language) được biên dịch, tập trung vào an toàn bộ nhớ. Hầu hết các ngôn ngữ khác chạy một garbage collector — một bộ dọn dẹp bộ nhớ tự động hoạt động ngầm để giải phóng bộ nhớ không còn dùng đến. Rust bỏ qua cơ chế đó và thay vào đó chứng minh bộ nhớ của bạn được xử lý đúng ngay trong lúc biên dịch chương trình. Hãy nghĩ đến một cuốn sách thư viện: chỉ một người được cầm và viết vào đó tại một thời điểm, và hệ thống từ chối cho mượn một cuốn sách đã bị trả lại và vứt bỏ — vì vậy bạn không bao giờ vô tình dùng phải thứ đã không còn tồn tại. Đó chính là điều mà mô hình ownership (quyền sở hữu) và borrowing (mượn) của Rust làm cho dữ liệu của bạn. Nó đảm bảo, trước khi chương trình của bạn từng chạy, rằng bạn sẽ không gặp phải data race (hai phần của code cùng thay đổi một thứ cùng lúc) hay lỗi use-after-free (dùng lại bộ nhớ đã được dọn dẹp rồi). Kết quả là tốc độ ngang tầm C nhưng có ít cách hơn để tự bắn vào chân mình.

Điểm mạnh

  • An toàn bộ nhớ và an toàn luồng (thread safety) được kiểm tra ngay khi chương trình đang được biên dịch, không cần garbage collector (bộ dọn dẹp bộ nhớ ngầm mà hầu hết ngôn ngữ khác cần dùng).
  • Hiệu năng ngang ngửa C và C++.
  • Hệ thống kiểu (type system) phong phú, pattern matching, và một trình quản lý gói hạng nhất (Cargo, công cụ build-và-đóng-gói tích hợp sẵn của Rust).
  • Thông báo lỗi từ trình biên dịch cực kỳ rõ ràng, giải thích chuyện gì sai và cách sửa.

Đánh đổi

  • Đường cong học tập dốc — borrow checker (phần của Rust thực thi quy tắc "mỗi lần chỉ một người giữ sách" ở trên) cần thời gian thực sự để làm quen.
  • Viết chậm hơn và biên dịch lâu hơn so với các ngôn ngữ cấp cao hơn.
  • Quá mức cần thiết cho các script đơn giản hay bản thử nhanh (prototype).
  • Rust bất đồng bộ (async) và code generic nặng về lifetime có thể trở nên thực sự phức tạp.

Khi nào nên dùng

Hãy chọn Rust khi hiệu năng, độ tin cậy, và khả năng kiểm soát tài nguyên đều quan trọng cùng lúc: phần mềm hệ thống, game engine, công cụ dòng lệnh, WebAssembly, hệ thống nhúng (embedded), hoặc các dịch vụ đòi hỏi hiệu năng cao. Đây là lựa chọn tệ cho các script dùng-rồi-bỏ, nơi mà những đảm bảo an toàn không đáng với công sức bỏ ra.

Mức độ phù hợp với vibe coding

Các trợ lý AI tạo ra code Rust trông có vẻ hợp lý, nhưng borrow checker mới là trọng tài thực sự — hãy chuẩn bị tinh thần dán lỗi biên dịch ngược lại cho AI và lặp lại nhiều lần, điều này hiệu quả vì các thông báo chẩn đoán của Rust rất chính xác và mô hình có thể hành động dựa trên đó. Hãy hướng dẫn AI dựa vào Result? để xử lý lỗi, ưu tiên các kiểu dữ liệu sở hữu (owned types) hoặc các phép mượn (borrow) rõ ràng thay vì vật lộn với lifetime, và đề xuất các crate (gói code tái sử dụng của Rust, được liệt kê trong Cargo.toml) một cách tường minh. Hãy yêu cầu các trường hợp kiểm thử cargo test để bạn có thể xác minh tính an toàn và hành vi. Khi mô hình đề xuất dùng unsafe, hãy phản đối và yêu cầu một giải pháp an toàn trước.

fn main() {
    let nums = vec![3, 1, 4, 1, 5, 9, 2, 6];
    let sum: i32 = nums.iter().filter(|&&n| n % 2 == 0).sum();
    println!("Sum of evens: {sum}");
}