今天,我們來看 Rust 如何被用於重寫和優化現有系統,特別是那些原本用其他語言實現的系統。我們會聊聊這些系統原本的實現語言、它們的不足之處,以及 Rust 如何解決這些問題。
原有實現:許多資料庫系統,如 MySQL 和 PostgreSQL,主要使用 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(())
}
原有實現:大多數操作系統的網路協議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());
}
}
原有實現:大多數主流作業系統核心(如 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
}
原有實現:大多數遊戲引擎使用 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();
}
}
原有實現:許多高效能 Web 伺服器(如 Nginx)主要用 C 實現。
不足之處:
Rust 的解決方案:
例子: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的各種領域的職缺會越來越多,是個現在可以投資的程式語言。