C–:支持垃圾回收的便携式汇编语言
1. C–运行时的激活映射
C–运行时可以使用实现跨度映射的相同机制,将激活映射到描述符。运行时接口可以将这些描述符缓存在激活句柄中,这样仅在调用 NextActivation
(即遍历栈时)才需要进行查找。另一种避免查找的方法是,在代码空间中调用之后立即存储一个指向描述符的指针,并让调用返回到该指针之后的指令。
描述符以及激活到描述符的映射细节对性能很重要,涉及存储描述符和映射的空间开销,以及查找与程序计数器(PC)对应的描述符的时间开销。不同调用点之间共享描述符对性能有显著影响。由于这些细节是后端和后端运行时系统之间的私有内容,因此可以在不改变方法、运行时接口或前端的情况下,试验不同的技术。
2. 设计细化
提供一个运行时接口,允许检查和修改暂停的C–计算状态,这个基本想法灵活且强大。但将此想法详细应用于各种运行时服务,并精确指定所得语言的语义,仍具有挑战性。
2.1 暂停与内省
所有预期的高级运行时服务必须能够暂停C–计算,检查其状态并进行修改,然后恢复执行。C–运行时假设生成的代码和运行时系统在单独的栈上作为单独的线程运行:
- 系统线程 :在操作系统提供的系统栈上运行,前端运行时系统在该线程中运行,可轻松检查和修改C–线程的状态。
- C–线程 :在单独的C–栈上运行。当C–线程的执行暂停时,其状态会保存在C–线程控制块(TCB)中。
C–线程的创建和控制转移方式如下:
- 系统线程调用 InitTC