前言
运行时
每种语言都有一个特定的执行模型(Execution Model)。而这个执行模型就需要运行时系统(Runtime System)的支持。我们把这种可以支撑程序运行的运行时系统,简称为运行时。包括三方面的功能:程序运行机制、内存管理机制和并发机制。
jvm
- JVM 规定了一套程序的运行机制。JVM 支持基于字节码的解释执行机制,还包括了即时编译成机器码并执行的机制。字节码规范、类型系统、class文件结构、基于栈的解释器。
- JVM 对内存做了统一的管理。它把内存划分为程序计数器、虚拟机栈、堆、方法区、运行时常量池和本地方法栈等不同的区域。对于栈来说,它的栈桢既可以服务于解释执行,又可以用于执行机器码。对于堆来说,Java 提供了垃圾收集器帮助进行内存的自动管理。
- JVM 封装了操作系统的线程模型,为应用程序提供了并发处理的机制。
c
我们对 C 语言的印象,是一旦编译完成以后,就是一段完全可以自主运行的二进制代码了,你也可以看到输出的完整的汇编代码。所以,C 语言最主要的运行时,实际上就是操作系统。C 语言和现代的各种操作系统可以说是伴生关系,就像 Java 和 JVM 是伴生关系一样。
- 在程序执行机制方面,C 语言编译完毕的程序是完全按照操作系统的运行机制来执行的。
- 在内存管理方面,C 语言使用了操作系统提供的线程栈,操作系统能够自动帮助程序管理内存。程序也可以从堆里申请内存,但必须自己负责释放,没有自动内存管理机制。
- 在并发机制方面,当然也是直接用操作系统提供的线程机制。因为操作系统没有提供协程和 Actor 机制,所以 C 语言也没有提供这种并发机制。
golang
Golang runtime 是go语言运行所需要的基础设施
- 协程调度、内存分配、GC
- 操作系统及cpu 相关的操作的封装(信号处理、系统调用、寄存器操作、原子操作等)CGO。go 对系统调用进行了封装,可不依赖glibc
- pprof,trace,race 检测的支持
- map,channel,string 等内置类型及反射的实现
常规的package 需要import 才能使用,go runtime库猜测一下应该是 go build
时自动import 到代码上的。
库
- 标准库,供用户的程序调用。我们写代码的时候,有一些标准的功能,像是读写文件的功能,自己实现起来太麻烦,或者根本不可能用这门语言本身来实现,这时就需要标准库的支持。
- 包含 IO 功能,包括文件 IO、网络 IO 等。
- 支持内置的数据类型。
- 支持各种容器型的数据结构。
- 运行时库,它们不是由用户直接调用的,而是运行时的组成部分。
- Built-in 或者 Intrincics 的内置函数,它们是用来辅助生成机器码的。