续 第二部分
初始后端实现
框架后端支持编译器和解释器。现在框架抽象类Backend有两个极简版实现,一个为编译器另一个为解释器。图2-7 展示了它们的UML类图。
图2-7 子类CodeGenerator和Executor分别是后端的编译器和解析器实现。
编译器
编译器后端做代码生成。backend.compiler包中的类CodeGenerator实现框架抽象类Backend。现在它被最大简化了。清单2-20 展示了它的父类方法process的实现。方法参数引用自中间码和符号表,它产生一条消息指出生成器生成了多少条机器语言指令(目前0条,因为没有实际生成过程)以及代码生成耗用时间。它调用sendMessage()方法发送编译摘要消息。
编译器约定摘要格式为:
- instructionCount:指令生成条数。
- elapsedTime:代码生成耗用时间。
所有COMILER_SUMMARY消息必须遵循这种约定。
清单2-20:类CodeGenerator的初级版实现
/**
* <p>编译器的后端代码生成器</p>
*/
extends Backend
5: {
void process(ICode iCode, SymTab symTab)
throws Exception
8: {
long startTime = System.currentTimeMillis();
float elapsedTime = (System.currentTimeMillis() - startTime)/1000f;
int instructionCount = 0;
12:
// 发送编译摘要消息
new Message(COMPILER_SUMMARY,
new Number[] {instructionCount,
16: elapsedTime}));
17: }
18: }