Jack程序转VM代码时字符串常量的翻译方法咨询
Jack字符串常量转VM代码实现方法
Jack语言没有原生字符串类型,所有字符串字面量本质都是标准库String类的实例,翻译时需要先通过String类API构造实例,再将实例引用作为参数传入目标函数,具体实现逻辑如下:
翻译步骤
- 计算目标字符串的字符长度,比如示例中
"Hello world!"的长度为12 - 压入长度常量,调用
String.new方法构造空字符串实例,调用完成后栈顶会返回该实例的引用 - 遍历字符串的每个字符,依次压入对应字符的ASCII码,调用
String.appendChar方法追加字符,每次调用完成后栈顶会重新返回当前字符串实例的引用 - 所有字符追加完成后,栈顶存储的就是构造完成的字符串实例引用,也就是你标注的
SOMETHING对应的内容,此时直接调用Output.printString即可
示例完整VM代码
// 构造字符串"Hello world!" push constant 12 call String.new 1 push constant 72 // 'H'的ASCII码 call String.appendChar 2 push constant 101 // 'e'的ASCII码 call String.appendChar 2 push constant 108 // 'l'的ASCII码 call String.appendChar 2 push constant 108 // 'l'的ASCII码 call String.appendChar 2 push constant 111 // 'o'的ASCII码 call String.appendChar 2 push constant 32 // 空格的ASCII码 call String.appendChar 2 push constant 119 // 'w'的ASCII码 call String.appendChar 2 push constant 111 // 'o'的ASCII码 call String.appendChar 2 push constant 114 // 'r'的ASCII码 call String.appendChar 2 push constant 108 // 'l'的ASCII码 call String.appendChar 2 push constant 100 // 'd'的ASCII码 call String.appendChar 2 push constant 33 // '!'的ASCII码 call String.appendChar 2 // 此时栈顶已为字符串实例引用,直接调用打印方法 call Output.printString 1
注意事项
String.new和String.appendChar都是Jack标准库内置方法,翻译阶段直接按名称调用即可String.appendChar需要2个参数:第一个是字符串实例引用,第二个是待追加的字符ASCII码,所以调用时参数计数为2- 编译器实现阶段可以将该逻辑封装为专用的字符串字面量处理模块,遍历字符自动生成对应VM代码即可
内容的提问来源于stack exchange,提问作者user613
相关产品推荐
相关产品推荐

