如何理解 Rust 没有运行时(No Runtime)

文章目录

  • 0.前言
  • [1. 运行时(Runtime)通常指什么?](#1. 运行时(Runtime)通常指什么?)
  • [2. Rust 的"无运行时"到底指什么?](#2. Rust 的“无运行时”到底指什么?)
  • [3. 一个简单的对比](#3. 一个简单的对比)
  • [4. Rust 真的"零运行时"吗?](#4. Rust 真的“零运行时”吗?)
  • 5.总结
  • 参考文献

0.前言

Rust 核心卖点之一高性能的描述如下:

Rust is blazingly fast and memory-efficient: with no runtime or garbage collector, it can power performance-critical services, run on embedded devices, and easily integrate with other languages.

Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。

Rust 没有运行时,这个确实容易让人困惑:一个程序没有"运行时",怎么跑起来的?

我们需要区分"运行时"在不同语境下的含义。

1. 运行时(Runtime)通常指什么?

在很多高级语言中,"运行时"是一个较大的、在程序启动前就必须准备好的环境。它通常包含:

  • 垃圾回收器:一个后台线程,自动管理内存。
  • Just-In-Time (JIT) 编译器:运行时将字节码编译为机器码。
  • 反射机制:在运行时检查和调用类型信息。
  • 线程调度器(对协程而言,如 Go 的 Goroutine 调度器)。
  • 标准库的"胶水"代码:连接程序与操作系统的部分。

例如:

  • Java : 启动一个 Java 程序,会先启动 Java 虚拟机(JVM) 。JVM 就是一个巨大的运行时,负责加载字节码、垃圾回收、即时编译等。你的 .class 代码是跑在 JVM 这个"虚拟操作系统"里的。
  • Go : Go 程序虽然编译成二进制,但它内部包含了一个轻量级的运行时 ,主要负责Goroutine 调度垃圾回收。即使你写一个空程序,编译出的二进制文件里也带着这个运行时。

2. Rust 的"无运行时"到底指什么?

Rust 说它"没有运行时",是指它没有上述那种重量级的、必须预先加载的、侵入式的运行时环境

具体来说,Rust 没有:

  • 垃圾回收器 (GC)
  • JIT 编译器
  • 复杂的线程调度模型(Rust 直接使用操作系统的原生线程 1:1 模型)
  • 反射机制

那么 Rust 程序怎么运行?

Rust 采用的是 "零开销抽象""一切尽在编译时" 的理念。

  1. 编译为原生机器码 :Rust 代码直接被 LLVM 编译器编译成当前 CPU 可以直接执行的机器码 。编译完成后,它就是一个普通的 .exe (Windows) 或 ELF (Linux) 文件。运行它和运行一个 C 程序没有任何区别------直接交给 CPU 执行

  2. 内存管理是代码的一部分 :Rust 独特的所有权系统和借用检查器,在编译时将内存管理的逻辑直接生成到最终的机器码里。drop 函数(类似析构函数)会在变量离开作用域时被静态插入 到代码中。内存的释放时机在编译期就确定了,而不是在运行时由 GC 线程说了算。

  3. "运行时"就是操作系统 :Rust 程序执行 println! 宏时,最终会调用操作系统的系统调用(比如 Linux 的 write)。可以说,Rust 把运行时的控制权完全交给了操作系统和 CPU

3. 一个简单的对比

假设有一个变量 x 离开了作用域:

  • Java: 对象变成"垃圾",等待 GC 线程在某个不确定的时间点扫描到并回收。这期间有额外内存开销。
  • Go : 编译器在函数末尾(或合适位置)插入 runtime.defer 调用,复杂的 GC 逻辑在运行时执行。
  • Rust : 编译器在 x 离开作用域的地方,直接生成了调用 free (或类似) 的汇编指令。没有函数调用开销,没有额外的线程扫描。

4. Rust 真的"零运行时"吗?

严格来说,Rust 还是有"运行时"的,只是这个概念非常

Rust 的 std 标准库在程序启动时需要做一些基本的初始化工作,比如:

  • 设置栈溢出保护
  • 处理命令行参数 std::env::args
  • 初始化 println! 等宏所需的输出流
  • 在 panic 时进行栈回溯

但这些工作代价极小,且是一次性的。对于 no_std 环境(如嵌入式系统、操作系统内核开发),你甚至可以连这层薄薄的运行时也去掉,Rust 程序可以直接从 #[no_mangle] pub extern "C" fn main() -> ! 开始执行,没有任何预置代码。

5.总结

  • 其他语言的"运行时":像一个虚拟的操作系统,程序运行在一个由虚拟机或运行时库提供的隔离环境中。
  • Rust 的"无运行时":程序就是普通的机器码,直接运行在物理 CPU 和操作系统之上。它没有垃圾回收、JIT 或复杂的协程调度器。

"没有运行时"的直接好处就是:

  • 启动极快:不需要启动 JVM 或初始化 GC。
  • 性能可预测:没有 GC 的"世界暂停"。
  • 内存占用低:没有运行时本身占用的内存。
  • 适合嵌入式:能运行在极其严苛的资源限制下。

一句话总结:Rust 把原本需要在程序运行时做的工作,尽可能地挪到了编译期完成。 编译后的产物就是一个"裸奔"的、性能极高的可执行文件。


参考文献

Rust Programming Language

相关推荐
Yeauty4 小时前
用 Whisper 转录前,你不用再离开 Rust
开发语言·rust·ffmpeg·音视频·视频
程序员爱钓鱼4 小时前
Rust HashMap 详解:键值存储、查询、更新与统计
后端·面试·rust
doiito17 小时前
【AI 应用】从“外国人味”到地道中文:kokoroi-rs v0.1.2 架构升级深度解析
ai·rust·系统设计
Zwarwolf1 天前
Rust零散知识点项目汇总
开发语言·rust
X档案库1 天前
【开源】我做了一套可以 AI 托管的 Markdown 博客与知识库
rust·博客·markdown·marksharex
程序员爱钓鱼1 天前
Rust Vec 动态数组详解:创建、增删、遍历与排序
前端·后端·rust
_abab1 天前
Rust重塑系统编程:从Linux内核到AI推理引擎的2026全景解析
linux·人工智能·rust
doiito2 天前
【Agent Harness】Gliding Horse 高级认知优化:让 Agent 的“大脑”和“免疫系统”真正协同
ai·rust·架构设计·系统设计·ai agent
longxiangam2 天前
第 4 篇:Embassy 异步运行时与事件驱动架构
单片机·嵌入式硬件·rust
程序员爱钓鱼2 天前
Rust String 与 &str 详解:字符串所有权、借用与转换
前端·后端·rust