LÀM THẾ NÀO ĐỂ TỐI ƯU HÓA MÃ NGUỒN JAVASCRIPT VỚI RUST
Giới thiệu
Rust là một ngôn ngữ cấp thấp được đánh máy mạnh mẽ. Giống như C / C ++, Rust có thể tận dụng tối đa công suất xử lý của máy để tạo ra các hệ thống có hiệu suất cao. Nó cũng an toàn. Những gì Rust hứa hẹn là kiểm soát C + + mà không có tất cả các trình xử lý sự cố an ninh như segfaults, null trỏ, tràn bộ đệm, và nhiều cơn ác mộng khác mà các nhà phát triển C + + phải tranh cãi với.
Rust của an toàn, kết hợp với mô đun của nó, làm cho nó phù hợp để hội nhập với các ngôn ngữ khác. Nhờ dễ dàng thực hiện đa luồng, chúng tôi có thể đẩy nhanh chóng các ứng dụng JavaScript một luồng duy nhất của chúng tôi.
Trong phần đầu của loạt Rust này, chúng ta sẽ đi qua việc thiết lập Rust, viết mã Rust, xuất mã và sử dụng mã trong môi trường Nút của chúng ta. Vào cuối bài báo này, bạn sẽ thấy được Rust với JavaScript không đau như thế nào.
Trong tương lai, chúng ta sẽ giải quyết đồng thời, đề tài, và các kỹ thuật tối ưu hóa khác mà chắc chắn sẽ chứng minh rằng Rust có thể tìm thấy một ngôi nhà trong mã JavaScript của chúng tôi.
Bước 1 - Thiết lập Node và Rust
Trong phần này chúng ta sẽ làm việc với một giải pháp đơn giản lặp đi lặp lại được viết bằng Rust. Sử dụng tính lặp sẽ cho phép chúng ta khám phá ra sự đột biến và kiểm soát dòng chảy trong Rust. Trước khi bắt đầu, chúng ta phải thiết lập môi trường Nút và Rust.
Thiết lập nút
Dưới đây là một số công cụ chúng ta sẽ cần theo từng bước:
1) N thơ . Đối với những người không quen thuộc với Node, Nút đơn giản cho phép chúng tôi viết JavaScript bên ngoài của khách hàng. Trên dòng lệnh, bạn có thể thực hiện một kịch bản vớinode file.js
- Tạo một dự án bằng cách chạy:
node new project-name. - Trong thư mục dự án, chạy:
npm initvà làm theo hướng dẫn.
Đó là thời gian để bao gồm một số mô-đun nút:
2) node-gyp . Hãy chắc chắn để đọc các node-gyp tài liệu. Trong đó là các hướng dẫn cài đặt chi tiết cho các hệ điều hành Unix, Mac OS X và Windows. Bạn cần phải Python v. 2.7 cài đặt để tránh lỗi với node-gyp.
chạy: npm install node-gyp
3) node-ffi . Thư viện này, dù thiếu sót, cung cấp một chuỗi công cụ mạnh mẽ sẽ ràng buộc mã Rust của chúng tôi vào mã JavaScript của chúng tôi. Trong khi cài đặt NPM, nó sẽ chạy node-gyp rebuild vì vậy hãy đảm bảo bạn đã thiết lập được thiết lập node-gyp.
chạy: npm install node-ffi.
4) ref. Mô đun ref sẽ cho phép chúng ta đọc các kiểu C.
Bây giờ chúng ta sẽ rời khỏi dự án Node để thiết lập Rust.
Thiết lập Rust
Cài đặt Rust tại www.rustup.rs. Bạn nên thông qua quá trình cài đặt. Không có GUIs gây phiền nhiễu để giải quyết. Tất cả bạn phải làm là chờ cho các gói tải trong dòng lệnh, giống như bất kỳ cài đặt gói cũ.
Tiếp theo, chúng ta sẽ tạo ra một thư viện mà chúng tôi sẽ làm cho cộng đồng, vì vậy hãy khởi lib Rust của chúng tôi bằng cách viết: $ cargo new --lib project_name.
Chèn tên dự án của bạn. Vì lợi ích của hướng dẫn này, tên của dự án này sẽ được gọi factorial.
Sau đó, đi vào Cargo.tomltệp của bạn và thêm:
name = tên tập tin
crate-type = ["dylib"]
Cài đặt này sẽ ghi đè lên rlib mặc định và thay thế nó bằng một thư viện động mà thư viện nodeffi của chúng tôi có thể truy cập.
Bước 2 - Khởi tạo, Tạo và Phát hành Thư viện Rust
Bây giờ chúng ta đã thiết lập cả hai dự án Rust and Node của chúng ta, chúng ta hãy ở trong môi trường Rust của chúng ta và tuyên bố factorializechức năng lặp của chúng ta lib.rs. Đây là vì sự đơn giản. Thông thường, nếu chúng ta tạo ra một thư viện rộng lớn, chúng ta sẽ gói gọn chức năng này trong mô-đun ( mod). Chúng tôi cũng tạo ra một cấu trúc tệp phản ánh tên của mô-đun của chúng tôi. Để biết thêm thông tin về cấu trúc tệp thư viện, hãy đọc các thùng và các phân mục chương trong sách Cargo trực tuyến miễn phí . Sau đó đọc, mod và hệ thống tập tin .
pub extern fn factorialize(mut num: i64) -> i64 {
if num == 0 || num == 1 {
return 1;
}
let mut cnt = num - 1;
loop {
if cnt < 1 {
break;
}
num = num * cnt;
cnt = cnt -1;
}
return num;
}
Đây là một số điểm cần lưu ý về mã này:
#[no_mangle]ngăn chặn trình biên dịch của Rust thay đổi tên của chức năng của chúng ta.publàm cho chức năng của chúng tôi hiển thị cho các chương trình khác. Theo mặc định, tất cả các chức năng là tư nhân trong Rust.externcho phép một hàm inteface hàm ngoại (ffi) cho phép truy cập tới các thư viện C.fnchỉ đơn giản là một khai báo chức năng.mutcho phép chúng ta thay đổi giá trị củanumbiến của chúng ta . Theo mặc định tất cả các biến Rust là không thay đổi.- Kể từ khi Rust được gõ mạnh, chúng ta phải xác định kiểu chúng ta mong đợi đầu vào của chúng ta. Trong trường hợp này,
i64đề cập đến một số nguyên 64-bit. - Kiểu theo mũi tên
-> i64là kiểu mà chúng ta mong đợi sẽ trở lại.
Sau khi chèn mã, chạy $ cargo build --release. Những gì chúng tôi quan tâm là tệp .dll nằm trongtarget/release/project_name.dll
Lưu ý : Tên tệp của bạn có thể có .sohoặc .dylib. Cả hai đều là các biến thể chấp nhận được.
Bước 3 - Gắn kết Rust vào môi trường Node của bạn
Chúng tôi đã sẵn sàng để ràng buộc Rust với môi trường Nút của chúng tôi, vì vậy, hãy chuyển qua giao diện điều khiển Nút của chúng tôi. Trong tệp index.js của chúng tôi, chúng tôi sẽ yêu cầu các mô-đun này:
const ref = require ('ref');
const ffi = require ('ffi');
const path = require ('path');
factorialize: [int64, [int64]],
});
Tốt nhất là phải có Rust code ở bàn tay để tránh lỗi. Nếu bạn so sánh hai đoạn mã, lời giải thích sẽ rõ ràng hơn.
factorialize(num: i64) -> i64
Dưới đây là một vài điểm đến từ mã JavaScript:
ref.types.int64: chúng ta khởi tạo một biến mà phải mất một kiểu C sẽ được đọc bởi mô đun ffi.ffi.Library()mất hai đối số: Một đường dẫn đến thư viện động và một đối tượng có chứa tên của hàm Rust của chúng ta làm khóa đầu tiên. Giá trị của khóa đó là một mảng. Tạiindex 0, chúng ta có kiểu giá trị trả về của hàm . Tạiindex 1, chúng ta có một mảng có chứa loại (s) của tham số (s) .
Lưu ý: Đảm bảo đường dẫn của bạn đến thư viện động mà bạn đã viết là chính xác. Trong trường hợp này, bởi vì chúng tôi tạo ra hai dự án hoàn toàn tách biệt, việc sử dụng __dirnamesẽ không khả thi. Mặc dù, hoặc bạn có thể di chuyển tệp .dll vào thư mục dự án Node để khắc phục lỗi kết quả.
Khi chúng tôi chạy $ node index.js, chúng tôi sẽ nhận được 120, sau khi chúng tôi console.log tất nhiên.
Phần kết luận
Chúng tôi đã tích hợp thành công Rust vào JavaScript. Tuy nhiên, có một số điều cần xem xét trước khi bạn bắt đầu thay thế tất cả mã JavaScript của mình bằng Rust. Đối với bất kỳ kỹ thuật tối ưu hóa khác, bạn chỉ nên tích hợp Rust cho code nặng tính toán. Nếu bạn thấy rằng bạn cần phải đào sâu vào phần cứng để ép hiệu quả hoạt động khác, Rust là một lựa chọn tốt vì sự an toàn mà nó cung cấp khi sử dụng bộ nhớ.
Cuối cùng, ffi rất tốn kém khi thực hiện phép tính số học trong bất kỳ chức năng nào của bạn, và các cấu trúc dữ liệu phức tạp hơn nữa hiệu suất giảm chấn. Thương mại giảm để dễ sử dụng là một hiệu suất trên không. Ngoài ra, bạn có thể sử dụng Neon hoặc một cây cầu C ++. Cả hai tùy chọn đều phức tạp hơn để sử dụng, nhưng đáng giá trong thời gian của bạn nếu bạn muốn khai thác tối đa các ràng buộc Rust.
Bài viết được dịch từ trang codeburst
















.png&w=640&q=75)






.png&w=640&q=75)



























