运行时系统

运行时系统

      • 概述
      • 与运行时环境的关系
      • Examples
      • 总结
        • Go Runtime
      • 参考

概述

在计算机编程中,运行时系统是既存在于创建程序的计算机中,也存在于打算运行程序的计算机中的子系统

大多数编程语言都有某种形式的运行时系统,提供程序运行的环境。该环境可以解决很多问题,包括应用程序内存的管理、程序如何访问变量、在函数之间传递参数的机制、与操作系统的接口等等。编译器根据特定的运行时系统做出假设以生成正确的代码。通常,运行时系统将负责管理堆和栈,并且可能包括垃圾回收、线程或语言中内置的其它动态特性等特性。

每种编程语言都指定了一个执行模型,并且许多语言在运行时系统中至少实现了该模型的一部分。运行时系统行为的一个可能定义是“任何不直接归因于程序本身的行为”。该定义包括在函数调用之前将参数放入堆栈、相关行为的并行执行以及磁盘 I/O。

根据这个定义,基本上每种语言都有一个运行时系统,包括编译语言、解释语言和嵌入式领域特定语言。即使是 API 调用的独立执行模型,例如 Pthreads (POSIX 线程),也有一个运行时系统来实现执行模型的行为。

除了执行模型行为之外,运行时系统还可以执行支持服务,例如类型检查、调试或代码生成和优化。

与运行时环境的关系

运行时系统也是运行程序与运行时环境交互的网关。运行时环境不仅包括可访问的状态值,还包括程序在执行期间可以与之交互的活动实体。例如,环境变量是许多操作系统的特性,是运行时环境的一部分;正在运行的程序可以通过运行时系统访问它们。同样,诸如磁盘或 DVD 驱动器之类的硬件设备是程序可以通过运行时系统与之交互的活动实体。

Examples

C 语言的运行时系统是由编译器插入到可执行文件中的一组特定指令。这些指令管理进程堆栈,为局部变量创建空间,并将函数调用参数复制到堆栈顶部。

通常没有明确的标准来确定哪些语言行为是运行时系统本身的一部分,哪些可以由任何特定的源程序确定。例如,在 C 中,堆栈的设置是运行时系统的一部分。它不是由单个程序的语义决定的,因为行为是全局不变的:它适用于所有执行。这种系统行为实现了语言的执行模型,而不是实现特定程序的语义 (文本直接翻译成计算结果的代码)。

特定程序的语义与运行时环境之间的这种分离反映在编译程序的不同方式上:将源代码编译为包含所有函数的目标文件与将整个程序编译为可执行二进制文件。目标文件将仅包含与所包含函数相关的汇编代码,而可执行二进制文件将包含实现运行时环境的附加代码。一方面,目标文件可能缺少运行时环境中的信息,这些信息将通过链接来解决。另一方面,目标文件中的代码仍然依赖于运行时系统中的假设;例如,函数可以从特定寄存器或堆栈位置读取参数,具体取决于运行时环境使用的调用约定。

总结

运行时系统是介于应用程序和操作系统中间的一层。

每种语言都有运行时系统,只不过有轻重之分,比如,C/C++/Rust 的运行时系统就比较轻,Java/Go 的运行时系统就比较重。

C/C++/Rust 生成的可执行文件直接包含 CPU 指令,是可以直接被操作系统拿来创建进程的。而需要运行时的程序在运行的时候,一般是创建运行时进程,再由运行时进程间接加载运行编译输出的文件。

Go Runtime

尽管 Go 编译器产生的是本地可执行代码,然而这些代码仍旧运行在 Go 的 runtime 当中。这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收、goroutine、channel、切片、map 和反射等等。

runtime 主要由 C 语言编写,并且是每个 Go 包的最顶级包。你可以在目录 $GOROOT/src/runtime 中找到相关内容。

参考

https://en.wikipedia.org/wiki/Runtime_system
https://www.zhihu.com/question/402184881
https://learnku.com/docs/the-way-to-go/go-runtime-runtime/3570

你可能感兴趣的:(随笔,开发语言)