什么是runtime
实际上编程语境中的 runtime 大概有三个含义,分别指
- 程序运行的时候,即程序生命周期中的一个阶段。比如:Rust 比 C 更容易将错误发现在编译时而非运行时。
- 程序从写好代码字符串(起点)到跑完退出(终点),有一整套标准化的生命周期(流程),可以被拆分为多个阶段。这其中编译阶段是compile time,链接阶段是 link time,那运行起来的阶段自然就是 run time 了
- 指运行时库,即 glibc 这类原生语言的标准库。比如:C 程序的 malloc 函数实现需要由运行时提供。
- 虽然 C 的 if、for 和函数等语言特性都可以很朴素且优雅地映射(lowering)到汇编,但必然会有些没法直接映射到系统调用和汇编指令的常用功能,比如负责内存分配的 stdlib.h:直接通过 mmap 这类 OS 系统调用来分配内存是过于底层的,一般也需要有人帮你封装。分配内存的 malloc 虽然只是一个接受单个参数的函数,它的实现可远没有表面上的 API 那么简单。对于这些脏活累活,它们就需要由运行时库(例如 Linux 上的 glibc 和 Windows 上的 CRT)来实现
- 指运行时系统,即某门语言的宿主环境。比如:Node.js 是一个 JavaScript 的运行时。
- 上面介绍的运行时库,主要针对的是 C、C++ 和 Rust 这些「系统级语言」。只要将这个概念继续推广到其他高级语言,这时候的「运行时」指的就是 runtime system 了——如果讨论某门高级语言的运行时,我们通常是在讨论一个更重、更大而全的运行时库。比如 Java 的运行时是 JRE,C# 的运行时是 CLR。这两者都相当于一个需要在 OS 上单独安装的软件,借助它们来解释执行相应语言的程序(编译出的字节码)。而对 JavaScript 来说,一般「JS 引擎」是个不带 IO 支持的虚拟机,需要浏览器和 Node 这样的「JS 运行时」才能让它控制文件、网络、图形等硬件资源而真正实用。这些都是很经典的模型了。
- 典型的高级语言「运行时系统」里大概需要这些基础组件:一个解释执行字节码的虚拟机,多半得带个垃圾回收器。如果语言是源码解释执行,那么需要一个编译器前端做词法分析和语法分析。如果运行时支持 JIT 优化,那么还得藏着个编译器后端(动态生成机器码)。IO 相关能力,比如 Node.js 的 fs.readFile 之类。可以看到相比上面 C 语言的「运行时」,这已经是个复杂的基础软件系统了。
其实总结起来,runtime概括的可以理解为程序运行时所需要和依赖的一系列库和环境。
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
2016-11-21 趣谈、浅析CRLF和LF