Maybe Hook up with C again?
Mar 11, 2025
一直以来我都选择性忽略 C,几乎是最流行、最古老,也是在我看来怎么学也学不完的一门系统编程语言。因为我觉得它太难了:
- 没有官方的模块系统。Makefile 和 CMake 要写正确也很困难,不过还好今天我们有 LLM。
- 没有各种机制给你兜底,你需要非常小心的写出正确的代码,否则就会被各种内存问题困扰。虽然今天我们有
-fsanitize=address
和 Valgrind,但依旧写的我胆战心惊。 - 原始的语法,各种莫名其妙的指针… 我们什么时候才能正确返回错误、检查错误?
- 各种神秘但优雅的写法:你可以用 C 去做 OOP,泛型… 可到底怎么样才算最佳实践?
但很奇怪的,我需要做的事情总是会和 C 扯上关系。比方说我需要构建一个采用私有 802.1x 协议的认证客户端,我就不得不引入 libpcap
,一个底层网络库,用来操作网络设备、监听包、发送包之类的。
与其他网络库不同的是,你可以直接控制网络包的每一个字节,而不被限制在 TCP/UDP Socket 上(或许这叫 Raw Socket?)这是一个 C 语言的库,并且几乎所有其他语言做类似事情的库都只是这个库的绑定,这意味着什么呢?这意味着:
- 我没法利用 Golang 方便的交叉编译到不同的架构上了,因为现在我们依赖这个 C 库,于是我们引入了 CGO,再然后就是… 折腾 GCC 了。
- 这意味着我需要了解
libpcap
是一个什么样的库,提供了哪些 API,我怎么正确的使用它们,以及他们在其他语言里的绑定。
等等,这是不是意味着:为什么我干脆不去学 C? 我思考了很久,然后发现:是的,我又得和 C 搞上了。
这个数字世界的一大半基础是由 C 支撑起来的:
- 如果我想了解 Linux 内核是怎么工作的,我得懂 C;
- 如果我想知道如何实现一个 Wayland 窗口管理器,我得懂 C(labwc 几乎是 Wayland 窗管的最小实现);
- 如果我想做那些很 Cool 的逆向,我得懂 C,
以及别的一大堆乱七八糟的东西; - 如果我想进阶到别的系统编程语言,我得懂 C,否则我永远无法切身体会,这些新的编程语言解决了什么问题。
更重要的是,我不是完全不懂 C 了——我已经在 C 里踩过一些坑,已经用基础的语法搭出过一个可用的程序,虽然只有 1k 行左右,但我仍然有自信的说:C 其实也没有这么难,我只不过想正确的是用 C,深入了解他的优势、劣势和局限性。
抛开所有的这些,C 也挺酷的。