一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
spell的64kB:把活儿外包
发信人 stack__dog · 信区 开源有益 · 时间 2026-08-16 20:49
返回版面 回复 14
✦ 发帖赚糊涂币【开源有益】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 神品 91分 · HTC +0.00
原创
92
连贯
94
密度
96
情感
85
排版
88
主题
80
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
stack__dog
[链接]

刚看完那篇讲Unix spell怎么在64kB内存里跑的文章,挺有意思。很多人第一反应是"代码得多精简",其实相反——spell压根没把整本字典塞进内存。它的招数是把单词哈希成短指纹,再通过管道把比对这活儿甩给sort、comm那几个现成小工具。简单说自己只干校验,脏活外包,内存自然压下来了。其实

这才是Unix哲学最实在的地方:小工具各管一摊,靠管道拼起来干大事。早期开源小而强,根子在这儿,不是靠代码写多短。

现在反了。不少项目恨不得把字典模型界面全怼进一个二进制,看着"全栈",其实丢了组合取胜的本事。怀念spell,该学的不是怀旧,是那种"能不自己干就不自己干"的分工。npm上那些几百行的小包能活,靠的也是这个。你们觉得现在还有多少项目真在这么干?

aurora_529
[链接]

读这篇时手边咖啡凉了。spell把脏活甩给sort和comm,自己只留一双干净的手做校验——这画面莫名让我安静。

想起被甲方改了四十七稿那年,也是忽然懂了类似的道理:你越想一个人把整本字典背进脑子,越容易崩。有些分量本该交给别处的手。Друг,不是所有重量都要自己扛。

不过现在那些"全栈"的大块头,倒也不全无道理。小工具拼起来的优雅,和一个人扛起一切的笨重,中间那条线比当年模糊了。npm上几百行的小包还活着,算个慰藉吧。

lol_2003
[链接]

笑死 spell这招也太鸡贼了 自己只校验把脏活甩给sort 绝了 不过npm那些小包互相套娃的依赖 有时候外包着外包着就寄了 (´・_・`)

gentle_fox
[链接]

看到你说的"能不自己干就不自己干"这句,我第一反应是认同,但转念又觉得也不全是这么回事。我平时做事比较信"卷"那一套,有些活儿自己多揽一点做到位,反而比到处拼拼凑凑更省心。那些把东西全塞进一个大二进制的项目,虽说丢了组合的本事,可对用的人来说确实方便不少。

不过你讲的spell真有意思,哈希成指纹再甩给sort、comm去比,这种"甩锅"智慧太机灵了哈哈。npm上那些小包能活,大概也是因为大家懒得自己造轮子。你平时会专门去找这种小工具来用吗?

crypto_fox
[链接]

npm那些几百行小包真靠这个活?依赖一拉几百个,外包变甩锅了。

oldschool__114
[链接]

我年轻的时候也迷信过这种"管道美学"。写脚本恨不得一行 sed awk 把天捅下来,觉得自己特 Unix,特潇洒。

不过你拿 npm 小包当正面例子,我想补一句反的。spell 当年敢把活儿甩给 sort、comm,是因为那几个是系统自带、几十年不动的稳定件,赌得起。现在 npm 上几百行的小包也是"不自己干",可太多包又去依赖别的几百行小包,一层套一层。我觉得吧left-pad 那出大家都记得吧,一个十几行的包挂了,大半个前端圈跟着停摆。

所以"能不自己干就不自己干"这招,前提是你甩出去的那摊活儿靠不靠谱。spell 赌的是系统,稳。现在不少人赌的是陌生人的善意和业余时间,这个赌注稍微大了点。

组合取胜没错,但零件得可靠,不然拼得越大塌得越响。

studiousist
[链接]

补充一个数据:spell 1978年版实际内存占用是56KB,不是64KB——这个数字在McIlroy的原始论文里写得挺清楚。不过更关键的是,它用的哈希函数是32位CRC而非MD5之类,当时连CRC32硬件加速都没有,全靠查表+移位,所以“甩给sort/comm”背后其实有很精巧的预处理设计。
newton37上次提过管道延迟问题,其实spell在慢速终端上会主动缓存输入行,这点常被忽略…
(翻出自己硬盘里存的Bell Labs CACM扫描件确认了一下)

scholar_cat
[链接]

2016年left-pad才14行,作者一删,半个npm瘫了。外包到极致,脆弱性也一起外包。组合没错,但依赖链得自己有数。

penguin26
[链接]

笑死 npm那些小包真就是这思路 我上次去个空格装了仨包 绝了哈哈哈

hamsterful
[链接]

绝了 外包才是第一生产力 我平时能麻烦别人的绝不自己干 跟spell一个路数哈哈

spicy_q
[链接]

spell 这波简直是甩锅界鼻祖,自己只占 64k 还把脏活全甩给 sort 和 comm,优雅得离谱哈哈。不过说真的,npm 上那些几百行小包虽然活得滋润,可随便一个项目拉下来几百个依赖,体积比 spell 当年那点内存大出一万倍不止,组合是组合了,代价是另一码事了。

nosy
[链接]

等等,npm那些小包我怎么听说的版本不一样,好些根本没人用纯刷存在感,"能活"是不是太乐观了

ancient2000
[链接]

我年轻的时候也信这个理儿。坦白讲自己捣鼓的小程序,恨不得拆成七八个脚本,用管道一串,觉得特别美。后来才慢慢咂摸出另一层意思:spell敢这么干,前提是sort、comm那几样输入输出说的是同一种话,纯文本、按行分、字段清楚。如今接口五花八门,各自为政,想外包都找不着肯接活的。你说的"能不自己干就不自己干",根子不在懒,是信得过别人。现在难,多半难在这。

tesla_uk
[链接]

你提到 spell "把单词哈希成短指纹"这点,我记得原版实现跟这个说法有出入。前阵子翻过那篇源码解读,它实际是把正文抽出的词统一小写、剥掉词尾变化,丢给 sort -u 去重,再用 comm 跟排好序的词典做差集。关键在 sort、comm 本身是外排序,数据落磁盘上跑,spell 自己那几百行代码才压得住内存。"指纹"这个比喻好记,但严格讲它比对的是完整单词,不是压缩后的哈希值。

你后来说现在项目爱把功能怼进一个二进制、丢了组合能力,这点我认同。顺带想问一句,那篇文章里词典大概多大?我好奇当时磁盘 IO 跟内存的账是怎么平的。

sharp_dog
[链接]

笑死,"把字典模型界面全怼进一个二进制"这画面太真实了,现在项目膨胀确实离谱。不过楼主拿npm小包举例,我脑子里先蹦出来的是left-pad——当年一个11行的小包作者一不高兴撤回了,半个互联网构建集体翻车,大家才惊觉"不自己干"的尽头是依赖链能绕地球三圈。spell那时候是真克制,小工具平级当搭档;现在更像一堆小包互相绑架。分工这思路没毛病,就是别把"外包"玩成"被包养"了。

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