03 - 设计一门语言,到底要设计什么?
假设现在轮到你了:老板说「给我造一门新语言」。你从哪下手?这一章我们不谈实现,只想清楚一件事——一门语言,本质上是在设计什么?
先玩个小游戏:发明一句「命令」
假设我们要让机器人干活,你随手写了一句:
拿 苹果 到 桌子
看起来挺清楚。但机器人立刻懵了,它会反问你两个问题:
- 「这句话的格式是什么?」——是「动作 + 东西 + 到 + 地点」吗?那能不能写成「到 桌子 拿 苹果」?逗号要不要?空格算不算数?
- 「这句话到底要我干嘛?」——「拿」是抓在手里,还是搬走?「到桌子」是放桌上,还是走到桌子旁边?
你发现没有:要让这句话能被机器执行,你必须先回答这两类问题。而这两类问题,正好就是设计一门语言的两根支柱。
支柱一:语法(长什么样)
语法(Syntax)管的是「这门语言的句子该怎么写才算合法」。 它是一套形状规则,规定:
- 有哪些关键字(保留给语言自己用的词,比如
if、while、return); - 句子要按什么顺序和格式排列(比如「先条件,后花括号」);
- 用什么符号分隔(分号、逗号、括号、缩进……)。
举个真实的例子,几乎所有语言都规定「判断」要这么写:
if (条件) {
要做的事
}
你要是写成 如果 条件 那么 做事,在这门语言里就是语法错误——不是意思不对,而是「格式不合规矩」,机器压根没法往下读。
类比:语法就像「填表格」。表格规定了哪一栏填什么、按什么顺序填。你填错了格子,工作人员看都不看就退回来——这就是语法错误。
支柱二:语义(是什么意思)
语义(Semantics)管的是「一句合法的句子,到底该产生什么效果」。
同样一句 a = b + c,语法上没问题,但语义要回答一堆问题:
+是数字相加,还是把两段文字拼起来?(1 + 2和"你" + "好"结果完全不同)=是「判断相等」还是「把右边的值存到左边」?- 如果
b是数字、c是文字,这句话到底算合法还是报错?
语法保证句子「写得对」,语义保证句子「意思明确、有确定的效果」。 两者缺一不可:语法对但语义乱,机器还是不知道该干嘛。
一门语言的「零件清单」
把上面的东西落到具体,你设计一门语言时,其实就是在定义这么几种零件:
- 值 / 数据类型:能处理哪些东西?数字、文字、真假……
- 变量:怎么给数据起名字、存起来、之后再用。
- 表达式:能算出一个结果的式子,比如
1 + 2、a > b。 - 语句:一条完整的指令,比如「赋值」「如果……就……」「重复做……」。
- 函数:把一段常用的操作打包,起个名字,方便反复调用。
你会发现,无论 C、Python 还是 JavaScript,翻来覆去都是这几样零件。语言之间的差异,很多时候只是「同样的零件,换了个样子和规则」而已。
小结
- 设计一门语言,核心是设计两根支柱:语法(长什么样) 和 语义(是什么意思)。
- 语法像填表格:规定句子的格式,写错了就是语法错误。
- 语义规定句子的确切效果:同一个
+,可能是加法也可能是拼接。 - 落到具体,语言就是在定义一套「零件」:数据类型、变量、表达式、语句、函数。
- 规则定好了,接下来的问题是:机器拿到你按规则写的代码,是怎么一步步读懂并执行的?下一章给你一张全局流水线图。
上一章 ← 02 - 语言的进化 | 下一章 → 04 - 机器怎么读懂你写的代码? | 回到 README 目录