iT邦幫忙

2024 iThome 鐵人賽

DAY 28
1
Software Development

Rust 學得動嗎系列 第 28

[Day 28] Rust Rust 在系統重構與優化中的應用

  • 分享至 

  • xImage
  •  

今天,我們來看 Rust 如何被用於重寫和優化現有系統,特別是那些原本用其他語言實現的系統。我們會聊聊這些系統原本的實現語言、它們的不足之處,以及 Rust 如何解決這些問題。

1. 資料庫系統

原有實現:許多資料庫系統,如 MySQL 和 PostgreSQL,主要使用 C 語言實現。

不足之處

  • 記憶體安全問題
  • 並發處理的複雜性
  • 難以維護和擴展的大型 C 程式庫

Rust 的解決方案

  • 記憶體安全保證
  • 強大的並發模型
  • 模組化和可維護的程式碼結構

例子TiKV,一個用 Rust 實現的分布式 KV 資料庫

use tikv_client::RawClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = RawClient::new(vec!["127.0.0.1:2379"]).await?;
    
    client.put("key".to_owned(), "value".to_owned()).await?;
    let value = client.get("key".to_owned()).await?;
    
    println!("Value: {:?}", value);
    
    Ok(())
}

2. 網路協議stack

原有實現:大多數操作系統的網路協議stack用 C 實現。

不足之處

  • 安全漏洞頻繁出現
  • 效能優化受限
  • 難以實現新協議

Rust 的解決方案

  • 類型安全和記憶體安全
  • 零成本抽象,允許高效能實現
  • 豐富的泛型和特徵系統,方便實現新協議

例子Smoltcp,一個純 Rust 實現的 TCP/IP stack

use smoltcp::phy::TapInterface;
use smoltcp::iface::{NeighborCache, InterfaceBuilder};
use smoltcp::wire::{EthernetAddress, IpCidr, Ipv4Address};

fn main() {
    let tap = TapInterface::new("tap0").expect("開啟 tap 裝置失敗");
    let neighbor_cache = NeighborCache::new(BTreeMap::new());
    
    let mut interface = InterfaceBuilder::new(tap)
        .ethernet_addr(EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x01]))
        .ip_addrs([IpCidr::new(Ipv4Address::new(192, 168, 69, 1), 24)])
        .neighbor_cache(neighbor_cache)
        .build();
    
    loop {
        interface.poll(Instant::now());
    }
}

3. 作業系統核心

原有實現:大多數主流作業系統核心(如 Linux、Windows)主要用 C 實現,部分使用組合語言。

不足之處

  • 系統級錯誤和安全漏洞
  • 難以保證並發安全性
  • 程式碼複雜度高,維護困難

Rust 的解決方案

  • 系統級程式設計能力
  • 內建的並發安全機制
  • 強大的抽象能力,不犧牲效能

例子Redox OS,一個完全用 Rust 編寫的類 Unix 作業系統

#![no_std]
#![no_main]

use redox_syscall::*;

#[no_mangle]
pub extern fn main() -> usize {
    let mut buf = [0; 128];
    let bytes = read(STDIN, &mut buf).unwrap();
    write(STDOUT, &buf[..bytes]).unwrap();
    0
}

4. 遊戲引擎

原有實現:大多數遊戲引擎使用 C++ 實現。

不足之處

  • 複雜的記憶體管理
  • 難以保證執行緒安全
  • 建構時間長

Rust 的解決方案

  • 安全的記憶體管理
  • 靜態保證的執行緒安全
  • 快速的編譯和連結

例子Bevy,一個用 Rust 編寫的資料驅動遊戲引擎

use bevy::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_startup_system(setup)
        .add_system(move_sprite)
        .run();
}

fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
    commands.spawn_bundle(Camera2dBundle::default());
    commands.spawn_bundle(SpriteBundle {
        texture: asset_server.load("sprite.png"),
        ..default()
    });
}

fn move_sprite(time: Res<Time>, mut query: Query<&mut Transform, With<Sprite>>) {
    for mut transform in query.iter_mut() {
        transform.translation.x += 100.0 * time.delta_seconds();
    }
}

5. Web 伺服器

原有實現:許多高效能 Web 伺服器(如 Nginx)主要用 C 實現。

不足之處

  • 安全漏洞風險高
  • 擴展新功能困難
  • 並發模型複雜

Rust 的解決方案

  • 記憶體安全保證
  • 豐富的生態系統,易於擴展
  • 高效能的異步 I/O

例子Actix Web,一個高效能的 Rust Web 框架

use actix_web::{web, App, HttpServer, Responder};

async fn greet(name: web::Path<String>) -> impl Responder {
    format!("Hello, {}!", name)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new().route("/{name}", web::get().to(greet))
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

結論

Rust 在系統重寫和優化方面展現出巨大潛力。它不僅能夠解決許多傳統系統程式設計語言的問題,還能提供更好的安全性、並發性和可維護性。雖然完全重寫大型系統是一項巨大的工程,但 Rust 提供了一個強大的工具集,使得逐步改進和重寫成為可能,我們也可以看到Windows(Microsoft is busy rewriting core Windows code in memory-safe Rust)和Linux(Linux 核心採納 Rust 的狀況)開始擁抱Rust,可以看到未來Rust的各種領域的職缺會越來越多,是個現在可以投資的程式語言。


上一篇
[Day 27] Rust 與 WebAssembly
下一篇
[Day 29] Rust 在雲端原生(Cloud Native)環境中的應用
系列文
Rust 學得動嗎30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言