编译器 II:代码生成
在编程领域,将高级程序转换为二进制代码的编译器就像一个神奇的魔术师。大多数程序员认为编译器是理所当然的,但仔细思考,这种转换能力近乎魔法。接下来,我们将深入探讨如何构建一个针对 Jack 语言的编译器,这是一种简单、现代的基于对象的语言。
1. 代码生成概述
高级程序员使用变量、表达式、语句、子程序、对象和数组等抽象构建块来描述程序的功能。编译器的任务就是将这些语义转换为目标计算机能理解的语言,在我们的例子中,目标计算机是之前章节描述的虚拟机。
在这个过程中,我们会以 Point 类为例,展示如何将高级功能逐步转换为虚拟机代码。Point 类包含了所有可能的变量类型(字段、静态、局部和参数)和子程序类型(构造函数、方法和函数),还展示了函数调用、构造函数调用和方法调用等特性。
2. 变量处理
编译器的基本任务之一是将源高级程序中声明的变量映射到目标平台的主机 RAM 上。在 Jack 语言中,所有基本类型(int、char 和 boolean)都是 16 位宽,与 Hack RAM 的地址和字宽相同,因此每个 Jack 变量都可以精确映射到内存中的一个字。
不同类型的变量有不同的生命周期:
- 类级静态变量 :由类中的所有子程序全局共享,在程序执行的整个过程中应保持单个副本存活。
- 实例级字段变量 :每个对象(类的实例)必须有一组私有的字段变量,当对象不再需要时,这些内存必须释放。
- 子程序级局部和参数变量 :每次子程序开始运行时创建,子程序终止时
Jack编译器代码生成详解
超级会员免费看
订阅专栏 解锁全文
1949

被折叠的 条评论
为什么被折叠?



