1. 运行时环境的作用
-
程序运行的依赖
程序运行不仅依赖于指令集(如TRM), 还需要操作系统、库函数和其他运行时支持。这为程序提供了加载、链接、销毁以及运行时所需的各种服务。 -
结束运行的机制
由于大多数程序都具有结束运行的需求,运行时环境需要提供一种标准的结束方式。例如,在 NEMU 中通过特殊的nemu_trap
指令结束程序.
2. 运行时环境的最小条件
- 内存支持:程序必须被加载到合适的内存位置.
- PC 指向:程序计数器(PC)指向程序的第一条指令,开始执行.
- 结束运行机制:必须提供一种机制(例如
nemu_trap
指令)通知程序结束.
这三点构成了最基本的运行时环境支持,使程序能被正确加载、执行,并安全退出.
3. 将运行时环境封装成库函数
-
跨架构支持
不同的ISA(指令集架构)和平台对一些运行时操作(例如结束运行)的实现方式可能不同. -
抽象和解决问题的思路
为了避免为每个程序和每个架构分别编写代码,可以将运行时支持(如结束程序)抽象为一个统一的API,比如void halt()
. - 程序调用
halt()
,而具体如何结束运行则由各个架构实现自身的halt()
函数. - 这种方式实现了程序与底层架构的解耦,减少了代码冗余.
-
总体需要维护的是:程序部分的代码(n个)加上架构相关的抽象实现(m个),而非 n * m 种实现.
-
库的作用
将公共要素抽象为库函数,可以大大提升开发效率,让程序开发者只需调用这些API,而不必关心底层架构细节. 这正是运行时环境以库的形式存在的体现.
4. 总结
-
抽象和解耦
通过抽象出统一的API(例如halt()
),程序与具体架构的实现细节分离,易于维护和扩展. -
运行时环境的重要性
程序的正确加载、执行和退出都依赖于完整的运行时环境支持,包括内存管理、指令执行和结束程序机制等. -
库函数的设计
将常用的运行时功能如加载、销毁程序等抽象成库函数,可以实现跨平台的运行支持,避免不同平台代码重复开发,降低系统复杂度.
这种设计思路符合KISS(Keep It Simple and Stupid)原则,确保系统只关注必要的功能,同时通过抽象提高代码复用和灵活性.