编译之后仍有工作

编译得到指令,并不表示执行时只剩处理器逐条计算。程序可能继续需要分配对象、查找方法、处理异常或组织线程。运行时系统提供这些支持,让语言规定的行为在实际机器上持续成立;它可以表现为虚拟机、链接进程序的库,或者由多种组件组成的执行环境。

参考:[1]

维护调用和对象状态

函数进入与返回需要相应的调用状态,对象创建则需要存储与生命周期管理。JVM规范用帧、操作数栈与堆等运行区解释这些工作。具体实现可以选择不同布局及优化方式,但仍要维持程序可观察的规则。语言抽象和物理内存布局因此联系紧密,却不是同一个描述层次。

参考:[2]

进入宿主程序的语言环境

应用把一种语言嵌入自身时,需要按接口初始化执行环境、交换对象并在结束时收尾。Python的C接口专门规定初始化、终结与线程状态等问题。宿主程序和语言运行时各有资源约定,数据跨越边界时要清楚谁持有引用、谁负责释放,以及哪些调用允许在当前线程状态下进行。

参考:[1]

成本来自具体机制

垃圾回收、动态查找和即时编译都可能消耗运行资源,也能换来更方便的管理或更快的后续执行。分析性能时,应测量具体机制及阶段:启动、热身和稳定运行会有不同成本。运行时不是与操作系统互斥的一套软件,而是在其上或与其协作承担语言层的执行支持。

参考:[2]