C 不再是编程语言:它是所有语言必须遵守的协议
摘要
文章论述了 C 语言如何从一门编程语言演变为编程世界的通用协议。由于操作系统接口均以 C 定义,所有现代语言(Rust、Swift、Python 等)都必须通过 FFI 与 C 交互。然而 C 的头文件难以解析、类型布局依赖实现、ABI 因平台而异且缺乏机器可读规范,这使得跨语言互操作成为一场噩梦。
内容框架与概述
文章从一个新语言开发者的视角切入,揭示了一个尴尬现实:即使你设计了全新的编程语言,要与操作系统交互,仍必须学会说 C 语言。Linux 的文件操作、系统调用——所有底层接口都以 C 头文件形式提供,这迫使每种语言都实现 FFI 来与 C 对话。
作者指出与 C 交互面临三大技术障碍:解析 C 头文件几乎不可能(连 Swift 这样资源雄厚的语言都依赖 Clang)、C 类型如 long 的大小因平台而异、不同编译器对同一平台的 ABI 理解也存在分歧。Rust 编译器支持 176 种目标三元组,每种都有不同的调用约定,而这些规范仅以 PDF 文档形式存在。
更糟的是,即便是 clang 和 gcc 这两大主流编译器,在处理 128 位整数等类型时也会产生不兼容的调用约定。C 作为协议的模糊性,已成为整个编程生态系统的技术债务。
核心概念及解读
Lingua Franca(通用语):C 已成为编程语言间的通用交流媒介,所有语言都必须学会说 C 才能相互通信。
FFI(外部函数接口):允许一种语言调用另一种语言编写的函数,是现代语言与 C 生态系统交互的桥梁。
ABI(应用二进制接口):定义函数调用约定、类型布局和寄存器使用规则,但 C 标准并未统一规定,导致跨平台、跨编译器的兼容性问题。
Target Triple(目标三元组):如 x86_64-pc-windows-gnu,精确指定架构、厂商和操作系统组合,每种组合可能有不同的 ABI 规则。
bindgen:Rust 生态中将 C 头文件转换为 Rust 绑定的工具,但本质上依赖 libclang 而非自行解析,印证了解析 C 的复杂性。
原文信息
| 字段 | 内容 |
|---|---|
| 原文 | C Isnt A Programming Language Anymore - Faultlore |
| 作者 | Aria Desires |
| 发表日期 | 2022-03-16 |
此摘要卡片由 AI 自动生成