Runtime(运行时) 这个词在计算机领域有两层含义,需要先区分清楚:
-
Runtime(时间阶段):指程序"正在运行"的那个时间阶段,与 compile-time(编译时)、link-time(链接时)、load-time(加载时)相对。例如"runtime error"指程序运行期间才出现的错误。
-
Runtime(运行时系统 / runtime system):指支撑程序运行所需的软件基础设施——一套在程序执行期间提供环境、服务、资源管理的代码和机制。这是你问的"sandbox runtime / eBPF runtime"中的含义。
更精确地说,一个 runtime 通常负责以下若干职责的组合:
- 执行模型:解释/JIT/AOT 后的代码如何被驱动执行(指令分派、调用约定、栈帧管理)
- 资源管理:内存分配、GC、线程/协程调度、I/O
- 隔离与安全:地址空间、权限、能力(capability)、沙箱边界
- ABI/系统接口:暴露给被托管程序的 syscall/host function/intrinsics
- 生命周期:加载、验证、链接、卸载
可以把 runtime 理解为 "被托管程序与底层硬件/OS 之间的中间层",它定义了"程序在什么世界里运行"。
为某种编程语言的程序提供执行环境,通常包含 GC、调度、标准库胶水等。
- JVM(Java Virtual Machine):执行 Java 字节码,含 GC、JIT(HotSpot/C2)、类加载器
- CLR(Common Language Runtime):.NET 的运行时,支持 C#/F# 等
- Go runtime:goroutine 调度器、GC、channel、netpoller,直接编进二进制
- Node.js / V8:JavaScript 的执行环境(V8 是引擎,Node 在其上加 libuv 提供 I/O)
- Python(CPython)/ Ruby(YARV)/ Erlang BEAM:解释器 + 内置调度/GC
- Rust:常说"Rust 没有运行时",更准确的说是极小运行时——只有 panic、栈展开等少量机制,无 GC 无绿色线程
- OCI Runtime(runc、crun、youki):底层执行容器进程,操纵 namespace/cgroup
- High-level Container Runtime(containerd、CRI-O):管理镜像、生命周期,调用底层 OCI runtime
- Kata Containers、gVisor、Firecracker:沙箱化容器运行时,用 VM 或用户态内核做强隔离
- gVisor 在用户态用 Go 实现了一个"应用内核"拦截 syscall
- Firecracker 是 microVM monitor
核心职责是隔离 + 受控执行:
- WebAssembly Runtime:Wasmtime、Wasmer、WAMR、V8(Wasm 部分)。执行 Wasm 字节码,提供能力式的 host import(WASI)
- eBPF Runtime:Linux 内核中的 verifier + JIT/解释器,运行受限字节码,提供 helper functions 和 maps 作为 ABI
- 浏览器 JS Sandbox:V8/SpiderMonkey/JavaScriptCore,加上同源策略、Site Isolation
- TEE Runtime:SGX SDK(Intel)、OP-TEE(ARM TrustZone)、Keystone(RISC-V)——在 enclave/secure world 里提供精简运行时(你做隔离工作时熟悉这一类)
- gRPC runtime:处理 stub 调用、流、拦截器
- ONNX Runtime / TensorRT / TVM runtime / PyTorch runtime:张量调度、算子分派、kernel 选择、设备内存管理
- CUDA Runtime(libcudart):相对 CUDA Driver API 的高层封装,管理 context、stream、kernel launch
- AWS Lambda Runtime(Node/Python/Custom Runtime API)
- Cloudflare Workers Runtime(基于 V8 isolate)
- Knative:在 K8s 上的 serverless runtime
- MPI runtime(OpenMPI、MPICH):进程组、集合通信
- OpenMP runtime(libgomp、libomp):fork-join、任务调度
- Actor runtime(Akka、Orleans):消息传递、位置透明
Runtime vs. Library:库通常是被动调用的函数集合;runtime 通常主动控制执行流(调度、GC、事件循环),并定义被托管代码必须遵守的协议。但二者边界模糊——libcudart 既叫 runtime 也是 library。
Runtime vs. VM/Engine:VM/Engine(如 V8、HotSpot)通常指执行引擎本身(解释 + JIT);Runtime 是更外层的概念,通常 = Engine + 运行库 + 系统接口胶水。Node.js = V8(engine)+ libuv + 标准库 = Node runtime。
Runtime vs. OS:OS 给所有进程提供 syscall;Runtime 给特定一类托管程序提供更高层、更受限或更便利的接口。eBPF runtime 在内核里,反而限制了 eBPF 程序能做什么——这就是你做特权指令隔离时类似的"宿主对受控代码的边界定义"。
无论是 JVM、Wasmtime 还是 eBPF runtime,它们的通用骨架几乎一致:
理解了这个骨架,再看任何新的 runtime(比如最近的 confidential computing runtime、各种 AI agent runtime),都可以快速对位它在四个维度上各做了什么取舍。