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

Đăng ngày:

 

Sửa ngày:

84 Lượt xem

Bắt đầu với ngôn ngữ lập trình Rust

Rust

Chào anh em.

Lần này, chúng ta sẽ khám phá Rust, một ngôn ngữ lập trình đang thu hút sự chú ý trong thời gian gần đây.

Rust là Gì

Rust là một ngôn ngữ lập trình mã nguồn mở được Mozilla, công ty phát triển trình duyệt web “Firefox”, hỗ trợ. Nó được thiết lập với mục tiêu tối ưu hóa hiệu suất và độ tin cậy của việc sử dụng bộ nhớ, thay thế cho C và C++, cũng như đảm bảo tính an toàn trong xử lý song song. Ngoài ra, trong khoảng thời gian từ 2016 đến 2022, Rust đã được bình chọn là “Ngôn ngữ lập trình được yêu thích nhất” theo cuộc khảo sát của Stack Overflow Developer Survey, làm tăng sự chú ý đối với nó trong những năm gần đây.

Vậy thì bây giờ chúng ta hãy bắt đầu từ việc cài đặt môi trường.

Cài Đặt Môi Trường

Tải Rust từ trang web chính thức.

rust.png

Bạn có thể tải trình cài đặt từ Get started.

Sau đó, khởi chạy trình cài đặt đã tải về. Rust yêu cầu cài đặt Visual C++. Nếu chưa có trên máy tính, bạn sẽ thấy màn hình sau và chọn 1 để tiến hành cài đặt.

image.png

Tiếp theo, bạn sẽ được hỏi về tùy chọn cài đặt Rust, chọn 1 và tiếp tục cài đặt.

image.png

Sau những bước trên, bạn đã hoàn tất cài đặt môi trường.

HelloWorld

Bắt đầu với chương trình HelloWorld.

Chạy lệnh sau trên dòng lệnh:

cargo new hello-world

Sau khi chạy lệnh này, cấu trúc thư mục sau sẽ được tạo ra:

hello-world
  Cargo.toml
  src
    main.rs

Cargo.toml là tệp mô tả (manifest file) chứa các phụ thuộc và cài đặt cho Rust. Mã nguồn được đặt trong thư mục src/main.rs.

Nội dung của main.rs như sau:

fn main() {
    println!("Hello, world!");
}

Nhìn chung, đây có vẻ giống với C hoặc C++.

Tiếp theo, trong thư mục “hello-world”, chúng ta chạy lệnh sau để chạy chương trình HelloWorld:

cargo run

Kết quả hiển thị sẽ giống như sau và chương trình sẽ được thực thi với thông điệp “Hello, World!”:

C:\src\hello-world> cargo run
   Compiling hello-world v0.1.0 (C:\src\hello-world)
    Finished dev [unoptimized + debuginfo] target(s) in 1.66s
     Running `target\debug\hello-world.exe`
Hello, world!

Ứng Dụng Song Song

Tiếp theo, chúng ta sẽ tạo một ứng dụng sử dụng xử lý song song mà Rust nổi bật.

Nội dung của ứng dụng sẽ là giảm kích thước nén của các tệp jpg.

Trước hết, chúng ta sẽ đặt các thư viện cần thiết cho việc xử lý tệp hình ảnh và xử lý đồng thời vào Cargo.toml:

[dependencies]
jpeg-encoder = "0.6.0"
rayon = "1.8.0"

Các thư viện này sẽ được cài đặt tự động khi chạy cargo build.

Tiếp theo, chúng ta sẽ xem xét mã nguồn của main:

use std::fs;
use std::time::Instant;
use jpeg_encoder::Encoder as JpegEncoder;
use jpeg_encoder::ColorType;
use rayon::prelude::*;

fn main() {
    let start = Instant::now();

    // Lấy nội dung thư mục
    let files: Vec<_> = fs::read_dir("./data").unwrap()
        .filter_map(|x| x.ok())
        .collect();

    files.par_iter().enumerate()
        .for_each(|(_index, entry)| {
            // Lấy tên tệp
            let img_name = &entry.file_name().into_string().unwrap();

            // Mở ảnh
            let open_data = format!("{}{}", "./data/" ,img_name);
            let img = image::open(open_data).unwrap();

            // Lưu ảnh với tỷ lệ nén jpg là 50%
            let img_out_name = format!("{}{}", "./data/OUT_" ,img_name);

            let encoder = JpegEncoder::new_file(img_out_name, 50).unwrap();
            let _ = encoder.encode(&img.to_rgb8(), img.width()

 as u16, img.height() as u16, ColorType::Rgb);
        });

    let end = start.elapsed();
    println!("Thời gian xử lý: {}.{:03} giây", end.as_secs(), end.subsec_nanos() / 1_000_000);
}

Mỗi phần trong mã nguồn được giải thích như sau:

use std::fs;
use std::time::Instant;
use jpeg_encoder::Encoder as JpegEncoder;
use jpeg_encoder::ColorType;
use rayon::prelude::*;

Ở đây, chúng ta khai báo các thư viện sẽ được sử dụng. Hai thư viện đầu tiên là thư viện chuẩn, còn thư viện dưới cùng là thư viện đã được thêm vào.

    // Lấy nội dung thư mục
    let files: Vec<_> = fs::read_dir("./data").unwrap()
        .filter_map(|x| x.ok())
        .collect();

Ở đây, chúng ta xác định dữ liệu cơ bản để sử dụng song song với Rayon. Dữ liệu này là danh sách các tệp trong thư mục “data”.

    files.par_iter().enumerate()
        .for_each(|(_index, entry)| {
            // Lấy tên tệp
            let img_name = &entry.file_name().into_string().unwrap();

            // Mở ảnh
            let open_data = format!("{}{}", "./data/" ,img_name);
            let img = image::open(open_data).unwrap();

            // Lưu ảnh với tỷ lệ nén jpg là 50%
            let img_out_name = format!("{}{}", "./data/OUT_" ,img_name);

            let encoder = JpegEncoder::new_file(img_out_name, 50).unwrap();
            let _ = encoder.encode(&img.to_rgb8(), img.width() as u16, img.height() as u16, ColorType::Rgb);
        });

Ở đây, chúng ta sử dụng Rayon để xử lý đồng thời các tệp trong danh sách. Đối với mỗi tệp, chúng ta mở ảnh, giảm kích thước nén xuống 50%, và lưu lại ảnh.

    let end = start.elapsed();
    println!("Thời gian xử lý: {}.{:03} giây", end.as_secs(), end.subsec_nanos() / 1_000_000);

Cuối cùng, chúng ta đo thời gian chạy của chương trình và hiển thị ra màn hình.

Kết quả khi chạy ứng dụng này sẽ có thời gian xử lý nhanh hơn so với việc không sử dụng xử lý đồng thời.

Tổng Kết

Vậy là đây là hành trình đầu tiên với Rust. Bạn thấy sao? Tôi nghĩ sẽ có những tình huống bạn có thể sử dụng xử lý đồng thời một cách dễ dàng, an toàn. Tôi hy vọng sẽ tiếp tục khám phá Rust và sử dụng nó trong tương lai. Có vẻ như khả năng thực hiện ý tưởng của bạn với các thư viện sẵn có là khá cao.

Bạn có muốn thử làm Rust không?

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