公众号旧文
为什么代码里总是有很多括号、分号、逗号?
为什么代码里,总是有很多:
- 大括号
{ } - 小括号
( ) - 分号
; - 逗号 `,```
少写一个,程序就直接报错。
实际上,编程语言里最核心的问题之一,就是如何让代码的结构,能被机器 100% 准确理解。
而这些符号,正是为了解决这个问题而存在的。
一、人擅长猜
人的阅读能力极其强大。
比如:今天下雨别出门带伞的人很多
虽然没有标点,但你还是能靠经验自动断句。
因为人脑会结合上下文去自动补全语义。
哪怕一句话有歧义,人也能差不多理解。
但计算机不行,计算机不会猜。
它不知道什么叫语气,什么叫常识,什么叫差不多。
它只能按照规则,一个字符一个字符地读取。
所以编程语言必须把结构写得非常明确。
二、代码真正长什么样?
很多人以为代码是一行一行的。
其实不是。
代码真正的结构,更像一棵树。
例如:
if (x > 0) {
y = a + b * c;
}
在人眼里是三行。
但在编译器眼里,它更像:
IF
├── 条件:x > 0
└── 执行块
└── 赋值
├── y
└── +
├── a
└── *
├── b
└── c
这是层级结构。
而问题在于,人类只能在屏幕上输入一维文本。
你没法真的把树画进去,所以编程语言只能发明各种符号:
- 括号
- 大括号
- 缩进
- 分号
来模拟树结构。
三、大括号,本质上是树枝
例如:
if (x) {
while (y) {
doSomething();
}
}
这里的大括号是在告诉编译器:
这里开始进入下一层
这里结束这一层
相当于:
if
└── while
└── doSomething
所以大括号是在描述代码的层级。
四、分号,本质上是句号
再看:
a = 1;
b = 2;
c = a + b;
为什么非要加分号?
因为机器不像人,它不知道一句话什么时候结束。
人类看到换行,会自然认为上一句结束了。
但机器不能依赖这个。
因为:
a =
1 +
2
也是合法代码。
所以很多语言选择用 ; 明确告诉编译器一句代码结束了。
它本质上和中文句号很像。
五、括号,本质上是优先级说明书
例如:
a + b * c
和:
(a + b) * c
结果完全不同。
括号的作用是在明确哪部分应该先结合。
因为计算机不会领会意思。
它必须严格知道:
- 谁先算
- 谁后算
- 哪部分属于谁
六、为什么 Python 能不用大括号?
Python 选择了另一种方案:
if x > 0:
print("hello")
它用缩进和空格层级来表达结构。
这更接近人类阅读习惯。
但代价是:
- 空格变成了语法
- Tab 和空格混用会报错
- 复制代码容易出问题
所以不同语言只是选择了不同的结构表达方式。
七、所有编程语言,本质都在做同一件事
你会发现无论是:
- C
- Python
- Java
- Rust
- Go
- Lisp
它们都在解决同一个核心问题:
如何把复杂的树状逻辑,压缩进一维文本。
因为程序本质上是:
- 条件
- 嵌套
- 作用域
- 调用关系
- 优先级
- 数据流
这是一个立体结构。
但键盘输入只能是一行行字符。
所以人类发明了:
- 括号
- 缩进
- 关键字
- 分号
来给机器画结构图。
八、程序员真正写的,其实不是代码
从更深层看,程序员真正写的,其实是给编译器看的结构说明书。
代码只是表面。
真正重要的是:
- 哪部分属于哪里
- 谁控制谁
- 谁嵌套谁
- 谁先执行
- 谁后执行
所以:
if (x) {
while (y) {
...
}
}
看起来只是几个符号。
但实际上那些大括号,是在文本世界里,硬生生长出的一棵树。