Rust.Viết chắc tay.Chạy nhẹ máy.
Một ngôn ngữ khiến bạn nghĩ kỹ hơn
về những gì mình đang xây dựng.
Từ một biến nhỏ đến cả hệ thống lớn: cùng tìm hiểu ownership, làm quen Cargo và viết chương trình Rust đầu tiên.
Cho dữ liệu
một người giữ.
Trước khi hỏi “chạy nhanh cỡ nào”, Rust thường khiến bạn hỏi: “ai đang giữ dữ liệu này?”.
Rust là ngôn ngữ lập trình hướng đến hiệu năng, khả năng kiểm soát tài nguyên và an toàn bộ nhớ. Hệ thống kiểu và ownership giúp phát hiện nhiều lỗi ngay khi biên dịch.
Repo rust-lang/rust chứa trình biên dịch, thư viện chuẩn và tài liệu. Để bắt đầu viết ứng dụng, bạn cài toolchain bằng rustup; không cần tải cả kho mã nguồn này. [1]
Với ownership, mỗi giá trị có chủ sở hữu. Khi chủ sở hữu ra khỏi phạm vi, giá trị thường được dọn qua cơ chế Drop. Rust không cần một bộ thu gom rác bắt buộc chạy nền để thực hiện mô hình này. [2]
Điều mình muốn bạn mang theo sau bài này là một thói quen: nhìn đường đi của dữ liệu, thay vì chỉ nhìn dòng code có chạy hay không.
Một bản thảo.
Ba cách trao tay.
Cùng một String, thay một dòng gán và xem điều gì xảy ra. Chọn từng cách bên dưới để so sánh.
Move: chuyển quyền sở hữu.
nguoi_doc nhận ownership của String. Dùng lại ban_thao ở dòng cuối sẽ bị compiler từ chối.
fn main() {
let ban_thao = String::from("Xin chào Rust!");
let nguoi_doc = ban_thao;
println!("{ban_thao} | {nguoi_doc}");
}
E0382 · Ví dụ cố ý gây lỗiKhông thể dùng giá trị qua biến đã chuyển ownership.
Kiểm tra trên Rust Playground ↗Borrow: mượn mà vẫn giữ.
&ban_thao tạo tham chiếu chỉ đọc. Dữ liệu vẫn thuộc ban_thao; cả hai cách truy cập đều dùng được trong ví dụ này.
fn main() {
let ban_thao = String::from("Xin chào Rust!");
let nguoi_doc = &ban_thao;
println!("{ban_thao} | {nguoi_doc}");
}
Biên dịch đượcXin chào Rust! | Xin chào Rust!
Thử trên Rust Playground ↗Clone: mỗi người một bản.
Với String, .clone() tạo bản sao dữ liệu riêng. Cả hai biến còn dùng được, đổi lại là chi phí sao chép và cấp phát.
fn main() {
let ban_thao = String::from("Xin chào Rust!");
let nguoi_doc = ban_thao.clone();
println!("{ban_thao} | {nguoi_doc}");
}
Biên dịch đượcXin chào Rust! | Xin chào Rust!
Thử trên Rust Playground ↗Minh họa tương tác; trang không chạy compiler. Ba đoạn mã đã được đối chiếu trên Rust Playground.
Cài một lần.
Bắt đầu thật nhỏ.
rustup quản lý toolchain. rustc biên dịch Rust. Cargo quản lý dự án, dependency và các bước build.
Linux & macOS
Mở terminal và chạy trình cài chính thức. Chọn toolchain stable nếu bạn mới bắt đầu.
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
Linux cần linker và bộ công cụ native như GCC/Clang; macOS thường dùng Xcode Command Line Tools. Xem yêu cầu theo hệ điều hành [4].
Windows
Vào trang rustup, tải và chạy rustup-init.exe phù hợp với máy. Làm theo bước cài Visual Studio C++ Build Tools / Windows SDK khi trình cài yêu cầu.
Sau khi cài, mở terminal mới để cập nhật PATH. Các lệnh Cargo trong bài dùng được cả ở PowerShell.
rustc --version
cargo --version
Hello, Rust.
Chào một khởi đầu.
Cargo tạo Cargo.toml và src/main.rs. Lệnh cargo run build rồi chạy chương trình chào mặc định. [5]
cargo new hello-rust
cd hello-rust
cargo run
Một lời chào.
Có cả đường lui.
Thay nội dung src/main.rs bằng ví dụ dưới đây. Chương trình nhận tên, bỏ khoảng trắng thừa và trả lỗi rõ ràng nếu tên rỗng.
fn chao(ten: &str) -> Result<String, &'static str> {
let ten = ten.trim();
if ten.is_empty() {
return Err("Tên không được để trống.");
}
Ok(format!("Chào {ten}, cùng học Rust nhé!"))
}
fn main() {
let ten = std::env::args()
.nth(1)
.unwrap_or_else(|| String::from("ts4m"));
match chao(&ten) {
Ok(loi_chao) => println!("{loi_chao}"),
Err(thong_bao) => {
eprintln!("Lỗi: {thong_bao}");
std::process::exit(1);
}
}
println!("Tên gốc vẫn dùng được: {ten}");
}
#[cfg(test)]
mod tests {
use super::chao;
#[test]
fn bo_khoang_trang_va_giu_ten_tieng_viet() {
assert_eq!(
chao(" Tấn Sang "),
Ok(String::from("Chào Tấn Sang, cùng học Rust nhé!"))
);
}
#[test]
fn tu_choi_ten_rong() {
assert_eq!(chao(" \t\n "), Err("Tên không được để trống."));
}
}
Mượn tên, không lấy tên.
chao(&ten) mượn dữ liệu qua &str. Sau lời gọi, ten vẫn dùng được ở dòng println! cuối.
Thành công và thất bại đều có kiểu.
Result<String, &'static str> trả lời chào trong Ok, hoặc thông báo lỗi trong Err. match xử lý cả hai nhánh. [15]
Một lỗi nhỏ, một bài test.
Hai test kiểm tra tên tiếng Việt có khoảng trắng và tên rỗng. Compiler giúp kiểm tra kiểu; test giúp kiểm tra điều mình mong chương trình làm.
Đã chạy mã, test, rustfmt và Clippy bằng Rust Playground — stable, edition 2024. Đây là kết quả kiểm chứng mẫu; không phải benchmark Rust.
cargo run -- "Tấn Sang"
cargo run -- " "
cargo test
cargo fmt --check
cargo clippy
Chào Tấn Sang, cùng học Rust nhé! Tên gốc vẫn dùng được: Tấn Sang
Đối số chỉ có khoảng trắng " " trở thành tên rỗng sau khi trim, nên chương trình báo lỗi và kết thúc với mã 1. Khi không truyền tên, chương trình dùng ts4m.
Playground chạy mẫu với tên mặc định. Chạy các đối số khác trong terminal của bạn; không có dependency ngoài thư viện chuẩn.
Cargo lo công cụ.
Bạn lo ý tưởng.
Không cần nhớ tất cả ngay. Bắt đầu bằng vài lệnh, dùng thường xuyên rồi bổ sung khi dự án lớn hơn.
cargo checkKiểm tra mã nhanh, chưa tạo executable hoàn chỉnh.
cargo testChạy các bài kiểm thử của dự án.
cargo clippyĐọc gợi ý để cải thiện mã và phát hiện một số lỗi thường gặp.
--releaseTạo bản build dùng cấu hình tối ưu hóa release.
Nguồn: Cargo [5], cargo test [6], Clippy [7].
Ba thứ nên biết thêm.
- Cargo.toml & Cargo.lock
- Manifest mô tả package và dependency; lockfile ghi lại các phiên bản dependency đã được giải quyết.
- cargo fmt
- Định dạng lại mã. Thêm
--checknếu chỉ muốn kiểm tra. Nếu thiếu formatter/linter, dùngrustup component add rustfmt clippy. - rust-analyzer
- Bổ sung gợi ý kiểu, điều hướng và chẩn đoán trong editor. Chọn tích hợp phù hợp từ trang rust-analyzer.
Từ mã nguồn đến chương trình.
cargo build --release
Ví dụ này tạo executable trong target/release/: hello-rust trên Linux/macOS, hoặc hello-rust.exe trên Windows.
Build cho hệ điều hành và kiến trúc bạn định chạy. “Có file executable” chưa có nghĩa một bản build sẽ chạy trên mọi máy. Đây là CLI nên không cần domain hay web server.
Thích Rust.
Vẫn nên hỏi vì sao.
Gợi ý của mình: hãy học Rust bằng một công cụ nhỏ mà bạn thực sự muốn dùng.
Khi đáng để thử
CLI xử lý file, công cụ hệ thống hoặc một dịch vụ cần kiểm soát tài nguyên là những hướng thực hành hợp lý. Rust có bộ công cụ và tài liệu riêng cho ứng dụng dòng lệnh. [10]
Một ý tưởng vừa sức: liệt kê những file lớn trong thư mục, xuất báo cáo rồi thêm test cho trường hợp thư mục trống.
Khi cần cân nhắc
Ownership, borrowing và lifetimes đòi hỏi thời gian làm quen. Với một script dùng một lần hoặc hạn giao gấp, công cụ bạn đã thành thạo có thể phù hợp hơn.
Đây là nhận định biên tập, không phải bảng xếp hạng tốc độ. Đo trên tác vụ thật trước khi quyết định viết lại một dự án.
Safe Rust ngăn data race, nhưng không loại bỏ mọi race condition hay deadlock. unsafe cho phép một số thao tác cần lập trình viên tự giữ các điều kiện an toàn; nó không tắt borrow checker. Logic sai, panic và lỗi thiết kế vẫn cần bạn kiểm thử, quan sát và sửa. Unsafe Rust [8] · Races [9].
Bên trong
rust-lang/rust.
Khi muốn hiểu sâu hơn, hãy mở repo theo từng cánh cửa. Kho nguồn này dành cho chính hệ sinh thái triển khai ngôn ngữ. [1]
compiler/Mã nguồn trình biên dịch↗library/Thư viện chuẩn của Rust↗src/Tài liệu và các công cụ hỗ trợ↗tests/Hệ thống bài kiểm thử↗Muốn build chính compiler?Nâng cao · mở hướng dẫn+
Chuẩn bị Python, linker và các dependency native theo Rust Compiler Development Guide. Repo dùng công cụ bootstrap ./x; đây là một quy trình riêng với việc chạy Cargo trong ứng dụng nhỏ của bạn.
git clone --filter=blob:none https://github.com/rust-lang/rust.git
cd rust
./x setup
./x check
./x build library
./x setup giúp chọn cấu hình; ./x check kiểm tra; ./x build library xây compiler và thư viện ở stage phù hợp. Windows xem cách gọi Python/PowerShell trong guide. Quy trình có thể tốn đáng kể thời gian và ổ đĩa. Các lệnh bootstrap này được đối chiếu tài liệu, chưa được chạy trong phạm vi bài. [11]
Muốn góp sức? Đọc CONTRIBUTING.md, chọn một issue hoặc phần tài liệu vừa sức, rồi làm theo hướng dẫn của thành phần đó. Thay đổi thuộc submodule có thể cần gửi về repo riêng. [12]
Rust chủ yếu được phân phối theo MIT hoặc Apache-2.0; một số phần có giấy phép khác. Xem LICENSE và COPYRIGHT trong repo trước khi tái sử dụng. Bài này là nội dung độc lập của ts4m.
Một cargo new.
Nhiều điều để khám phá.
Đọc The Book để hiểu nền tảng, dùng Rust by Example để xem mã, hoặc làm bài tập Rustlings. Cả ba đều được giới thiệu trên trang học Rust chính thức. [13]
Những chỗ để đối chiếu.
- Rust — kho mã nguồn chính
- The Book — ownership, move và clone
- The Book — references và borrowing
- The Book — cài đặt Rust theo hệ điều hành
- The Book — bắt đầu với Cargo
- Cargo Book — cargo test
- Clippy — cách sử dụng
- The Book — Unsafe Rust
- Rustonomicon — data race và race condition
- Rust — công cụ dòng lệnh
- Compiler Development Guide — build compiler
- Rust — hướng dẫn đóng góp
- Rust — lộ trình học chính thức
- Rust Playground — tự thử mã nguồn
- The Book — Result và lỗi có thể xử lý
Nội dung đối chiếu ngày 15.10.2026. Tài liệu upstream có thể thay đổi; hướng dẫn cài đặt hiện hành nằm tại các nguồn được liên kết.