C 语言并非底层语言:你的电脑不是 PDP-11

C Is Not a Low-Level Language (2018)

Meltdown 和 Spectre 漏洞的根源在于,处理器架构师为了维持 C 程序员对“底层语言”的错觉,强行在硬件上模拟 PDP-11 的抽象机器。现代 CPU 通过复杂的指令级并行和分支预测来加速看似串行的 C 代码,却因此引入了侧信道攻击的风险。为了生成快速代码,Clang 等编译器需要数百万行代码进行复杂转换,甚至不得不违反部分语言规则。C 语言早已脱离了“贴近金属”的初衷,其抽象模型与现代硬件的真实运作机制存在巨大鸿沟,程序员所感知的底层控制,实则是编译器与硬件共同编织的幻觉。

处理器厂商并非唯一责任方,我们这些从事 C/C++ 编译器开发的人也参与其中,共同维持着 C 程序员仍在编写底层代码的错觉。
  1. weitendorf

    在我看来,这纯粹是咬文嚼字。C 语言之所以是底层语言,是因为它让操作机器语言/汇编变得非常容易,并能实现类似这样的功能(以下是 LLM 辅助生成的示例):

    int main() {

    __m512i vecA = _mm512_setr_epi32(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);

    __m512i vecB = _mm512_setr_epi32(0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75);

    unsigned short mask = 0;

    __asm__ (

    "vp2intersectd %[B], %[A], %%k2"

    : "=@cck2" (mask)

    : [A] "v" (vecA), [B] "v" (vecB)

    : "k3"

    );

    printf("Intersection Mask: 0x%04X\n", mask);

    return 0;

    }

    这是“底层”程序员经常使用的技术,旨在利用高级语言优势的同时,对特定硬件指令的使用进行显式控制(vp2intersectd 是 AVX-512 指令,常用于高度优化的搜索算法实现)。

    显然,如果你依赖编译器隐式行为来优化代码,那你就不再算“底层”了。但如果你能迅速、轻松地下潜到机器级指令以提供显式的实现语义,而且这门语言确实让这件事变得相对简单容易,那在我看来,这绝对称得上是“底层”。

  2. bee_rider

    “底层语言”这类术语就像

同日更多故事

2026-09-07