十行代码如何重塑了我的世界
Ten Lines of Code That Changed My World
从 BASIC 的 Hello World 到 JavaScript 的诡谲彩蛋,再到 6502 汇编的自修改代码,我整理了十段改变我编程认知的代码片段。它们有的让我捧腹大笑,有的让我彻夜难眠,有的则揭示了计算机最底层的运作逻辑。无论是 Windows 下的 touch.bat 脚本,还是 CSS 中仅用 280 字符实现的动画诗,亦或是那个能瞬间清空系统的 rm -rf / 玩笑,这些代码不仅记录了技术的演进,更承载了我从懵懂少年到资深开发者的成长记忆。每一行代码背后,都是对技术可能性的探索与敬畏。
机器语言是离硬件最近的操作,没有警告,没有日志,也没有安全护栏。
HN 评论区
36- dahart
BASIC 的 print+goto 循环可能也是我的第一个程序(在 80 年代),但对我来说有一件事是肯定的:它绝对不是“Hello, World”。我和其他人用各种愚蠢的东西、随机单词、笑话和幼稚的短语填满屏幕,不管是什么,但不知何故,“Hello, World!”是 C 语言特有的。我记得第一次看到它是在高中的 C 语言课上,然后在大学里更常看到。
我也记得 'poke' 指令。在 Atari 800 上,你可以 poke 内存来改变按键重复率和开始重复前的延迟,所以我们显然会把延迟调为零,把重复率调到最大(大概是每秒 60 个字符),这样任何试图打字的人都无法快速按键来避免重复。你必须重启机器才能修复,这对 11 岁的我来说太搞笑了。
和他的 'poke' 描述类似,但机制不同——在 IBM PC jr 上使用 debug.com 编辑 Ultimate III 的存档文件,给自己无限的钱和生命。
好时光!
- andsoitis
这里有 3 行代码,揭示了 Lisp 的一个深刻之处:代码可以制造出制造代码的代码:
———————
(defmacro twice (form)
`(progn ,form ,form))
(twice (print "Reality"))
———————
twice 并没有执行它的参数两次。它在执行前重写了程序本身,变成了:
(progn
(print "Reality")
(print "Reality"))
- probably_wrong
我一直在收集一些适合做成纹身的小代码片段,我必须说,其中一些可能会成为这个集合的绝佳补充。
我部分更倾向于 CSS 中的 "red" 而不是 "hotpink",但这只是我个人的偏好。
- tptacek
嗯。真是个棒的问题。
while(1) { fork(); }
这对我一定意味着什么,因为它曾出现在我的 Usenet 签名里。然后是:
exit(main(kfp->kargc, argv, environ));
来自 FreeBSD crt0;意识到 main() 下面还有更多 C 代码,对我来说是个大时刻。
接着是:
statements: /*E*/ | statement statements
Yacc 让我豁然开朗的那一刻;这行代码很深刻,但更准确的描述是,我意识到用解析器生成器做的事情其实就是构建一棵树,而每个产生式的副作用就是为了返回并插入树节点。
如果我能用一行代码来表达“当哈希表填满时将其大小加倍”,那它绝对值得在这里占一席之地。
然后,当然(我们可以作弊,因为汇编):
jmp .call
.pop: pop esi
...
.call: call .pop
“delta offset”技巧,我相信它源自 x86 病毒文化,但在 90 年代的溢出利用中非常普遍,作为一种获取对字符串和其他内存对象的位置无关引用的方法。
肯定有:
void walk(node *n) { if(!n) return; walk(n->left); visit(n); walk(n->right); }
我应该想个办法把 write-select(2) 塞进一行,因为那对我来说也是个“天哪”的时刻。
同样地:当 Vern Paxson 向我解释他通过简单地打开一个文件并使用 "seek" 将传入的数据段放置到正确位置来实现 TCP 重组时。我大概能把它精简成一行!但这会是一个……
- throw34889
对于调试 CSS,我更喜欢类似这样的东西:
* {
outline: 1px solid hotpink !important;
outline-offset: -1px !important;
}
因为在大多数情况下,上面的片段不会导致内容重排。
留给读者的练习是:将上述内容变成一个 JavaScript 书签栏切换器,并添加对边距和内边距着色的支持。