ts4m.dev
MỚI GÓC LẬP TRÌNH / SỐ 005

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.

Xưởng ownership — minh họa về Rust Bánh răng màu đồng bao quanh lõi ownership, cùng các thẻ Cargo, tham chiếu chuỗi và Result trên nền bản vẽ màu kem. MEMORY / MECHANICS TS4M / 005 PRECISION IS A FEATURE. FIG. 001 OWNERSHIP ONE OWNER. NO GUESSING. $ cargo BUILD SOMETHING SOLID. &str A SHARED REFERENCE. Result<T, E> HANDLE BOTH POSSIBILITIES. COMPILED
Minh họa của ts4m · một góc nhìn về Rust
01 OWNERSHIP02 BORROWING03 CARGO04 BUILD SOMETHING
01 / ĐI TỪ CỐT LÕI

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.

02 / CHẠM ĐỂ HIỂU

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.

BÀN THỬ OWNERSHIPSTRING / MOVE · BORROW · CLONE

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.

Move — ví dụ cố ý không biên dịch
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.

Borrow — mượn dữ liệu
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.

Clone — tạo bản sao riêng
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.

Đừng áp quy tắc của String cho mọi kiểu. Các kiểu có trait Copy, như số nguyên, có thể được sao chép khi gán. [2]

Mượn cũng có quy tắc. Với cùng dữ liệu, khi các tham chiếu còn được dùng, bạn có nhiều tham chiếu chỉ đọc hoặc một tham chiếu có thể sửa; tham chiếu phải luôn hợp lệ. [3]

03 / CHUẨN BỊ BÀN LÀM VIỆC

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.

Terminal · Linux / macOS
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.

Mở trình cài chính thức ↗

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.

Terminal mới · kiểm tra toolchain
rustc --version
cargo --version
CHIẾC DỰ ÁN ĐẦU TIÊN

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]

Tạo dự án đầu tiên
cargo new hello-rust
cd hello-rust
cargo run
04 / VIẾT MỘT ĐIỀU CÓ THỂ CHẠY

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.

src/main.rs · thay toàn bộ nội dung file
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."));
    }
}
01

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.

02

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]

03

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.

2 / 2 unit test đạt

Đã 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.

Terminal · chạy và kiểm tra
cargo run -- "Tấn Sang"
cargo run -- "   "
cargo test
cargo fmt --check
cargo clippy
KẾT QUẢ VỚI TÊN “TẤN SANG”
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.

05 / NHỊP LÀM VIỆC HẰNG NGÀY

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.

01 / VIẾTcargo check

Kiểm tra mã nhanh, chưa tạo executable hoàn chỉnh.

02 / THỬcargo test

Chạy các bài kiểm thử của dự án.

03 / CHỈNHcargo clippy

Đọc gợi ý để cải thiện mã và phát hiện một số lỗi thường gặp.

04 / BUILD--release

Tạ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 --check nếu chỉ muốn kiểm tra. Nếu thiếu formatter/linter, dùng rustup 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.

Terminal · tạo bản tối ưu
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.

06 / CHỌN CÔNG CỤ CÓ LÝ DO

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.

Biên dịch được ≠ hết mọi lỗi.

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].

07 / MỞ CỬA XƯỞNG LỚN

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]

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.

Nâng cao · build compiler trên shell phù hợp
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.

TỪ ĐÂY, TỰ VIẾT TIẾP.

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]

Mở The Rust Book
ĐỌC TIẾP / NGUỒN CHÍNH THỨC

Những chỗ để đối chiếu.

  1. Rust — kho mã nguồn chính
  2. The Book — ownership, move và clone
  3. The Book — references và borrowing
  4. The Book — cài đặt Rust theo hệ điều hành
  5. The Book — bắt đầu với Cargo
  6. Cargo Book — cargo test
  7. Clippy — cách sử dụng
  8. The Book — Unsafe Rust
  9. Rustonomicon — data race và race condition
  10. Rust — công cụ dòng lệnh
  11. Compiler Development Guide — build compiler
  12. Rust — hướng dẫn đóng góp
  13. Rust — lộ trình học chính thức
  14. Rust Playground — tự thử mã nguồn
  15. 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.