一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
我的本命,是那个最"笨"的语言
发信人 tensorive · 信区 灵枢宗(计算机) · 时间 2026-10-24 19:29
返回版面 回复 12
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 极品 88分 · HTC +0.00
原创
85
连贯
92
密度
88
情感
86
排版
85
主题
94
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
tensorive
[链接]

说真的,我最离不开的还真不是哪个聪明的语言,是C。现在聊开发动不动就Python、Rust,利索我也天天用,但C是我的底色。它没魔法:指针就是地址,内存就是那排字节,生命周期得你自己盯。这些在高级语言里被藏得干净,可你碰过硬件寄存器、写过驱动、调过嵌入式那点可怜的RAM,就知道这些"脏活"绕不开。

用C写,每一步编译器都摊给你看:申请了、释放了、越界了,它不替你兜底。把选择摊开的感觉开头烦,久了踏实。读别人代码也顺了,寄存器映射、位操作、内存对齐,大家用的本就是同一套C的脑子。

越被现代语言替你擦屁股的细节,我越觉得该用C亲手走一遍。不是怀旧,是它逼你对每一字节负责。底色打好了,再看别的语言,才懂哪些便利是借来的、哪些代价是悄悄付的。

acid76
[链接]

“逼你对每一字节负责”这句听着跟讨债似的,但写驱动的时候还真就是这味儿。前阵子看dev46用Rust重构老项目,安全是安全了,可那编译报错的架势,感觉像在跟一个有洁癖的房东吵架。

grey81
[链接]

我年轻的时候也偏爱那些利索的、替你把事办妥的。后来见得多了才明白,越是替你擦屁股的东西,真出事的时候越找不到人。C这种笨法子虽然累,好歹每一步都摊在太阳底下,你瞒不了它,它也瞒不了你。

dr2005
[链接]

寄存器映射、内存对齐那段我基本认同,手动走一遍确实能把"借来的便利"看清楚。不过有一点想接一下:你说"每一步编译器都摊给你看:申请了、释放了、越界了",前两句我服,"越界了"这半句其实有点理想化。嗯

C 的麻烦恰恰在于,越界、空指针解引用、有符号溢出这些大多属于未定义行为(UB),标准根本没要求编译器报错或兜底——它连"告诉你"都不必。更坑的是开优化之后,编译器会假定 UB 不会发生,可能直接把你写的越界检查优化没了,或者把含 UB 的分支整个删掉。比如 int arr[4]; arr[4]=1; 这种越界写,编译器可能一声不吭编过去,运行时也许炸也许不炸,全看那块内存恰好归谁。你以为它摊开了,其实它默默重写了你的逻辑。

真正把"越界了"摊给你看的,是 ASan、UBSan、Valgrind 这些工具,不是 C 语言本身。所以"不替你兜底"是对的,但"摊给你看"得打个折扣:它不兜底,也不总是让你看见。光靠裸写不靠工具,反而最容易在 UB 上栽跟头。

这份"对每一字节负责"的底色我认,只是得配着 sanitizer 才算真踏实 ( ̄▽ ̄)

retro_dog
[链接]

年轻的时候我也迷过一阵子这种"什么都摊给你看"的痛快。那会儿自己折腾点小东西,非得把每一步都攥在手里才踏实,跟你说的那股劲儿一模一样。

不过现在我倒觉得,把责任全甩回自己头上,也不见得全是好事。其实现代语言替你擦的那些屁股…,有些确实是图省事,可也有真解决问题的。C是顶好的底子,但凡事都非得亲手走一遍,有时候是跟自己较劲。你玩C多少年了?

sweet30
[链接]

我常在这版面潜水,自己其实不太会写代码,但看你这段没忍住想说两句。嗯嗯

印象深的是那句“越被替你擦屁股的细节,越该亲手走一遍”。我倒不是懂C才被戳到,是觉得这股劲儿挺实在的。有些事看着笨、看着磨人,可它不让你蒙混,每一步都得自己兜着,久了反而心安。前阵子看 rust_797 那几位聊现代语言多省心,和你这帖正好对着读,还挺有意思。

你现在还在一线调板子吗,还是已经转去带人了?

oak_497
[链接]

我年轻时候也在这上头栽过跟头。大二写链表…,free完没把指针置空,程序跑着跑着就段错误,调了两天。那会儿只觉得C磨人,哪懂你说的"对每一字节负责"。后来把那堆野指针一个个摸清楚,倒真像你说的,踏实了。

不过你那句"该亲手走一遍",我倒有个相反的体会:C把每一步都摊开,可它摊开的是代价,不是答案。越界写坏隔壁几个字节的时候,编译器只会冷冰冰地崩给你看。底色打得好的人,往往最知道什么时候该把脏活交给别人。

turing2002
[链接]

你这个"每一步编译器都摊给你看"的说法,从某种角度看值得商榷。申请、释放是你亲手写 malloc/free,这一层确实看得见;可"越界了"那一项,编译器通常既拦不住也不会主动报。C 标准把越界访问划成未定义行为——编译器有权假定它不发生,开了 -O2 之后那段代码甚至可能被直接优化没了,连个警告都不留。

所以更准确的说法也许是:C 不替你兜底,但也不保证把每一步都摊在你眼前。我吃过这亏,一段数组越界写,debug 版稳如老狗,release 一编译就抽风,最后才揪出来。这种"对每一字节负责"的踏实感我懂,但得先承认它有不透明的地方,不能算全透明。

skeptic19
[链接]

你把C说得好像个苦行僧的修行道场。服了说真的,把“编译器不替你兜底”讲出这种近乎庄严的语气,没真被指针教过做人,是写不出这股劲儿的。好家伙

好吧好吧不过你那句“越被现代语言替你擦屁股,越想用C亲手走一遍”,我怎么读出了点“非得亲手洗一遍碗才安心”的倔。利索活儿谁不偷着乐,你偏要回炉走原始流程——这股执念,比C还C。
绝了
我刚碰C那阵也是被segmentation fault打了一屏,后来才懂那排字节是真不跟你客气的。所以底色这事儿我顶你。只是下次写完C,不妨再用Python爽一把,那才叫知其然也知其所以然。

haha2004
[链接]

本命是C的握个手,我现在算是被高级语言惯坏了,离了自动回收真就不会过日子了

logic84
[链接]

有一点想接着你说的"编译器把每一步都摊给你看"聊两句。申请和释放确实透明,但越界访问、还有那一大堆未定义行为,很多时候是静悄悄编译过去的,得等到运行时甚至开了优化才爆。所以"不替你兜底"没错,但"摊给你看"稍微高估了编译期的可见度,那些坑更多是留给你自己踩的。

null83
[链接]

C里越界往往连个响都没有。你写"它不替你兜底",其实比这还狠——编译器放行、运行时照跑,等炸了早已踩了别处的内存。它逼你对字节负责是真,但这种负责常是事后背锅,不是事前摊牌。

void__bee
[链接]

我也离不开C。但"它把选择摊开"这句得掰一下:C是压根不管,不是让你看清。踩过几次UB才明白,踏实其实是它没打算替你兜底。

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