08 - 串起来:造一门你自己的迷你语言
到这里,所有零件我们都见过了。这最后一章不讲新东西,而是把它们串成一条完整的链路——假设老板真让你造一门迷你语言,你从头到尾会怎么想?走完这一遍,前面七章就在你脑子里连成了一张图。
我们的目标很小:造一门只会做一件事的迷你语言,它能算这么一句:
result = 1 + 2
第一步:定规矩(对应第 03 章)
造语言的第一步,是先想清楚语法和语义:
- 语法:我规定一句话长这样——
名字 = 表达式。表达式可以是数字,也可以是「数字 + 数字」。 - 语义:
+就是数学加法;=表示「把右边算出的值,存到左边这个名字里」。
规矩定死,机器才有据可依。这就是第 03 章说的「两根支柱」。
第二步:拆词(对应第 05 章·词法分析)
用户输入 result = 1 + 2,我先把这串字符切成一个个词,并标好身份:
[result:名字] [=:赋值] [1:数字] [+:运算符] [2:数字]
一堆没结构的字符,变成了一排贴好标签的词。
第三步:搭架子(对应第 05 章·语法分析)
再把这排词按我定的语法规则,搭成一棵结构树:
=(赋值)
/ \
result +(加法)
/ \
1 2
现在机器不光认识每个词,还知道它们的关系了:这是一个赋值,右边是一个加法。
第四步:查含义(对应第 04 章·语义分析)
顺着这棵树检查一遍,讲不讲得通:
1和2都是数字,能相加吗?能,类型对得上。result是个合法的名字吗?是。
没毛病,放行。(如果这里写的是 1 + "苹果",就会在这一步被拦下。)
第五步:让它跑起来(对应第 06 章·编译 or 解释)
现在到了最后一步,我有两种选择——这正是第 06 章讲的两条路:
- 走解释这条路:我写个解释器,直接顺着这棵树算。看到加法节点,就把
1和2加起来得3;看到赋值节点,就把3存进result。读到哪算到哪,当场出结果。 - 走编译这条路:我把这棵树翻译成机器码(或字节码),生成一个成品,之后拿去跑。
对我们这门迷你语言来说,写个解释器最省事。跑完,result 里就是 3 了。
第六步:让它好用(对应第 07 章·运行时和生态)
如果我还想让别人真的爱用这门语言,就得继续补:
- 加个运行时,帮用户管好内存、报好错误;
- 备一套标准库,让用户不用自己实现
print、文件读写这些常用功能; - 慢慢养起生态:包管理器、第三方库、文档社区。
这一截决定了它是「一个玩具」还是「一门真能用的语言」。
把整条链路连起来看
定规矩(语法+语义)
│
▼
拆词 → 搭架子 → 查含义 → 让它跑(编译/解释)
│
▼
补运行时/标准库/生态 → 好用
回头看,一门语言的诞生,本质上就是在回答这么一串问题:
- 人怎么表达? → 设计语法和语义(第 02、03 章)
- 机器怎么读懂? → 拆词、搭架子、查含义(第 04、05 章)
- 怎么真的跑? → 编译或解释(第 06 章)
- 怎么变好用? → 运行时、标准库、生态(第 07 章)
而这一切的起点和归宿,始终是我们的那条主线——
编程语言,就是一座架在「人话」和「机器话」之间的翻译桥。 你写的每一行代码,都要走过这座桥,才能变成机器真正执行的 0 和 1。
学完之后,你可以这样验证自己
下次你再用任何一门语言,试着在脑子里回答几个问题,如果都答得上来,这套教程就真的进脑子了:
- 我这行代码,最终是要变成 0 和 1 的吗?(会 → 你抓住了本质)
- 这门语言是编译型还是解释型?翻译是提前做还是现场做?
- 我遇到的这个报错,是词法/语法错误(还没跑就报),还是运行时才出的错?
- 我选这门语言,除了语法,是不是也在选它背后的生态?
小结
- 造一门语言的完整思路:定规矩 → 拆词 → 搭架子 → 查含义 → 让它跑 → 补配套。
- 每一步都对应前面某一章,串起来就是一座完整的「翻译桥」。
- 一门语言的诞生,就是依次回答:人怎么表达、机器怎么读懂、怎么真的跑、怎么变好用。
- 记住主线:编程语言 = 人话和机器话之间的翻译桥。
- 恭喜你走完全程——现在你看任何一门语言,应该都能看出它「为什么长这样」了。
上一章 ← 07 - 光有语言还不够 | 回到 README 目录