2 điểm bởi GN⁺ 2024-07-16 | 1 bình luận | Chia sẻ qua WhatsApp

Sử dụng Rust cho hệ thống tệp

Mục tiêu

  • Dùng hệ thống kiểu của Rust để bắt được nhiều lỗi hơn ngay từ thời điểm biên dịch
  • Tự động hóa các tác vụ như dọn dẹp tài nguyên để nâng cao năng suất hơn so với mã C
  • Giảm các lỗ hổng liên quan đến bộ nhớ và rút ngắn thời gian gỡ lỗi

Ưu điểm của Rust

  • Rust loại bỏ hành vi không xác định và cung cấp khả năng nhìn thấy những gì đang diễn ra bên trong mã
  • Có thể chứng minh tính đúng đắn của mã viết bằng Rust, nhờ đó giảm các lỗi cản trở phát triển tính năng

Ví dụ về hệ thống kiểu của Rust

  • Hàm iget_locked() có các yêu cầu phức tạp
  • Trong Rust, có thể thay thế bằng hàm get_or_create_inode(), đồng thời dùng hệ thống kiểu để cưỡng chế các yêu cầu này

Thảo luận về việc đổi tên API

  • Vấn đề không khớp tên giữa API C và API Rust
  • Có thể không quen thuộc với cộng đồng phát triển hiện có
  • Có thể cần đồng bộ tên gọi

Các vấn đề chung

  • Cần quyết định liệu các abstraction của Rust sẽ được dùng chung cho mọi hệ thống tệp trong kernel hay chỉ tập trung vào các hệ thống tệp đơn giản được viết bằng Rust
  • Có thể phát sinh vấn đề đồng bộ với mã Rust khi mã C tiếp tục tiến hóa

Vấn đề vòng đời đối tượng

  • Vòng đời đối tượng có thể khác nhau tùy theo từng hệ thống tệp
  • Nếu mã hóa một vòng đời duy nhất vào API Rust, nó có thể không hoạt động với một số hệ thống tệp

Vấn đề của Rust binding

  • Không phải mọi hệ thống tệp sẽ chuyển sang Rust ngay lập tức
  • Khi mã C tiến hóa, các binding Rust có thể bị hỏng
  • Nếu binding Rust bị hỏng, vấn đề đó sẽ thuộc về các nhà phát triển Rust-for-Linux

Kết luận

  • Tiếp tục phát triển các binding Rust trong khi vẫn để mã C tiếp tục tiến hóa
  • Việc mã hóa nhiều ý nghĩa vào hệ thống kiểu Rust là tốt hay xấu sẽ trở nên rõ ràng hơn theo thời gian

Tóm tắt của GN⁺

  • Việc đưa Rust vào hệ thống tệp sẽ giúp cải thiện đáng kể an toàn bộ nhớ và năng suất
  • Hệ thống kiểu của Rust có thể cưỡng chế các yêu cầu API phức tạp, qua đó nâng cao tính đúng đắn của mã
  • Nếu các nhà phát triển C hiện có không học Rust, có thể phát sinh những khó khăn như vấn đề đồng bộ
  • Nếu binding Rust bị hỏng, trách nhiệm khắc phục sẽ thuộc về các nhà phát triển Rust-for-Linux
  • Một dự án có chức năng tương tự là Fuchsia OS của Google

1 bình luận

 
GN⁺ 2024-07-16
Ý kiến trên Hacker News
  • Việc mỗi hệ thống tệp quản lý vòng đời inode theo cách khác nhau nhưng lại dùng cùng một hàm để quản lý là đi ngược lại tầng trừu tượng

    • Vòng đời inode nên được quản lý theo từng hệ thống tệp
  • Có câu hỏi về việc liệu Rust có cần thay đổi để việc gọi C dễ dàng hơn hay không

    • Thiếu sự hiểu biết rõ ràng về khả năng tương tác giữa Rust và C
    • Với C++ và Objective-C, chỉ cần include tệp header và gọi hàm
    • Swift có thể include tệp Objective-C và gọi C
    • Thay vì bắt Rust phải chiều theo các nhà phát triển kernel, có lẽ bản thân ngôn ngữ cần linh hoạt hơn đôi chút
  • Chưa rõ liệu API Rust đang bọc API C hay đang tái triển khai nó

    • Nếu là tái triển khai thì việc dùng cùng tên với API C có thể gây ra vấn đề
  • Việc thêm Rust vào kernel làm phát sinh thêm độ phức tạp

    • Nếu viết một hệ điều hành mới từ đầu thì có thể dùng mọi tính năng của ngôn ngữ
    • Nhưng khi thêm vào một codebase khổng lồ đã tồn tại thì sẽ phát sinh thêm vấn đề
  • Cuộc thảo luận rất văn minh

    • Không đồng ý với giọng điệu tiêu cực
    • Lạc quan vì những người liên quan đã truyền đạt rõ ràng các vấn đề
  • Việc có thêm lựa chọn trong kernel Linux luôn là điều có lợi

    • Rust không phải lời giải cho mọi vấn đề
    • Rust cung cấp mô hình lập trình an toàn nhưng có giới hạn
    • Vấn đề bộ nhớ? Dùng Rust!
    • Vấn đề đồng thời? Chuyển sang Rust!
    • Nhưng không thể làm mọi thứ mà C làm nếu không dùng các khối unsafe
    • Rust có thể mang lại góc nhìn mới, nhưng không phải giải pháp hoàn chỉnh
  • Một số bình luận ở cuối trang lwn.net khá thô lỗ

    • Hãy thử tưởng tượng nói với người đang đóng góp cho một dự án mã nguồn mở câu như "khoa học tiến bộ qua từng đám tang"
  • Có thảo luận về vấn đề không khớp tên giữa API C và API Rust

    • Khó khăn của các quy ước đặt tên kế thừa
    • Có thể giữ nguyên cùng một tên hoặc bọc lại bằng tên mới
    • Đặt tên là việc khó