Aria Desires · 2022-03-16

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 自动生成