- Nguyên lý design của Rust giống với C++ trong Abstraction without overhead và RAII (Resource acquisition is initialization).
- Rust có hiệu suất như C/C++, rất phù hợp với lập trình hệ thống, nơi performance được xem trọng nhất
- Có kiểu hệ thống mạnh mẽ và quản lý life cycle độc đáo tạo thuận lợi cho việc quản lý bộ nó trong suốt quá trình compile, đảm an toàn cho bộ nhớ và thread, làm cho chương trình chạy rất nhanh sau khi compile
- Rust cung cấp pattern matching và type inference như một ngôn ngữ functional programming, làm cho code rất simple và thanh lịch
- Macro và traits cho phép Rust có tính trừu tượng rất cao và tiết kiệm nhiều công sức khi build nó thành các thư viện
Vì có công cụ quản lý package xuất sắc, Cargo, nên Rust có rất nhiều loại thư viện như là Hyper cho HTTP, Tokio và Mio cho asynchronous I/O, cơ bản là tất cả các thư viện đều có cấu trúc như là một backend application
Generally speaking, Rust is mainly used to develop server-side applications with high performance at this stage. In addition, its innovation in the type system and syntax gives it a unique edge in developing Domain-Specific Libraries (DSL).
Nói chung, Rust hiện nay chủ yếu cho việc xây dựng ứng dụng server-side với high performance. Ngoài ra, sáng tạo về type system và syntax cho phép nó độc quyền trong việc xây dựng Domain-Specific Libraries (DSL).
Ứng dụng Rust
As a new programming language, Rust is unique. To name just a few projects that are using Rust,
Như là một ngôn ngữ lập trình, Rust rất độc đáo. Một số dự án đang dùng Rust:
- Hệ thống lưu trữ phân tán trong backend của Dropbox
- Servo, kernel mới của Firefox
- Redox, the new operating system
- Redox, một hệ điều hành mới
- TiKV, layer lưu trữ của TiDB, một database phân tán được phát triển bởi PingCAP.
TiKV là một key-value database phân tán. Nó là thành phần core của dự án TiDB và là dự án open source của Google Spanner. Chúng tôi chọn Rust để build một dự án lưu trữ phân tán từ đầu. Trong note này, tôi sẽ chỉ ra các lý do.
Một thời gian dài trong quá khứ, C hoặc C++ đã thống lĩnh sự phát triển của hạ tầng phần mềm. Java hay Golang gặp những vấn đề như GC jitter, đặc biệt là trong trường hợp đọc/ghi dữ liệu tần suất lớn. Mặt khác, Goroutine, một tính năng hấp dẫn của Golang, đã giảm đáng kể độ phức tạp của việc phát triển đồng thời các ứng dụng ở khía cạnh chi phí phụ trội. Đối với một cơ sở hạ tầng phần mêm như database, sự quan trọng của performance đã không được nhắc đến. Mặt khác, hệ thống cũng cần duy trì tính “Certainty” của nó để thuận lợi trong việc điều chỉnh performance. Nhưng giới thiệu GC và một cái runtime khác đã góp phần làm ngược lại. Vì thế trong một thời gian dài, C/C++ dường như là lựa chọn duy nhất
TiKV originates from the end of 2015. Our team was struggling among different language choices such as Pure Go, Go + Cgo, C++11, or Rust.
TiKV bắt nguồn từ cuối năm 2015. Team của chúng tôi đã cố gắng chọn lựa một trong các ngôn ngữ như Pure Go, Go + Cgo, C++11 hoặc Rust
- Pure Go: Core team của chúng tôi có nhiều kinh nghiệm với Go. SQL layer của TiDB được xây dựng bằng Go và chung tôi có nhiều lợi ích từ hiệu suất cao của Go. Tuy nhiên, khi xây dựng một storage layer, Pure Go là sự lựa chọn đầu tiên với một lý do đơn giản: Chúng tôi quyết d9in5g sử dụng RocksDB như là một lớp dười cùng, nó được viết bằng C++. các implementation LSM-Tree hiện tại(như goleveldb) trong Go khó mà trường thành như RocksDB
- Cgo: Nếu buộc phải dùng Go, chúng tôi sẽ dùng Cgo như một cầu nối nhưng Cgo cũng có vấn đề riêng. Vào cuối năm 2015, performance có thể bị ảnh hưởng lớn nếu gọi Cgo trong Go code hơn là gọi Cgo trong cùng 1 thread với Goroutine. Bên cạnh đó, các database yêu cầu phải thường xuyên gọi đến các thư viện lưu trữ bên dưới, như là RocksDB. Dĩ nhiên, một số cách workaround đã được giới thiệu để không còn giời hạn khi gọi Cgo. Nhưng, việc implement rất phức tạp trong khi vấn đề của GC vẫn không được giải quyết. Ở storage layer, chúng tôi muốn sử dụng bộ nhớ càng hiệu quả càng tốt. Các workaround như mở rộng sử dụng syscall.Mmap hoặc sử dụng lại object có thể làm code rất khó đọc.
- C++11: Hoàn toàn không có vấn đề gì với C++11. RocksDB được phát triển bằng C++11. Nhưng dựa vào background của team và những gì chúng tôi làm, chúng tôi không chọn C++11. Lý do là vì
Sự thiếu thốn của các công cụ quản lý package và CI. Tuy là không đáng kể lắm, nhưng các công cụ automate này rất quan trọng đối với những dự án lớn bởi vì nó liên quan trực tiếp hiệu suất và tốc độ phát triển dự án. Còn nữa, các thư viện C++ không đủ và một số cái chúng ta phải tự tạo
Rust: Phiên bản 1.0 được phát hàng vào 5/2015 với nhiều feature hay như:
- Memory safety
- High performance bằng LLVM. Runtime không khác gì C++. Nó cũng có mối liên kết với các C/C++ packages.
- Cargo, công cụ quản lý package mạnh mẽ
- Syntax hiện đại
- Hầu như nhất quán xử lý sự cố và kinh nghiệm điều chỉnh hiệu suất. Chúng ta có thể trực tiếp sử dụng lại một số công cụ như perf mà chúng ta đã quen thuộc.
- FFI (Foreign Function Interface), tự do gọi trực tiếp vào các API của C trong RocksDB
- Cái quan trọng và kỳ thú nhất là memory safety. Như đã đề cập trước đó, vấn đề quản lý bộ nhớ và data race dường như dễ xảy ra với C++ thuần. Nhưng tôi tin vào giải pháp triệt để của những gì Rust đang làm là đặt những ràng buộc trong trình biên dịch và giải quyết nó ngay từ đầu. Đối với những dự án lớn, đừng bào giờ đặt cược chất lượng vào con người. Vì con người hay gây ra lỗi. Mặc Rust khó để bắt đầu, tôi nghĩ rằng nó hoàn toàn có giá trị. Bên cạnh đó, Rust là ngôn ngữ lập trình rất hiện đại(hiện đại là cái méo gì? :((( ), type system phi thường, pattern modeling, powerful macros, traits, etc… Một khi đã quen với nó, có thể cải thiện hiệu năng rất lớn, có thể ngang ngửa C++. Dựa vào kinh nghiệm của chúng tôi, cần 1 tháng để 1 software engineer có thể code bằng Rust từ zero. Hiệu quả gần như giống nhau giữa một kỹ sư Rust giàu kinh nghiệm và một kỹ sư của Golang.
Tóm lại, Rust, một ngôn ngữ lập trình mới nổi, dường như rất mới với hầu hết các developer ở Trung Quốc, nhưng nó trở thành đối thủ đầy tiềm năng của C/C++. Rust được mọi người bình chọn là “most loved” trong một cuộc “trưng cầu developer ý” trên StackOverflow’s 2016. Vì vậy về mặt dài hạn, Rust sẽ tỏa sáng ở nơi mà memory safety và performance được xem trọng bậc nhất!

No comments:
Post a Comment