公众号旧文

为什么代码里总是有很多括号、分号、逗号?

作者:胖子阅读 —

为什么代码里,总是有很多:

  • 大括号 { }
  • 小括号 ( )
  • 分号 ;
  • 逗号 `,```

少写一个,程序就直接报错。

实际上,编程语言里最核心的问题之一,就是如何让代码的结构,能被机器 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) {
        ...
    }
}

看起来只是几个符号。

但实际上那些大括号,是在文本世界里,硬生生长出的一棵树。