Rust 的應用範圍廣泛,涵蓋伺服器端渲染網站、網頁爬蟲、移動應用程式開發、雲端運算和區塊鏈等領域。在網頁開發方面,Rust 可用於構建伺服器端渲染網站,提供更好的 SEO 和效能。同時,Rust 也能用於開發高效能的網頁爬蟲,有效提取網頁資訊。對於移動應用開發,Rust 可以編譯成動態連結函式庫,並透過 FFI 與 Android 和 iOS 的原生程式碼互動,實作跨平台開發。在雲端運算領域,AWS 的 Bottlerocket 和 Nitro Enclaves 等服務也使用了 Rust,提升了系統的安全性和效能。此外,Rust 也被應用於區塊鏈開發,例如 Solana 和 Polkadot 等知名區塊鏈,以及智慧合約的編寫。Rust 的高效能和安全性使其成為這些領域的理想選擇。
第10章:Rust的其他應用
10.1 結束只是新的開始
我們一起在Rust的世界中進行了一場令人興奮的旅程。我們學習瞭如何構建CLI、GUI、Web應用前端、REST API、使用AWS的無伺服器網站、遊戲、用於控制硬體的程式以及機器學習模型。下一步你可以採取什麼行動?你還可以使用Rust構建哪些其他令人興奮的應用?我們將簡要介紹一些本文未涵蓋的其他領域。
10.2 伺服器端渲染網站
在前面的章節中,您學習瞭如何在Rust中構建單頁應用(SPA)前端和REST API。這種組合,有時被稱為客戶端渲染,是目前現代網頁開發中最流行的架構。然而,有一種較舊的動態網站構建架構稱為伺服器端渲染,仍然可行且在某些地方重新受到歡迎。在伺服器端渲染的網站中,後端負責構建HTML並將其發送回前端。有幾個原因使得伺服器端渲染仍然具有相關性:
- 簡單性:對於簡單的網站,使用者介面(HTML和CSS)與業務邏輯寫在同一個地方。前端也不需要向後端發出複雜的API呼叫來接收資料。
使用Plantuml圖表展示客戶端渲染與伺服器端渲染的比較
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333
title 使用Plantuml圖表展示客戶端渲染與伺服器端渲染的比較
rectangle "請求資料" as node1
rectangle "接收資料" as node2
rectangle "請求頁面" as node3
rectangle "生成HTML" as node4
rectangle "接收HTML" as node5
node1 --> node2
node2 --> node3
node3 --> node4
node4 --> node5
@enduml此圖示比較了客戶端渲染與伺服器端渲染的不同之處。
Rust具有極大的潛力,可以用於構建高效能和安全的網路應用,而伺服器端渲染是其中的一個重要方向。透過使用Rust,我們可以更好地控制後端服務,從而提供更安全、更高效的網頁服務。
使用 Rust 進行網頁開發與其他應用
網頁伺服器端渲染的優勢
伺服器端渲染(Server-Side Rendering, SSR)是一種將網頁內容在伺服器端生成後再傳送到客戶端瀏覽器顯示的技術。相較於客戶端渲染(Client-Side Rendering, CSR),SSR 具有以下優勢:
效能優勢
由於瀏覽器直接從後端接收 HTML,因此無需等待 JavaScript 載入並渲染畫面,可能帶來效能上的提升。雖然一些使用同構渲染(isomorphic rendering)的框架也能加速客戶端渲染頁面的效能,但這增加了複雜度,而保持程式碼函式庫的簡單性通常更為重要。目前,還沒有足夠成熟的 Rust 函式庫能夠支援此功能。
搜尋引擎最佳化(SEO)
搜尋引擎使用稱為爬蟲的程式來掃描網頁並建立搜尋索引。某些爬蟲可能無法執行 JavaScript,因此伺服器端渲染的網站對瀏覽器引擎爬蟲更為友好。如今,主要的搜尋引擎都具備處理客戶端渲染網站的能力,但在設計新網站時仍需考慮 SEO。
網頁瀏覽器與爬蟲
在討論網頁的前端和後端時,人們常常忽略了中間的環節:網頁瀏覽器。現代瀏覽器大多由三種瀏覽器引擎驅動:
- Blink:驅動 Chromium、Google Chrome、Microsoft Edge、Opera
- Gecko:驅動 Firefox
- WebKit:驅動 Safari
Rust 的歷史與瀏覽器引擎密切相關。Servo 是由 Mozilla 發起的一個用 Rust 編寫的瀏覽器引擎原型專案。Servo 於 2012 年啟動,目前已有大約 260 萬行程式碼。2017 年,Servo 的 CSS 引擎成熟後被合併到 Gecko 中,隨後其渲染元件 WebRender 也被整合到 Firefox 中。因此,如果你正在使用 Firefox,那麼你也在執行大量的 Rust 程式碼。
網頁爬蟲
除了人類使用的瀏覽器外,還有許多程式會消費網頁內容,這些程式通常被稱為網頁爬蟲、抓取工具或蜘蛛。它們會「爬行」網頁並提取資訊。例如,當你想比較不同電子商務網站上列出的價格,但這些網站不提供 API 時,可以利用爬蟲來抓取網頁並從 HTML 中提取價格資訊。
Rust 中有一些用於建立網頁爬蟲的框架,例如 spider 和 website-crawler。如果需要對爬取和解析過程進行更細粒度的控制,可以使用 reqwest HTTP 使用者端函式庫下載 HTML 頁面,並使用 HTML 解析/查詢函式庫解析頁面和提取資料。一些流行的 HTML 解析/查詢函式庫包括 html5ever、scraper 和 select。
移動裝置應用開發
在第三章中,我們討論瞭如何為桌面環境建立圖形使用者介面(GUI)。但我們尚未討論如何為移動裝置(即應用程式)建立 GUI。主要的移動平台是 Google 的 Android 和 Apple 的 iOS。Android 應用程式使用 Java 或 Kotlin 編寫,而 iOS 應用程式則使用 Objective-C 或 Swift 編寫。
Android 官方支援 Rust 作為其平台語言,用於直接在 Android OS 上工作。然而,在開發導向使用者的應用程式時,Rust 無法直接替代這些原生支援的語言。但是,Android 和 iOS 都具有呼叫(和被呼叫)C 或 C++ 函式庫的機制。這對於需要在 Java/Kotlin/Objective-C/Swift 中建立使用者介面,並將計算密集型部分解除安裝到 C/C++ 函式庫中的效能關鍵應用至關重要。由於我們可以將 Rust 編譯成看起來和感覺像 C 函式庫的函式庫,因此也可以使用此機制建立具有用 Rust 編寫的業務邏輯的應用程式。
在 Android 上使用 Rust 的步驟:
- 安裝包含 Android SDK 的 Android Studio,這是 Android 應用的官方開發環境。
- 安裝 Android NDK(原生開發套件),該工具包允許我們將 Rust 編譯成可在 Android 上執行的函式庫,並與 Java/Kotlin 互動。
Mozilla 發表了一篇,引導你一步步完成這個過程。透過這種方式,開發者可以在保持應用效能的同時,利用 Rust 的安全性與效能優勢。
Rust 在行動裝置上的應用
Rust 不僅可以用於開發高效能的系統程式,也可以應用於行動裝置的開發。對於 Android 和 iOS 平台,Rust 可以透過編譯成動態連結函式庫,並使用外國函式介面(FFI)與原生程式碼互動。
Android 平台
在 Android 平台上使用 Rust 的步驟如下:
安裝 cargo-ndk:使用 cargo-ndk 可以簡化編譯流程。首先,需要安裝 cargo-ndk 工具。
- 使用命令:
cargo install cargo-ndk
- 使用命令:
安裝 Android 目標平台:使用 rustup 安裝 Android 目標平台,例如 armv7-linux-androideabi。
- 使用命令:
rustup target add armv7-linux-androideabi
- 使用命令:
編譯 Rust 程式函式庫:將 Rust 程式函式庫專案編譯成動態連結函式庫(.so 檔案)。需要使用 JNI(Java Native Interface)將 Rust 程式碼暴露給 Java/Kotlin。
- jni crate 可以幫助完成這項工作。
- 使用命令:
cargo ndk --target armv7-linux-androideabi -- build --release
匯入 Rust 程式函式庫到 Android 專案:將編譯好的動態連結函式庫匯入到 Java/Kotlin 的 Android 專案中,並在 Java/Kotlin 程式碼中呼叫該程式函式庫。
程式碼範例:使用 jni crate
use jni::JNIEnv;
use jni::objects::{JClass, JString};
use jni::sys::jsize;
#[no_mangle]
pub extern "system" fn Java_com_example_myapp_MainActivity_greet(env: JNIEnv, _class: JClass, name: JString) -> jsize {
let name = env.get_string(name).unwrap().to_str().unwrap();
let output = env.new_string(format!("Hello, {}!", name)).unwrap();
output.into_inner() as jsize
}
內容解密:
- 使用
jnicrate 提供的JNIEnv和JClass等型別來與 JNI 環境互動。 Java_com_example_myapp_MainActivity_greet函式是 JNI 的入口點,其名稱遵循特定的命名規則,以便 Java 程式碼能夠正確呼叫。- 該函式接收一個
JNIEnv例項、一個JClass例項和一個JString引數。 - 將
JString轉換為 Rust 的&str型別,並建立一個新的問候訊息字串。 - 將新的字串轉換為
JString,並傳回其內部指標作為jsize型別。
iOS 平台
在 iOS 平台上使用 Rust 的步驟與 Android 類別似,但需要安裝 Xcode,並使用不同的目標平台。
安裝 Xcode:Xcode 是 iOS 應用程式的官方開發環境。
安裝 iOS 目標平台:使用 rustup 安裝 iOS 目標平台,例如 armv7-apple-ios。
- 使用命令:
rustup target add armv7-apple-ios
- 使用命令:
編譯 Rust 程式函式庫:將 Rust 程式函式庫專案編譯成靜態或動態連結函式庫,並提供 C 風格的頭檔,以便 iOS 能夠像呼叫 C 程式函式庫一樣呼叫 Rust 程式函式庫。
匯入 Rust 程式函式庫到 Xcode 專案:將編譯好的程式函式庫匯入到 Xcode 專案中,並在 Objective-C/Swift 程式碼中呼叫該程式函式庫。
純 Rust 行動應用程式
如果想要開發純 Rust 的行動應用程式,可以考慮使用 Tauri。Tauri 提供了一個執行 JavaScript 和 WASM-based UI 的引擎,不僅適用於桌面,也適用於行動裝置。
其他選擇
除了 Tauri 之外,還可以使用遊戲引擎如 macroquad,直接在 Rust 中撰寫應用程式並建構至 Android 和 iOS 平台。不過,這種方式需要自行處理 UI 的渲染。
Rust 在雲端運算與區塊鏈的應用
Rust 語言在近年來逐漸嶄露頭角,特別是在雲端運算和區塊鏈領域。AWS(Amazon Web Services)開發了 Bottlerocket,一個根據 Linux 的作業系統,專門用於執行容器。Bottlerocket 只包含執行容器所需的必要軟體,因此減少了攻擊面並提高了安全性。此外,Bottlerocket 也是用 Rust 語言編寫的。
AWS Nitro Enclaves 與 Rust
AWS Nitro Enclaves 是另一個使用 Rust 的服務。Nitro Enclaves 允許在 Amazon Elastic Compute Cloud(Amazon EC2)例項中建立隔離的計算環境。透過在 Nitro Enclave 中執行最敏感的資料處理應用程式,例如涉及個人可識別資訊(PII)、財務和醫療保健詳細資訊的應用程式,可以提高應用程式的安全性。
區塊鏈與加密貨幣
Rust 在區塊鏈和加密貨幣領域也引起了廣泛關注。有兩個層面的使用 Rust 在區塊鏈中的應用:一是使用 Rust 構建區塊鏈本身,二是使用 Rust 編寫區塊鏈上的智慧合約。有幾個知名區塊鏈是使用 Rust 構建的,例如 Solana、Polkadot 和 Hyperledger Sawtooth。這些區塊鏈也允許使用 Rust 編寫智慧合約。
使用 Rust 編寫智慧合約
智慧合約在區塊鏈的虛擬機器中執行,大多數情況下需要進行某種形式的跨編譯成 WebAssembly 或自定義的位元組碼格式。例如,NEAR Protocol 允許使用 ink!,一種嵌入式領域特定語言(DSL),來編寫 Rust 智慧合約。Solana 也允許使用 Rust 編寫其智慧合約(稱為 Programs)。
Rust 的無限可能性
除了前幾章和幾節中討論的主題之外,Rust 還有許多其他應用。以下是一些非詳盡的例子:
- 壓縮
- 密碼學和安全性:ring、openssl、sodiumoxide
- 資料函式庫實作
- 模擬器:遊戲機和其他硬體
- 多媒體:影像、音訊和影片處理;渲染 2D/3D 內容
- 語言解析器
- 科學應用:數學、生物資訊學(例如 Rust-Bio)、地理資訊、物理和化學模擬
Rust 是一種用於構建幾乎任何型別應用的絕佳工具。儘管目前某些領域可能還沒有成熟的、生產就緒的 Rust 函式庫或使用者群,但憑藉熱情友好的社群的支援,我們可以期待看到越來越多的 Rust 應用。從執行在低功耗微控制器的迷你 IoT 感測器,到在大型超級電腦上執行的尖端 AI,Rust 的未來是廣闊而光明的。你是否已經找到想要使用 Rust 構建的專案?讓我們一起努力,讓 Rust 成長並釋放其全部潛力!
重點整理
本章節重點介紹了 Rust 在雲端運算和區塊鏈領域的應用。首先,我們討論了 AWS 開發的 Bottlerocket,一個專門用於執行容器的 Linux-based 作業系統,以及 AWS Nitro Enclaves,一個使用 Rust 的服務,用於建立隔離的計算環境。接著,我們探討了 Rust 在區塊鏈和加密貨幣領域的應用,包括使用 Rust 構建區塊鏈和編寫智慧合約。最後,我們列舉了一些 Rust 的其他應用領域,並強調了 Rust 的無限可能性。
命令列介面(CLI)與圖形使用者介面(GUI)開發
命令列介面(CLI)開發
命令列介面(CLI)是與電腦系統互動的重要方式之一。Rust 語言因其高效能和安全性,成為開發 CLI 工具的理想選擇。
使用 Rust 開發 CLI 工具的優勢
- 高效能:Rust 編譯後的執行檔具有極高的執行效率,能夠快速完成 CLI 工具的功能。
- 安全性:Rust 的所有權系統和借用檢查器能夠有效避免常見的記憶體安全問題,確保 CLI 工具的穩定性。
- 豐富的生態系統:Rust 的生態系統中,有許多優秀的函式庫可供使用,如 Clap 用於解析命令列引數,serde 用於資料序列化等。
實作範例:使用 Clap 解析命令列引數
use clap::Parser;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
#[arg(short, long)]
name: String,
#[arg(short, long)]
age: u8,
}
fn main() {
let args = Args::parse();
println!("Name: {}, Age: {}", args.name, args.age);
}
CLI 工具的測試與發布
- 單元測試與整合測試:使用 Rust 內建的測試框架,編寫單元測試和整合測試,確保 CLI 工具的功能正確性。
- 發布到 crates.io:將開發完成的 CLI 工具發布到 crates.io,供其他開發者使用。
圖形使用者介面(GUI)開發
圖形使用者介面(GUI)是使用者與應用程式互動的視覺化介面。Rust 語言透過多個函式庫支援 GUI 開發,如 gtk-rs、egui 等。
使用 gtk-rs 開發 GUI 應用程式
- GTK+ 框架簡介:GTK+ 是一個跨平台的 GUI 框架,gtk-rs 是其 Rust 語言的繫結。
- 建立視窗與控制元件:使用 gtk-rs 建立視窗,並新增標籤、按鈕等控制元件。
use gtk::prelude::*;
fn main() {
gtk::prelude::init();
let window = gtk::Window::builder()
.title("My GTK+ App")
.default_width(350)
.default_height(70)
.build();
let label = gtk::Label::builder()
.label("Hello, World!")
.build();
window.add(&label);
window.show_all();
gtk::main();
}
跨平台 GUI 開發的挑戰與解決方案
- 跨平台相容性:不同作業系統對 GUI 的支援存在差異,需要使用跨平台的 GUI 框架來解決相容性問題。
- 效能最佳化:GUI 應用程式需要處理大量的圖形渲染任務,需要進行效能最佳化以確保流暢的使用者經驗。