# [Rust](https://en.wikipedia.org/wiki/Rust_(programming_language))
Rust đã được lựa chọn là ngôn ngữ yêu thích nhất trong cuộc khảo sát của StackOverflow bốn năm liên tiếp. Hiện tại, rất nhiều công ty lớn đang áp dụng Rust vào sản phẩm của mình như Google, Microsoft, v.v… Và hôm nay, chúng ta sẽ tìm hiểu Rust là gì?
## :question: Rust là gì?
Rust là một ngôn ngữ lập trình tĩnh (static typing) được phát triển ở Mozilla. Vốn là dự án cá nhân của một nhân viên tại Mozilla Research tên là [Graydon Hoare](https://github.com/graydon), sau đó được Mozilla chính thức công bố vào năm 2010. Trong cùng năm đó, trình biên dịch vốn được viết bằng [OCaml](https://en.wikipedia.org/wiki/OCaml) đã được viết lại bằng chính ngôn ngữ Rust và dựa trên máy ảo [LLVM](https://github.com/llvm/llvm-project).
## :gear: Các tính năng của Rust.
- :car: Trình biên dịch của Rust
Trình biên dịch của Rust, với cái tên "[rustc](https://github.com/rust-lang/rust)", là một trong những trình biên dịch tiên tiến nhất hiện nay. Bạn sẽ không cần phải biết quá nhiều về Rust để làm việc với nó, bởi vì bạn có thể học qua những phần báo lỗi vô cùng chi tiết của trình biên dịch.
- :statue_of_liberty: Rust là một ngôn ngữ lập trình tĩnh (static typing)
Trong ngôn ngữ lập trình Rust, mỗi biến sẽ có một kiểu cố định liên kết với nó, và một khi đã khai báo thì ta sẽ không thể gán các giá trị có kiểu dữ liệu khác vào nó, khác với các ngôn ngữ lập trình động (dynamic typing) như Javascript và Python. Các kiểu dữ liệu này sẽ được kiểm tra trong lúc biên dịch (compile-time checking) và đảm bảo chúng ta sẽ không bị các lỗi trong khi chạy (runtime error) liên quan tới kiểu của biến như Javascript và Python.
- :zero: Zero cost abstraction
Với các ngôn ngữ khác, việc gọi một hàm khác trong một hàm, ví dụ như đoạn mã sau:
```cpp
void bar() { return; }
void foo() { return bar(); }
int main() { foo(); }
```
Chương trình dịch ra từ đoạn mã này sẽ chậm hơn một chương trình với mã gọi trực tiếp hàm `bar` vì chương trình sẽ phải gọi hai hàm thay vì một. Để giải quyết vấn đề này, chúng ta sẽ phải dùng các từ khoá đặc biệt như `inline`, từ khoá này sẽ gợi ý cho trình biên dịch chèn đoạn mã trong hàm vào thay vì gọi hàm trực tiếp (như đoạn mã dưới).
```cpp
int main() { bar(); }
```
Với Rust thì trình biên dịch sẽ tự động "inline" mã cho các bạn. Thế nên dù bạn có viết mã như thế nào thì chương trình dịch ra vẫn sẽ giống nhau.
- :handshake: "Ownership" và "Borrowing"
Nếu như bạn đã từng tiếp xúc với các ngôn ngữ như Java hoặc Go thì có lẽ bạn đã nghe đến khái niệm "garbage collector" ít nhất một lần. Tuy đây là một tính năng có khả năng giúp bạn bớt lo về bộ nhớ, nhưng sẽ dẫn tới các vấn đề khác như tăng dung lượng tệp nhị phân (binary file) do phải bao gồm cả “garbage collector” như Java, hoặc là chương trình sẽ tiêu tốn bộ nhớ nhiều hơn theo một chu kì nhất định như Go. Nhưng Rust lại bỏ đi tính năng này, và thay vào đó là bạn sẽ phải tự mình quản lý các biến. Với các ngôn ngữ khác, khi truyền biến, không truyền tham chiếu (reference) vào hàm thì trình biên dịch sẽ “sao chép” (clone) giá trị của biến ra một biến mới, thì Rust sẽ chuyển "ownership" của biến cho "scope" (mỗi scope là một “block” mã nằm giữa hai ngoặc {}) khác, hay còn gọi là cho mượn (borrow). Và khi không một “scope” nào giữ “ownership” của một biến thì trình biên dịch sẽ xoá bỏ (drop) biến đó khỏi bộ nhớ.
- :rocket: Nhanh
Là một ngôn ngữ được dịch sang mã máy (binary code), Rust là một trong những ngôn ngữ nhanh nhất hiện nay, ngang với các ngôn ngữ như C++, Go, … và chỉ thua mỗi C.
## :chart_with_upwards_trend: Vì sao bạn nên dùng Rust?
- :brain: An toàn về bộ nhớ
Như đã nói ở trên, các bạn sẽ phải hoàn toàn tự chủ về những biến mà mình đang sở hữu hoặc điều khiển, và bạn sẽ không thể có hai con trỏ chỉ về cùng một vùng dữ liệu trên bộ nhớ. Việc này sẽ giúp bạn tránh khỏi các lỗi liên quan đến “data race” và các lỗi như tràn bộ nhớ (stack overflow).
- :package: [Cargo](https://github.com/rust-lang/cargo)
Cargo là trình quản lý "dependency" chính thức của Rust. Cargo sẽ tải những “crate” (một đơn vị tính "dependency"/thư viện, tương đương với "package" của Node và "gem" của Ruby) từ [crates.io](https://crates.io/) về và sẽ dịch những "crate" này khi biên dịch chương trình cho bạn thay vì việc phải viết những Makefile lằng nhằng và rắc rối như C++. Ngoài ra, Cargo còn cung cấp một hệ thống "plugin" giúp cho ta có thể làm rất nhiều việc như ["lint" mã](https://github.com/rust-lang/rust-clippy) cho đến [kiểm tra có "dependency" nào lỗ hổng bảo mật hay không](https://crates.io/crates/cargo-audit).
- :man_and_woman_holding_hands: Cộng đồng và hệ sinh thái lớn
Rust có một cộng đồng người sử dụng rất lớn ở khắp các mạng xã hội như [Discord](https://discord.com/invite/rust-lang), [Reddit](https://www.reddit.com/r/rust/), … luôn sẵn sàng giúp đỡ các người mới. Và với một cộng đồng lớn như vậy, mỗi ngày trên [crates.io](https://crates.io/) đều có hàng ngàn "crate" được cập nhật và thêm mới, giúp ta có thể làm được rất nhiều việc như xây dựng một hệ thống REST API cho đến giao diện cho ứng dụng và trang web.
## :chart_with_downwards_trend: Vì sao không nên dùng Rust?
- 🤏 Chưa được ứng dụng rộng rãi
Rust là một ngôn ngữ lập trình tương đối mới với phiên bản ổn định đầu tiên vào năm 2015. Vì thế, hiện đang có rất ít công ty hoặc doanh nghiệp lớn đưa Rust vào sử dụng chính thức nên nếu bạn đang mong muốn tìm một công việc với kỹ năng Rust của mình thì khả năng thành công là rất thấp.
- :arrow_heading_up: Rất khó học
Những khái niệm của Rust như "ownership" và "borrowing" rất rắc rối và khó để tiếp cận, khiến cho "learning curve" của Rust rất dốc.
- :deciduous_tree: Hệ sinh thái
Tuy Rust sở hữu cho chính mình một hệ sinh thái lớn với vô vàn "crate" có thể làm nhiều việc to nhỏ lớn bé khác nhau, nhưng đa số đều đang trong giai đoạn "thai nghén", đều đang là phiên bản 0.x nên sẽ có rất nhiều "breaking change" liên tục. Bên cạnh đó, rất nhiều "crate" còn không được "maintain" thường xuyên, dẫn đến mã bị lỗi thời hoặc biên dịch lỗi nên không thể sử dụng được.
- :snail: Biên dịch chậm
Quá trình biên dịch của Rust bao gồm rất nhiều bước phức tạp, ví dụ như kiểm tra "ownership", cho đến "link" các "crate" lại với nhau để tối ưu tệp nhị phân được xuất ra. Việc này khiến cho quá trình biên dịch một dự án lớn với rất nhiều "dependency" sẽ kéo dài rất lâu, có thể lên tới cả tiếng.
## :exclamation: Tổng kết
Rust là một ngôn ngữ tuyệt vời với rất nhiều tiềm năng để phát triển và ứng dụng trong tương lai. Mình tin rằng trong tương lai, rất có khả năng Rust sẽ thay thế các ngôn ngữ lập trình biên dịch (compiled language) khác như C++ và Go.