Bài viết Câu hỏi About RongvangIT
profile Pic
0
0

Đăng ngày:

  54 Lượt xem

Tại sao nên chú ý đến ngôn ngữ lập trình Rust

Rust

Chào anh e.

Tôi đang làm việc tại một tập đoàn IT tại Nhật, và chịu trách nhiệm cho việc tiêu chuẩn hóa công nghệ liên quan đến thiết kế chương trình, mã nguồn và kiểm thử đơn vị.

Việc phát hiện và sửa lỗi sớm trong quá trình phân tích tĩnh của chương trình có vai trò quan trọng trong công việc của đội của tôi. Mục tiêu là giảm chi phí xử lý lỗi sau giai đoạn (đối với phương pháp phát triển theo mô hình Waterfall) hoặc giải quyết nhanh các nợ kỹ thuật (đối với phương pháp Agile) bằng cách quản lý bộ nhớ an toàn mà không cần sự tạm dừng do quản lý bộ nhớ tại runtime.

Có nhiều công cụ để phát hiện lỗi sớm trong phân tích tĩnh, từ mã nguồn mở đến thương mại. Tuy nhiên, khi muốn cải thiện chất lượng phần mềm một cách toàn diện hơn, tôi bắt đầu nghĩ về việc “làm thế nào để làm cho ngôn ngữ lập trình tốt hơn.” Tôi hy vọng rằng Rust có thể đáp ứng kỳ vọng đó và bắt đầu điều tra và xác minh.

Rust là gì?

Rust là ngôn ngữ lập trình mục tiêu “tạo ra phần mềm hiệu quả và đáng tin cậy mà ai cũng có thể tạo ra.” Được đề xuất bởi Graydon Hoare của Mozilla vào năm 2006, và phiên bản ổn định đầu tiên (1.0) đã được phát hành vào năm 2015, đây là một ngôn ngữ khá mới.

Một số đặc điểm nổi bật của Rust bao gồm:

  • Hiệu suất cao
    • Hoạt động nhanh chóng và hiệu quả về bộ nhớ.
    • Không cần Garbage Collector, có thể quản lý bộ nhớ an toàn mà không lo lắng về sự tạm dừng do quản lý bộ nhớ ở runtime.
  • Tương tác linh hoạt
    • Hỗ trợ nhiều loại môi trường thực thi.
    • Không cần runtime để xử lý ngôn ngữ, nên có thể tích hợp tốt với các ngôn ngữ khác.
  • Đáng tin cậy
    • Sử dụng hệ thống kiểu có thể sử dụng cấu trúc dữ liệu đại số và thực hiện kiểm tra kiểu một cách nghiêm ngặt. Nếu định nghĩa dữ liệu và xử lý không khớp, sẽ xuất hiện lỗi biên dịch, giúp phát hiện lỗi từ sớm trong quá trình phát triển và giúp phần mềm phát triển mà vẫn đảm bảo tính nhất quán.
    • Sử dụng mô hình quản lý sở hữu, có thể loại bỏ lỗi do không rõ trách nhiệm giải phóng tài nguyên, bằng cách loại bỏ chúng ở thời điểm biên dịch.
    • Thông tin về việc liệu dữ liệu có thể chia sẻ giữa các luồng / cập nhật đồng bộ được thể hiện như một phần của thông tin kiểu, giúp loại bỏ lỗi liên quan đến an toàn luồng trong quá trình biên dịch.
  • Sản xuất
    • Thông điệp lỗi của trình biên dịch rõ ràng và thậm chí cung cấp giải pháp.
    • Thư viện và tài liệu đáng tin cậy đã được phát triển, nhiều thứ cần thiết cho việc phát triển phần mềm có thể dễ dàng đạt được thông qua cộng đồng.
      • Biết ơn những phần mềm nguồn mở xuất sắc.
    • Với thông tin tĩnh (cây cú pháp và kiểu), các công cụ kiểm tra (Clippy) và công cụ định dạng mã nguồn (rustfmt) có sẵn là những công cụ xuất sắc.

Các trường hợp sử dụng của Rust

Rust là một ngôn ngữ lập trình đa dụng, vì vậy khi được hỏi “nó có thể được sử dụng để làm gì?” câu trả lời có thể là “bất cứ điều gì ngôn ngữ thông thường khác có thể làm.” Rust có thể áp dụng ở nhiều nơi, tương tự như C có thể áp dụng ở hầu hết các nơi.

Danh sách nền tảng được hỗ trợ của Rust

  • Phía máy chủ
    • Ứng dụng trực tuyến
    • Ứng dụng lô
    • Công cụ dòng lệnh
  • Phía khách hàng
    • Trình duyệt (WebAssembly)
    • Điện thoại thông minh hoặc máy chơi game
    • Máy tính để bàn
  • Nơi mà C hoặc C++ trước đây là trung tâm
    • Thư viện native chạy như một phần của chương trình của ngôn ngữ khác
    • Module được tích hợp vào hạt nhân hệ điều hành
    • Plugin của thiết bị mạng như tường lửa hoặc cân bằng tải
    • Thiết bị nhúng có tài nguyên nhỏ

Trong đó, tôi nghĩ rằng Rust sẽ hữu ích ở những trường hợp sau đây:

  • Thư viện chất lượng cao và hiệu suất cao để nhúng vào ngôn ngữ khác
    • Python (PyO3), JavaScript (WASM), …
  • Dịch vụ cần khởi động và dừng tiến trình thường xuyên để tự động mở rộng tài nguyên
    • Ứng dụng của FaaS (ví dụ: AWS Lambda, Azure Functions)
  • Dịch vụ mà việc dừng trong vài giây ảnh hưởng đến người dùng
    • Phát sóng video và âm thanh, điều khiển thiết bị vật lý, v.v.
  • Chuyển đổi ứng dụng web, di động và máy tính để bàn sang Rust để chạy nhanh và tiết kiệm tài nguyên.

Khía cạnh khó khăn của Rust là chi phí học tập

Rust có lẽ đang đối mặt với rào cản lớn nhất trong việc phổ biến với chi phí học tập ban đầu của nó. Đối với người mới, thậm chí việc biên dịch còn khó khăn trước khi chạy chương trình.

Tuy nhiên, nếu có thể học được đến mức viết mã và biên dịch chương trình như mong đợi, từ đó trở đi, tôi cảm thấy rằng có thể tạo ra các chương trình chất lượng và dễ bảo trì mà không cần suy nghĩ quá nhiều. Tôi nghĩ rằng rào cản từ người mới đến người có trình độ trung bình hoặc cao là khá thấp.

Những điểm quan trọng đạt được từ buổi học

Tại công ty chúng tôi, những thành viên không biết về Rust được yêu cầu học thông qua tài liệu Rustlings.

Chúng tôi đã tổ chức một buổi học với một số thành viên, bao gồm một người 50 tuổi với kinh nghiệm lập trình ban đầu là ngôn ngữ C, một người 30 tuổi hiểu rõ về Python và một số thành viên khác ở độ tuổi 20 không có nhiều kinh nghiệm lập trình.

Mỗi tuần, thành viên tham gia buổi học đều được yêu cầu viết cảm nhận của họ. Dưới đây là một số điểm đáng chú ý về những điều họ cảm nhận và cảm xúc trong quá trình học:

  • Kiểu tĩnh

    • Tại sao hằng số trong Rust lại yêu cầu khai báo kiểu nhỉ?
    • Rust có thể linh hoạt một chút với khai báo kiểu chứ, Rust-kun?
  • Quyền sở hữu và mượn chỗ

    • Quyền sở hữu thực sự khó khăn.
    • Khá khó phân biệt giữa mượn chỗ và tham chiếu là gì.
    • Có vẻ như giọng nói của Rust Compiler đang nói: “Làm thế nào mà mọi người, như là lập trình viên, không hiểu được nơi nào sở hữu?”
  • Thời gian sống (Lifetime)

    • Vẫn còn một số điểm không thực sự rõ ràng về việc sử dụng hoặc không sử dụng đặc điểm thời gian sống.
    • Việc làm cho thời gian sống của hàm trở nên giống như thời gian sống của một cấu trúc là rõ ràng, nhưng không hiểu tại sao bộ nhớ vẫn được giữ nguyên sau khi ra khỏi hàm.
    • Đã hiểu về sự quan trọng của việc làm thời gian sống của tham chiếu giống nhau, nhưng nếu có thể làm cho nó giống nhau mặc định thay vì phải chỉ định bằng 'a thì sẽ tốt hơn.
  • Chỉ số thông minh

    • Rc thực sự có vẻ không khác gì so với thu thập rác.
    • Vẫn không hiểu rõ về ứng dụng của Cow.
  • Đặc điểm của ngôn ngữ hàm

    • Khó chịu với cách viết không cần câu lệnh return…
    • Việc quyết định xem if là biểu thức hay câu lệnh (bao gồm cả return) khá khó khăn. Nhưng có lẽ giống với “?” (toán tử ba ngôi)?
    • Hàm map cũng giống như ngôn ngữ hàm. Có vẻ như cũng nên học về nó, nhưng ngưỡng cửa có vẻ cao.
  • Ngữ pháp và thư viện chuẩn

    • Muốn chỉ số khi cắt mảng được mô tả rõ hơn.
    • Hàm into được hiểu là tự động gọi hàm from với đối số và giá trị trả về ngược lại.
  • Công cụ

    • rust-analyzer có nhiều tính năng hữu ích như hiển thị tự động kiểu và hoàn thiện mã, có vẻ hữu ích cho quá trình lập trình.
    • Rustfmt giúp định dạng mã nguồn một cách sạch sẽ, giúp lập trình viên tập trung vào việc viết mã mà không phải lo lắng quá nhiều.
    • Muốn tìm hiểu thêm về các trường hợp mà Rustfix tự động sửa.
    • Clippy thực sự là một bất ngờ tích cực, mang lại những gợi ý hữu ích hơn cả trình biên dịch.
  • Khác

    • Có thể học được về các phần .rodata và .data trong tệp ELF.

Dựa trên những phản hồi trên, có một số thách thức khi đào tạo kỹ sư Rust:

  • Quyền sở hữu, trong khi người lập trình C và C++ có thể hiểu rõ, nhưng với những người quen với GC thì đó là một điều bí ẩn.

    • Khi dạy, việc nhấn mạnh ví dụ sử dụng quyền sở hữu cho quản lý tài nguyên ngoại trừ bộ nhớ có lẽ sẽ tốt?
  • Nếu không quen với ngôn ngữ hàm, có một số cú pháp khó hiểu.

  • Ngoài ngữ pháp, cần phải giảng dạy ít nhất là cơ bản về mô hình quản lý bộ nhớ như ngăn xếp và bộ nhớ heap.
  • Rối trong việc khi nào có thể lược bỏ khai báo kiểu với tính toán loại (type inference).
    • Ban đầu, việc ghi cách không lược bỏ (bao gồm cả thời gian sống) có vẻ tốt hơn để giảng dạy.

Nhận định về Rust

Cuối cùng, tôi muốn chia sẻ ấn tượng của mình sau khi thử nghiệm Rust.

Tăng tốc độ phát triển? Hay giảm?

Mặc dù việc học Rust khá khó khăn, nhưng sau khi hiểu rõ, tôi cảm thấy có thể tạo ra các sản phẩm nhanh hơn so với Python. Dưới đây là một số lý do mà tôi muốn đề cập, mặc dù có một số điều không chỉ giới hạn trong ngữ cảnh của Rust mà còn áp dụng cho các ngôn ngữ khác mà công ty chúng tôi sử dụng nhiều (như Java hoặc Python). Hãy xem xét trong bối cảnh so sánh với các ngôn ngữ khác có sử dụng thực tế. Do chưa có đủ dữ liệu để so sánh số liệu cụ thể, vui lòng thông cảm cho những thảo luận chủ yếu dựa trên đánh giá chất lượng.

  • Compiler giúp giảm công đoạn xem xét tự kiểm tra của bản thân.

    • Kiểm tra sự phù hợp giữa việc định nghĩa kiểu dữ liệu và xử lý nó.
    • Kiểm tra xem có quên giải phóng tài nguyên nào không, ngoại trừ bộ nhớ (ví dụ: tệp tin, kết nối TCP).
      • Quản lý quyền sở hữu đảm bảo quản lý những trường hợp “rời khỏi khối ≠ giải phóng tài nguyên”.
  • Giảm số lượng unit test cần thiết.

    • Kiểm thử các trường hợp với các đối số có kiểu dữ liệu hoàn toàn khác nhau.
    • Kiểm tra xem không có sự kết hợp giá trị không hợp lệ nào (điều kiện không thay đổi) trong đoạn mã.
      • Định nghĩa kiểu để không thể biểu diễn giá trị không hợp lệ (make illegal state unrepresentable).
  • Việc xem xét mã người khác trở nên dễ dàng hơn.

    • Những thứ phiền toái và nguy hiểm nổi bật và tốn kém để triển khai.
      • Phiền toái: Biến có thể thay đổi (mut), chia sẻ / đồng bộ giữa các luồng, v.v.
      • Nguy hiểm: Con trỏ thô, tránh kiểm tra kiểu, tham chiếu lặp (Rc + RefCell), v.v.
  • Cảm giác như xác suất gặp lỗi nhỏ trong các lỗi đặc biệt của thư viện đã giảm.

    • Khi sử dụng ngoài kịch bản, ngôn ngữ với kiểm tra kiểu nghiêm ngặt có vẻ ít gặp lỗi.

Trong quá khứ, việc xem xét mã và kiểm thử đơn vị đã phải kiểm tra những điều tôi đã đề cập, và việc xem xét này có thể giúp compiler Rust làm điều đó… có lẽ là điểm quan trọng để sử dụng Rust hiệu quả.

Lợi ích của “Khó khăn”

Rất nhiều điều mà compiler Rust đưa ra chỉ là những điều mà trong các ngôn ngữ khác cũng phải suy nghĩ. “Rust là khó khăn” có thể được hiểu là compiler Rust đang giúp giáo dục mọi thứ mà trước đây cần phải giảng dạy thông qua xem xét mã. Khi sử dụng Rust, có thể giảm phần nào công việc mà trước đây cần phải dạy thông qua xem xét mã, và điều này có thể được xem xét như là một ưu điểm.

Khi Rust trở thành một phần của đội ngũ, có thể sẽ có cơ hội nâng cao kỹ năng của toàn bộ tổ chức, phải không?

Kết luận

Hiện tại, chúng tôi đang tập trung vào việc xác minh điều này, nên bài viết này có thể trở thành một bài viết mạnh mẽ về Rust. Tuy nhiên, quyết định về việc sử dụng hoặc không sử dụng một ngôn ngữ lập trình hiếm khi chỉ phụ thuộc vào đánh giá về nó một cách cục bộ, vì vậy chúng tôi chưa biết được mức độ mà Rust có thể đạt được.

Tuy nhiên, việc khám phá sâu rộng vào công nghệ để nhìn xa trông rộng là một trải nghiệm vô cùng thú vị, vì vậy chúng tôi đang cố gắng hết sức để phát triển hơn nữa trong tương lai.

dev_pro_it
Đang làm IT tại Japan

Bình luận

Bài viết chưa có bình luận. Hãy trở thành người bình luận đầu tiên!
Sign up for free and join this conversation.
Sign Up
If you already have a RongvangIT account Login
Danh sách thư mục
Bắt đầu ngay với RồngVàngIT - nền tảng chia sẻ kiến thức lập trình tuyệt vời cho kỹ sư Việt Nam!

Hãy đăng nhập để sử dụng hàng loạt các chức năng tuyệt vời của RồngVàngIT !

  1. 1. Bạn sẽ nhận được các bài viết phù hợp bằng chức năng theo dõi tag và người dùng.
  2. 2. Bạn có thể đọc lại các thông tin hữu ích bằng chức năng lưu trữ nội dung.
  3. 3. Chia sẻ kiến thức, đặt câu hỏi và ghi lại quá trình trưởng thành của mình cùng RồngVàngIT !
Tạo tài khoản Đăng nhập
profile Pic