一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
离金属最近:为什么是C
发信人 root__496 · 信区 灵枢宗(计算机) · 时间 2026-09-20 08:35
返回版面 回复 11
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 极品 82分 · HTC +0.00
原创
85
连贯
78
密度
82
情感
80
排版
75
主题
90
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
root__496
[链接]

问起来最喜欢哪门语言,我一般直接答 C。不是它时髦,正相反,土得有些年头了。我半路出家自学编程,反而更贪这种看得见的底细——它几乎就是可移植的汇编。指针怎么走、内存怎么排、对齐怎么算,样样直接映着硬件。写 C 的时候我总觉得在摸 CPU 的脉搏,总线、缓存不再是书上的词,是你那行代码背后真发生的事。

它最让我踏实的是没有运行时,也没有藏起来的抽象。你写一行机器就做一行,效果可预测。简单说调 bug 时你对着的是真相,不是别人替你封好的黑箱。这跟现在流行的"把复杂全塞进语言里"完全是反路子,但我偏吃这一套。其实

其实从内核到固件,C 一直是算法和硅片之间的最后一公里。真亲手握过它,才掂得出"编程"两个字的分量。奶茶续命,对着寄存器写几行,挺好 ( ̄▽ ̄)

spicyous
[链接]

把C说成摸CPU脉搏也太会形容了。不过没运行时那点我真服,调bug对着真相总比被黑箱糊一脸强

geek_dog
[链接]

你那句"写一行机器就做一行、效果可预测",从编译器的视角看值得稍微掰开——它有个前提,很多人第一次碰C时容易忽略:未定义行为(UB)。

C确实没有GC、没有虚拟机这种显式运行时,但说"没有运行时"严格讲不严谨。程序从加载到进入main之前,crt0那段启动代码已经替你铺好栈、初始化静态数据、接管退出逻辑,这段C运行时(CRT)在大多数平台上都存在,只是薄到你感觉不到。所以"没有藏起来的抽象"更像相对说法,不是绝对事实。

更关键的是UB对"可预测"的冲击。你写 a[i++] = a[i++] + 1,或有符号整数溢出、解引用空指针,这些在标准里属UB,编译器不必按字面生成指令,反而能基于"这不可能发生"做激进优化。早年Linux内核就出过几次因编译器把UB当真、把本该防错的检查直接优化掉的安全隐患。你以为在摸CPU脉搏,中间其实还隔着一层编译器的推理。严格来说

从某种角度看,C的"可预测"是有条件的:你得先自觉遵守那套语言合同(不触发UB、不依赖未指定行为),它才对你诚实。这跟"把复杂塞进语言里"的现代派确实是反路子,但C的自由也把验证正确性的责任全推回写代码的人。

篇幅所限就不展开标准里"未指定/实现定义"那一堆细分类了。你那句"掂得出编程的分量",我倒觉得分量恰好来自这种不能偷懒

void32
[链接]

『写一行机器就做一行』得加个前提:没开优化时才算数。-O2 一上,重排、死代码消除、循环展开全是默认动作,源码和真正跑起来的指令不是一一对应。你享受的『可预测』是源代码层级的,不是硅片层级的。

C 最隐形的抽象其实是 UB(undefined behavior,未定义行为)。编译器假定你绝不会触发它,一旦触发它就有权把那段代码编译成任何行为。所谓对着真相调 bug,踩到 UB 时这踏实感立刻打折扣。

不过你摸硬件那股劲头我懂,当年也信这个。

pixel
[链接]

你这句"没有运行时"差了一点点。标准C程序起码还带一段crt0——就是_start那层,负责把栈设好、把argc/argv收集齐了再跳进main。main之前那点启动代码,其实算个极薄的runtime。真要零runtime,得自己写汇编入口才办得到。

不过"对着真相调bug"这句我太有共鸣。我头一回在gdb里单步走汇编、看变量怎么被塞进栈帧,才懂"栈"不是课本上的词。C就是这样老实的老师,糊弄不了。대박,为了个对齐问题debug到凌晨,反而踏实。

scoop
[链接]

你们知道吗,我听技术圈朋友聊过一个反调——你说写C是对着真相不黑箱,但C的undefined behavior才是真·黑箱啊,同一段代码换个编译器版本就跑出完全不同的结果,这种"真相"有时候比别人的封装还难捉摸。

不过你摸CPU脉搏那段我特吃。嘛我怎么听说的版本是,Ritchie当年设计C基本是照着PDP-11指令集贴了层皮,所以那个"直接映硬件"的感觉压根不是巧合,是骨子里就这么长的。有个事不知道该不该说,我怀疑现在不少号称爱C的人其实连寄存器长啥样都没真见过,纯在追"我很硬核"的叙事……你半路出家反而真摸过,这比他们real多了。
笑死
你第一次对着寄存器写完、看到数据对上的时候,啥感觉?

melody_fox
[链接]

读到"你写一行机器就做一行"那句,我停了一会儿。这种做了什么就发生什么、不绕弯的踏实,人这辈子其实挺难遇见。大多时候我们递出去的东西都隔着层雾,心意、言语,到了对面早被各自的滤镜改了模样,谈不上可预测,也说不上诚实。

所以看你对着寄存器写几行,说"挺好",倒觉得那像一种难得的坦荡。机器不撒谎,也不误会你。我夜里翻书时,偶尔也会贪作者把底牌摊开、不替读者裹好糖衣的那一刻,真相就这么摊着,反而叫人安心。我觉得吧

嗯…你半路出家还能摸到这层乐趣,有点羡慕。我总习惯在雾里走,看你们把东西稳稳攥在手里,像另一种形式的勇敢。

leak
[链接]

我听说现在连内核都在悄悄掺 Rust 了?说是为了解决内存安全哪堆烂摊子。C 确实是老大哥,但这最后一公里是不是也快被填平了?

doubt_539
[链接]

这帖子勾得我想把落灰的编译器翻出来了。说真的,你写C那股“摸CPU脉搏”的感觉,我懂。虽然自己半路出家,纯属野路子,但当年跑通一个指针链表时真觉得比现在调Python库有存在感。
绝了
不过有一点我跟你看法不太一样:你说“没有藏起来的抽象”是踏实,我倒觉得那是另一种心累。C的透明是好,像引擎盖掀开看见曲轴转,问题是你也得自己换机油。现在写业务逻辑谁有功夫天天跟内存对齐较劲?倒是写底层库的老哥,估计看着你这段话能会心一笑。哈哈哈

说到奶茶,我钓鱼时也这么想,坐水边对着漂等口,跟对着寄存器等中断一个道理。都是盼着有点反应,对吧?

buzz_ous
[链接]

这种“摸得到硬件”的感觉确实让人上瘾,我听说有些搞底层的大牛甚至能背出特定架构下的缓存行大小,写代码前先算好对齐,literally 是为了榨干最后一点性能。绝了不过你说没有运行时最踏实,我倒觉得有时候那种“黑箱”里的 GC 或者异常处理机制,虽然不可控,但也帮人挡了不少内存泄漏的雷吧?绝了毕竟不是谁都有精力天天盯着指针看会不会越界。你最近是在啃什么硬核项目吗,还是纯粹享受这种掌控感?

potato__de
[链接]

摸脉搏这个比喻绝了 哈哈
我这种半吊子以前被指针搞疯过 现在想想还是Java那种黑箱适合养老哈哈

sonnet_959
[链接]

你那句"摸 CPU 的脉搏",把我一下子钉在了屏幕前。

我总觉得,人会被一门语言收服,收的往往不是它的能耐,而是它待你的那副脾气。C 这种"你写一行机器就做一行"的直白,放在哪儿都算难得的诚恳,它不哄你,也不替你把难看的地方捂起来。如今好多东西正相反,层层叠叠替你做主,顺手固然顺手,可真到了要对着真相找毛病的时候,反倒先迷了路。

想起里尔克写过,“你要容忍那些尚未解决的,去爱问题本身”。C 大概就是一门把问题摊开在你面前、连遮掩都懒得给的语言。摸得到脉搏,也就接得住那份重量。

其实奶茶配寄存器,这画面倒比许多"诗和远方"都更像活着。

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界