22
33很多语言在介绍时都会强调语法、范式、库生态,但当你真正开始研究一门语言的 ** 实现本身** 时,关注点会自然转向另一些问题:
44
5- > 这门语言的 " 本体 " 是什么?
5+ > 这门语言的 “ 本体 ” 是什么?
66> 程序最终跑在什么之上?
77> 编译和运行的边界在哪里?
88
99Racket 是一门 ** 非常适合从工程层面解剖的语言** ,因为它对这些问题的答案并不隐藏,甚至可以说是刻意暴露出来的。
1010
11- ## 一、Racket 不是 " 一个编译器 " ,而是一套语言运行系统
11+ ## 一、Racket 不是 “ 一个编译器 ” ,而是一套语言运行系统
1212
1313从工程上看,Racket 更接近于:
1414
1515> ** 一个可扩展的语言平台(language platform)**
1616
1717而不是:
1818
19- > " 把源码翻译成机器码的单一编译器 "
19+ > “ 把源码翻译成机器码的单一编译器 ”
2020
2121Racket 官方发行的内容,大致可以拆成四个层次:
2222
@@ -28,7 +28,7 @@ Racket 语言
2828└─ 底层宿主(Chez Scheme / C 运行时 / OS)
2929```
3030
31- 你研究的 " Racket 本身 " ,本质上就是在这四层之间穿行。
31+ 你研究的 “ Racket 本身 ” ,本质上就是在这四层之间穿行。
3232
3333## 二、Racket 程序最终编译成了什么?
3434
@@ -41,7 +41,7 @@ Racket 语言
4141* → 编译为 ** Racket 字节码(.zo)**
4242* → 由 Racket VM 执行(通过 JIT)
4343
44- ` .zo ` 文件就是 Racket 世界里的 " 目标文件 " 。
44+ ` .zo ` 文件就是 Racket 世界里的 “ 目标文件 ” 。
4545
4646你可以把它理解为:
4747
@@ -60,15 +60,15 @@ Racket 语言
6060
6161** 注意关键点:**
6262
63- > ` .zo ` 并不是 " S 表达式文本的序列化 " ,
63+ > ` .zo ` 并不是 “ S 表达式文本的序列化 ” ,
6464> 而是 ** 接近运行时的数据结构快照** 。
6565
6666** 重要细节:**
6767
6868* Racket BC(Before Chez)和 Racket CS(Chez Scheme)的 ` .zo ` 格式 ** 不兼容**
6969* 这也是为什么在切换 Racket 实现时需要重新编译所有依赖
7070
71- 这也是为什么 Racket 的 " 编译 " 和 " 加载 " 界线很模糊。
71+ 这也是为什么 Racket 的 “ 编译 ” 和 “ 加载 ” 界线很模糊。
7272
7373### 3️⃣ 可以编译成机器码吗?
7474
@@ -116,14 +116,14 @@ Chez Scheme:提供"高效的 Scheme 执行引擎"
116116Racket:将自己的语言语义完整地实现在 Chez 之上
117117```
118118
119- Racket 并不是 " 基于 Chez 构建 " ,而是:
119+ Racket 并不是 “ 基于 Chez 构建 ” ,而是:
120120
121121> ** 把 Chez 当作一个高质量的底层 substrate,
122122> 但在其上重写了几乎所有语言层面的东西。**
123123
124124类比:就像 PyPy 用 RPython 实现 Python,但 Python 语言本身的语义是 PyPy 团队定义的。
125125
126- ### 2️⃣ Racket Runtime(真正的 " 语言引擎 " )
126+ ### 2️⃣ Racket Runtime(真正的 “ 语言引擎 ” )
127127
128128Racket 自己实现了大量运行时组件,包括:
129129
@@ -134,7 +134,7 @@ Racket 自己实现了大量运行时组件,包括:
134134* ** 合约系统** (contract system)
135135* ** custodian** (资源管理)
136136
137- 这些并不属于 Scheme 语言规范,而是 Racket 的 " 语言级基础设施 " 。
137+ 这些并不属于 Scheme 语言规范,而是 Racket 的 “ 语言级基础设施 ” 。
138138
139139> 所以 Racket 的运行时 ** 远大于一个解释器** 。
140140
@@ -147,7 +147,7 @@ Racket 自己实现了大量运行时组件,包括:
147147
148148但这些被严格封装在运行时中,** 用户层几乎感知不到** 。
149149
150- ## 四、Racket 的 " 编译 " 是一条流水线,而不是一步
150+ ## 四、Racket 的 “ 编译 ” 是一条流水线,而不是一步
151151
152152如果从工程实现的角度抽象,Racket 的编译流程更像这样:
153153
@@ -165,11 +165,11 @@ Linklet / Bytecode(.zo)
165165
166166### 核心特征:
167167
168- * ** 宏在 " 扩展期(expansion time)" 执行** ,而非传统意义的 " 编译期 "
168+ * ** 宏在 “ 扩展期(expansion time)” 执行** ,而非传统意义的 “ 编译期 ”
169169* 扩展可能发生在你 ` raco make ` 时,也可能发生在 ` require ` 加载模块时
170170* ** Phase separation** :Racket 的宏系统区分多个执行阶段(phase 0, 1, 2...)
171171* 语言本身可以改变编译过程
172- * 不存在一个 " 不可修改的语法阶段 "
172+ * 不存在一个 “ 不可修改的语法阶段 ”
173173
174174** Linklet 的引入(Racket CS):**
175175
@@ -181,7 +181,7 @@ Linklet / Bytecode(.zo)
181181
182182这也是为什么在 Racket 中:
183183
184- > " 语言实现 " 和 " 用户程序 " 之间的界线是模糊的。
184+ > “ 语言实现 ” 和 “ 用户程序 ” 之间的界线是模糊的。
185185
186186## 五、模块是 Racket 工程的基本单位,而不是文件
187187
@@ -206,7 +206,7 @@ Linklet / Bytecode(.zo)
206206
207207如果你要理解 Racket 的工程结构,** 模块系统是必读内容** 。
208208
209- ## 六、raco:Racket 工程的 " 构建系统 + 包管理器 "
209+ ## 六、raco:Racket 工程的 “ 构建系统 + 包管理器 ”
210210
211211从工程角度,` raco ` 承担的角色非常关键:
212212
@@ -220,11 +220,11 @@ Linklet / Bytecode(.zo)
220220
221221> ** raco 是 Racket 的工程入口,而不是 REPL。**
222222
223- 当你研究 Racket 的 " 最终产物是什么 " 时,答案几乎总是:
223+ 当你研究 Racket 的 “ 最终产物是什么 ” 时,答案几乎总是:
224224
225- > " 取决于 raco 是如何调用编译与打包流程的。"
225+ > “ 取决于 raco 是如何调用编译与打包流程的。”
226226
227- ## 七、如果你想 " 深入 Racket 工程 " ,应该关注什么?
227+ ## 七、如果你想 “ 深入 Racket 工程 ” ,应该关注什么?
228228
229229从专家视角给你一个现实的路线图:
230230
@@ -253,23 +253,23 @@ Linklet / Bytecode(.zo)
253253
254254### 可以暂时忽略的早期误区
255255
256- * 纠结 " 是不是静态编译语言 "
256+ * 纠结 “ 是不是静态编译语言 ”
257257* 把 Racket 和 C / Rust 对等比较编译产物
258258* 把 ` .rkt → exe ` 当成核心问题
259259
260260## 八、一句工程化的总结
261261
262262如果用一句话描述 Racket:
263263
264- > ** Racket 是一套 " 可被用户扩展的语言实现 " ,而不仅是一门语言。**
264+ > ** Racket 是一套 “ 可被用户扩展的语言实现 ” ,而不仅是一门语言。**
265265
266266你写的不只是程序,而是在参与:
267267
268268* 编译流程
269269* 语言语义
270270* 运行时构建
271271
272- 这也是为什么,真正理解 Racket 之后,再回头看很多 " 传统语言 " 的工程设计,会觉得它们的边界异常僵硬。
272+ 这也是为什么,真正理解 Racket 之后,再回头看很多 “ 传统语言 ” 的工程设计,会觉得它们的边界异常僵硬。
273273
274274## 附录:关键术语对照
275275
0 commit comments