Rust


  1. rust package crates modules的使用
  2. Blinc的技术架构与渲染流程
  3. rust 为什么需要gcc
  4. Rust 需要gcc链接 glibc 或 musl 来进行内存分配、线程管理、文件 I/O 等
  5. rust 直接调用X11
  6. 以skia为例,kuva是如何将图形绘制出来的
  7. Rust 的多个 binary crate(可执行程序)默认放在 src/bin/,但不是必须只能在那里
  8. rust 实现命令行 对 tsv/csv 列名的rename ,选择列 如何设计
  9. rust enum 与 match 配合使用的例子

https://forge.rust-lang.org/infra/other-installation-methods.html

 ./install.sh --prefix=/ssd1/wy/software/rust-1.93
rustc --version
cargo --version
cargo new hello_cargo
cargo build
cargo run
cargo check

cargo run --bin server
cargo run --bin client
cargo run --bin gui

简单来说:mod 是告诉编译器“去哪里找代码”,而 use 是告诉编译器“怎么方便地称呼代码”。

以下是详细的对比和原因:


1. mod network;:声明模块(定义代码结构)

当你写 mod network; 时,你是在组织你自己的代码

  • 它的作用:告诉 Rust 编译器:“在当前目录下有一个叫 network.rs 的文件(或者 network/mod.rs),请把它的代码编译并包含到当前的模块树中。”
  • 本质:它是文件系统到模块树的映射。没有它,Rust 根本不知道 network.rs 的存在,哪怕它就躺在同一个文件夹里。
  • 类比:就像你在 C++ 里写 #include "network.h"(虽然 Rust 的模块系统更高级,不是简单的文本替换),或者在 Java 里声明包结构。
// main.rs
mod network; // 1. 把 network.rs 拉进编译范围

fn main() {
    // 2. 因为拉进来了,所以可以通过路径访问
    network::tcp::connect(); 
}

2. use ...:引入命名空间(语法糖)

当你写 use serde::Deserialize; 时,你是在简化路径

  • 它的作用:把某个路径绑定到当前作用域,这样你就不用每次都写全名。
  • 本质:它是别名/快捷方式。它不会编译新代码,也不会把文件拉进来(第三方库的编译由 Cargo.tomlextern crate 机制处理)。
  • 类比:就像 C++ 的 using namespace std; 或 Java 的 import java.util.List;
// 假设 network 是第三方库,或者你已经在上面 mod network; 了

// 没有 use:必须写全路径
network::tcp::connect();

// 有 use:简化路径
use network::tcp;
fn main() {
    tcp::connect(); // 爽!
}

3. 为什么第三方库不用 mod

这是最核心的区别:

  1. 编译入口不同

    • 你的代码:Rust 从 main.rslib.rs 开始,必须通过 mod 声明来发现你的其他文件。Rust 不会自动扫描当前目录下的所有 .rs 文件。
    • 第三方库:Cargo 在编译前已经读取了 Cargo.toml,下载了源码,并告诉了编译器:“嘿,这里有个叫 serde 的 crate,它的根在 src/lib.rs”。编译器已经知道它在哪了,不需要你再 mod 一次。
  2. 命名空间隔离

    • 如果你写 mod serde;,Rust 会以为你在当前目录找 serde.rs,然后报错 file not found
    • 第三方库自动位于根命名空间(Crate Root),所以你直接 use serde::... 即可。
命令说明
rustup update更新所有已安装的工具链
rustup update stable更新 stable 版本
rustup default stable设置默认工具链
rustup install nightly安装 nightly 版本
rustup override set nightly为当前目录设置特定工具链
rustup show查看已安装工具链和当前默认版本
rustup component add clippy rustfmt安装常用组件(静态检查、格式化)
rustup target add x86_64-unknown-linux-gnu添加编译目标(交叉编译)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain none
rustup install stable    # 安装 stable
rustup install nightly   # 安装 nightly
应用层 UI 框架
        ↓
Skia / Impeller / wgpu(抽象层)
        ↓
Vulkan / Metal / DX12 / OpenGL(图形 API)
        ↓
显卡驱动
        ↓
GPU 硬件
               ┌───────────────┐
               │    UI 框架     │
               └───────┬───────┘
                       │
       ┌───────────────┼───────────────┐
       │                               │
  Skia (2D引擎)                    wgpu
       │                               │
       └───────────────┬───────────────┘
                       │
                    Vulkan
                       │
                     驱动
                       │
                      GPU

原生控件绑定(Native Widgets)

这些框架通过绑定系统原生控件,实现 UI 样式原生:

框架特点平台适合场景
Relm / Relm4GTK3/GTK4 绑定,Reactive 风格Linux / Windows / macOSLinux 桌面应用,GTK 生态
AzulImmediate Mode + WebRender(GPU渲染)Windows / Linux / macOS现代桌面应用,可 GPU 加速

自绘 / GPU 渲染

这些框架自己管理渲染管线,适合高性能和自定义 UI:

框架渲染方式特点适合场景
DruidRust 原生,跨平台 GUI 框架,使用 Piet 做绘图Windows / Linux / macOS桌面工具,原生风格 UI
eguiwgpu / glow / OpenGLImmediate Mode,Rust 原生,轻量级工具类 UI、游戏调试界面
icedwgpu / GPUFlutter 风格声明式 UI跨平台桌面应用,简单动画
Blincwgpu + 自研 GPU 渲染管线高性能 UI,可做动画/可视化工具高性能可视化、游戏 UI、WebAssembly