刷完 Crafting Interpreters 第 8 章,Statements and State。
这一章内容较多。增加了对语句的支持,包括表达式语句、print 语句、变量声明语句。同时增加了赋值表达式,并且支持了作用域。
实现作用域时使用的 Environment,与 Peter Novig 的 [(How to Write a (Lisp) Interpreter (in Python))](https://www.norvig.com/lispy.html) 经典文章里的,是同一思路。
最后讨论了一下变量声明是显式好,还是隐式好。结论是,显式更好。
Lox 相比真正编程语言,还缺少控制结构(if、while 等)、函数。这是接下来两章的内容。
现在的代码量只有 1059 行(不含注释和空行),已经做到这个程度,太神奇了。
随着内容的增加,感觉定义好 grammar 规则非常重要。事先要做好推演。
不然的话,越往后越容易出现问题。
View quoted note →
yfaming
yfaming@coinos.io
npub1jz8m...rg8y
- coder: Rust, Python, Racket(learning...)
- Nostr 中文圈 https://following.space/d/musdrpjpdmbr 值得关注的 nostr 中文用户都在这儿!
- 博客 https://yfaming.com/
完成第 7 章 Evaluating Expressions。
这一章篇幅较短,完成之后,就得到一个支持加减乘除、字符串拼接和逻辑判断的最简版 Lox 解释器了,大体上相当于一个计算器。求值仍然借助 visitor 模式,对表达式树进行后序遍历。本身算是简单。
至此,Lox 解释器已经初具雏形。scanner 已经全部完成,后续不需要改动。parser 及 evaluation 过程,只支持了较简单的表达式。后续章节将不断扩充语言,支持语句、控制流、函数、类与继承等等。
View quoted note →
刷完了第 6 章 Parsing Expressions,感觉最大的障碍已经克服了。😂
Parsing 技术非常丰富庞杂,包括 LL(k)、LR(1)、LALR、Earley、Packrat、PEG 等算法,还有 parser combinator、parser generator 等等技术。龙书太注重理论探讨,曾经让我觉得,只有完整掌握这些这些算法,才能写 compiler。龙书误我。😂
Crafting Interpreters 则选择跳过理论分析,直接开始构建 recursive descent parser。并且告诉我们,Rust、GCC、V8 等项目都采用了 recursive descent parser,既然如此,还有什么好担心的?😎
Contex-free grammar 方面,也是面向实际需要,介绍了如何消除歧义、如何对文法规则分层以解决运算符优先级问题。
最后,跟着把代码敲完,就得到了一个完整的 parser 了。🎉
翻越一座大山,原来可以如此简单!
View quoted note →
今天刚刷完 Chapter 6 Parsing Expressions 😎
View quoted note →
狂推神作 Crafting Interpreters!
Compiler/interpreter 技术,一直有种神秘色彩。一方面,掌握它能让你在更高层面看待编程语言,甚至自己创造一门。另一方面,庞杂的技术和龙书这样的大部头书,又往往将人劝退。
幸好,有了 Crafting Interpreters。
它的定位出奇制胜,因为它选择了一条独特的路径,带着我们游览 compiler/interpreter 技术丛林。
这本书以实践为主,主线是从 0 构建 interpreter,理论只做最简要的介绍。非常适合我这种连龙书 Syntax Analysis 那一章都没撑过去的苦手。😂
跟随着它的路径,我们只用几千行代码,就实现了一门完整的编程语言(Lox)。而且是两次,一次用 Java 一次用 C。
第一部分用 Java 实现一个 tree-walk interpreter。每章一个主题,先是实现 scanner,然后 recursive descent parser。然后从表达式求值逐步扩充,直到完整支持语句、控制流、函数、类与继承等语言特性。
第二部分改用 C 语言,实现一个虚拟机。我们从设计字节码开始,并将前面实现的语言特性编译为字节码。
整个过程中,不依赖外部库,需要的东西全部自己动手。跟着书的进度,几百行代码之后我们得到一个 scanner,再几百行之后得到一个 parser,几千行之后你就实现了完整的编程语言:Lox。
剩下的,就是自由发挥的天地了。😎
Crafting Interpreters
蹲一下 5w 的 BTC 😂
View quoted note →
看到一个新闻,BitMEX 交易所即将关闭。
我几乎没听说过它。😂
但是,BitMEX 发明了永续合约,这是一个改变世界级别的产品创新。😎👍
发现 Lisp 有关的博客,尤其是 Scheme 和 Racket 分支的,非常少啊。Scheme 已经这么小众了嘛?😂 #Lisp
#DeFi实盘 2026-07-19
当前市值 125.97,净值 0.6148。本周 LP 收益 0.2。
BTC price = 64357;SOL price = 75.93。
# 本周概况
交易又冷清起来了,在炎热的 7 月感受寒冬。😂
# 杂感
感觉这个实盘可能有点问题。DeFi 价格区间划分得可能太粗了。
好处当然是 LP 收益较多,坏处就是极端情况下容易杠杆失控。😭
总体上,单靠 DeFi 收手续费作为收入,可能不是最优的投资模式。
DeFi + 借贷 + 质押,三者综合,并且控制 DeFi 仓位,才能避免极端情况下爆仓风险。
但这样的话,就要接受更平庸一些的收益率了。
越来越觉得,不被黑天鹅事件给弄死,才是最重要的。
这么看的话,质押这种近乎无风险的,值得配置更多仓位。


#DeFi实盘 2026-07-12
当前市值 129.1,净值 0.6301。本周 LP 收益 0.26。
BTC price = 64180;SOL price = 77.47。
# 本周概况
这周 SOL 终于不如 BTC 坚挺了。
本周 BTC 微涨,但 SOL 微跌。交易也更冷清了。
# 杂感
这周最大的瓜就是 Gate 用户被盗币事件了。
X 上一用户反应被盗提币 170w U,Gate 员工却一拥而上阴阳怪气,各种暗示该用户动机不纯什么的。结果发现,用户是真的被盗币了。然后发推道歉,自打自脸。
最后,却只说配合警方调查什么的,也不提用户损失怎么办。
无语。垃圾交易所永远拉黑。
最重要的是:Not your keys, not your coins。


对于命令行程序的启动时间越来越敏感了。近期使用 steel Scheme 比较多,启动时有明显停顿感,比 Chez Scheme 启动要慢。
Chez Scheme:`echo "(exit)" | time scheme` 显示为 0.07s user,0.03s system。
steel Scheme:`time steel < /dev/null` 显示为 0.27s user,0.02s system。
用 hyperfine 测试一下:
```sh
$ hyperfine --warmup 3 'echo "(exit)" | scheme' 'steel < /dev/null'
Benchmark 1: echo "(exit)" | scheme
Time (mean ± σ): 97.2 ms ± 1.9 ms [User: 67.6 ms, System: 24.4 ms]
Range (min … max): 94.5 ms … 103.4 ms 28 runs
Benchmark 2: steel < /dev/null
Time (mean ± σ): 285.6 ms ± 6.3 ms [User: 267.1 ms, System: 15.2 ms]
Range (min … max): 274.3 ms … 293.7 ms 10 runs
Summary
echo "(exit)" | scheme ran
2.94 ± 0.09 times faster than steel < /dev/null
```
Chez Scheme 耗时 97ms,感觉流畅。而 steel Scheme 耗时 285ms,就有很明显的停顿感了。
另一个感觉明显的是 python 解释器和 IPython。
```sh
hyperfine --warmup 3 'python3 < /dev/null' 'ipython3 < /dev/null'
Benchmark 1: python3 < /dev/null
Time (mean ± σ): 49.0 ms ± 1.5 ms [User: 28.3 ms, System: 16.8 ms]
Range (min … max): 46.7 ms … 56.7 ms 52 runs
Benchmark 2: ipython3 < /dev/null
Time (mean ± σ): 521.5 ms ± 11.9 ms [User: 435.3 ms, System: 80.8 ms]
Range (min … max): 502.7 ms … 539.4 ms 10 runs
Summary
python3 < /dev/null ran
10.64 ± 0.41 times faster than ipython3 < /dev/null
```
python 解释器只要 49ms 即可完成启动,而 IPython 则需要 521ms。
最后,测试了 Python、Chez Scheme、Racket、Lua、NodeJS 这几个语言解释器,结果是:Lua(6.5ms)、Python(50ms)、NodeJS(71ms)、Chez Scheme(99ms)、Racket(552ms)。没想到 Lua 这么厉害。而看起来 Chez Scheme 虽然比 steel Scheme 启动速度快很多,但仍然算不上优秀了。而 Racket 是启动最慢,它现在是基于 Chez Scheme 实现的,层层开销累加,想必也快不起来了。
#Scheme #Python