yfaming on Nostr: 看完了 Crafting Interpreters 第 27 章,Classes and Instances。 ...
看完了 Crafting Interpreters 第 27 章,Classes and Instances。
这一章支持了类 class 的声明和实例 instance 的创建,以及读写实例的字段。
我们增加了 `ObjClass` struct 表示类,增加了 `ObjInstance` struct 表示实例。
在 Lox 中,一个 class 对应一个 `ObjClass` 对象。一个 instance 对应一个 `ObjInstance` 对象。
我们用 `OP_CLASS` 指令声明类。运行时,它创建一个 `ObjClass` 实例。
而创建 instance,就是把 class 当作函数调用的过程。Lox 中有三类对象可以当作函数进行调用:函数(`ObjClosure`)、class(`ObjClass`)、原生函数(`ObjNative`)。
为了读写实例的字段,我们增加了 `OP_GET_PROPERTY` 和 `OP_SET_PROPERTY` 指令。
本章内容比较简单。接下来的两章,我们将支持类的方法,以及继承。
接下来,开始 Crafting Interpreters 第二部分,用 C 实现的 Lox 字节码解释器 clox。
在第一部分,用 Java 实现的 tree-walk interpreter jlox 中,我们完整实现了 Lox 解释器,包括 scanner、parser、resolver、interpreter 等等。
但是,第一部分的解释器利用了 Java 语言的许多特性。
比如,Lox 的值,全部用 Java 的 Object 类型表示。
Lox 里的 return,用 Java 的异常来实现。
而 Java 自带 GC,所以 Lox 中对象的生命周期,我们也完全没考虑过。
在第二部分,我们将使用 C 语言实现解释器。C 比 Java 更加 low-level,它不支持 OOP,不支持异常和 GC。
因此,这几个问题,我们就需要在 C 里面手动处理了。
而且,第二部分我们实现的是字节码解释器。我们需要定义字节码,并在 parsing 将 ast 编译为字节码。
用不同语言实现同一门语言,但采用略有不同的技术,可以加深我们的理解,并学习 compiler/interpreter 领域的不同主题。
Published at
2026-09-09 04:29:03 UTCEvent JSON
{
"id": "c62b7bd0b41a1163be25e611ee8d468e6e00ae432f691a6046e0a286ed24a717",
"pubkey": "908fbc3babc322eea473a0ab1e6bf6b3adcf899288ac97b2fa79f34ad408d4e4",
"created_at": 1788928143,
"kind": 1,
"tags": [
[
"q",
"1aea59b1f714db6bebf6019f30c55e36795d9bbba666682c752163c90db1acff",
"wss://lang.relays.land/zh",
"908fbc3babc322eea473a0ab1e6bf6b3adcf899288ac97b2fa79f34ad408d4e4"
]
],
"content": "看完了 Crafting Interpreters 第 27 章,Classes and Instances。\n\n这一章支持了类 class 的声明和实例 instance 的创建,以及读写实例的字段。\n\n我们增加了 `ObjClass` struct 表示类,增加了 `ObjInstance` struct 表示实例。\n在 Lox 中,一个 class 对应一个 `ObjClass` 对象。一个 instance 对应一个 `ObjInstance` 对象。\n\n我们用 `OP_CLASS` 指令声明类。运行时,它创建一个 `ObjClass` 实例。\n \n而创建 instance,就是把 class 当作函数调用的过程。Lox 中有三类对象可以当作函数进行调用:函数(`ObjClosure`)、class(`ObjClass`)、原生函数(`ObjNative`)。\n\n为了读写实例的字段,我们增加了 `OP_GET_PROPERTY` 和 `OP_SET_PROPERTY` 指令。\n\n本章内容比较简单。接下来的两章,我们将支持类的方法,以及继承。\n\nnostr:nevent1qvzqqqqqqypzpyy0hsa6hseza6j88g9tre4ldvade7ye9z9vj7e0570nft2q348yqyvhwumn8ghj7mrpdenjuun9d3shjuewd3skuep00f5qzxrhwden5te0wfjkccte9ehx7um5wfaxstn0wfnj7qpqrt49nv0hzndkh6lkqx0np327xeu4mxam5enxstr4y93ujrd34nls7vs4y9",
"sig": "b6695093858370bfbbcfc8a2862f0d5fd24c6f51a1dae03e912b117f6816fb6b678aa38759b04d8b7e60cc0470f3b935b5c2ddd35803851f3c441eded8273044"
}