最近,再拜读了一下 Linux 之父林纳斯的自传《只是为了玩儿》。
本书借助林纳斯幽默的表达,让我们知道了他的生平,明白了 Linux 是怎么诞生的,以及他对开源、版权及财富的看法。如果没有林纳斯从小的积累,也不会创造出今天的 Linux,也就没有今天遍地开花的互联网产品。作为「祖师爷」,他的人生观、价值观也值得我们思考,如果你仔细读完这本书,你会发现他在书中不止一次引用到牛顿的名言「自己只是站在巨人的背上」,并且他的经历也再次印证了兴趣是最好的老师。
而让我感兴趣的时,他的第一行代码,也没有什么出奇之处,跟我们当初学习写代码一样,也是一句 「HELLO」。但是,林纳斯写他的第一行代码是在他十一、二岁的时候,也许那时的我们没几个知道计算机是什么?
你如果去看过 Linux 的源码,会发现他写代码的风格特别好,而且他还在 Linux 内核里面留下了不少彩蛋。比如你用 gdb 打开 kcore 虚拟文件,找到内核重启函数 SYSC_reboot,会发现很多有趣的东西,比如。
cmp DWORD PTR [ebp-0x114],0xfee1dead
这串比较指令用简洁的语言表达变量的真实用途。如果不feel dead,干嘛要重启呢?
cmp edi,0x28121969
这个常量其实是林纳斯的出生年月日。
cmp edi,0x5121996
这个常量便是他大女儿的出生年月日。
哈哈,是不是突然觉得 Linux 之父林纳斯是一个特别有趣的人。
......
最近,我在逛 Reddit 论坛,刚好也看到一条有意思的帖子「What is the first programming project you made?」。
我看了一下,其实国外的程序员也一样,第一行代码也多半是跟着教材,在控制台输出「hello world」。
有的读者可能会问,东哥,你当年敲下的第一行代码是什么?
我也一样,只是为了让计算机输出「hello world」,费了九牛二虎之力。由于我出身农村,上大学才第一次接触计算机,当时,连开关机都不会,也更别说打字了。。。
后来,跟着室友学会了开关机,练习打字。在第一次 C 语言上机课的时候,按照谭浩强老师的那本《C程序设计》教材在电脑屏幕上,本打算打印出「hello world」,而给我输出了「烫烫烫烫烫烫烫」。当年年少不更事,还当着那么多同学的面说,「这电脑也太不听话了」。
其实,网上还有一段打油诗,在这里与大家一起欣赏。
手持两把锟斤拷,
口中疾呼烫烫烫。
脚踏千朵屯屯屯,
笑看万物锘锘锘。
后来对计算机理解的深入了,也慢慢知道了为什么 VC 有时会输出「烫烫烫烫烫烫烫」,有时又输出「屯屯屯屯屯屯屯屯」。
其实很多初学者,跟我当初一样,并不知道其中的梗,这里统一说一下。
其实 「烫」和 「屯」都是按照 GBK 编码显示的结果,对应的十六进制分别为 0xcccc, 0xcdcd 。
由于微软 C\C++ 编译器在 debug 模式下,引入的一种内存保护机制,会给特定的内存赋一个特定的初值。会把未初始化的栈内存全部填成 0xcc,用字符串来看就是「烫烫烫烫烫烫烫」,未初始化的堆内存全部填成 0xcd,字符串看就是「屯屯屯屯屯屯屯屯」。
就在写这篇文章之前,我抱着试一试的态度,看看 Github 上面,有没有专门输出各种语言「hello world」的开源项目,还真有,被我给搜到了。
hello world 只能带我们入门,代码最终能写到什么水平,主要还是看你对代码有多大的兴趣!
最后,咱们来看看网上流传出的,雷布斯在 93 年写的汇编代码。
有没有发现大佬的注释写得详细,代码风格很好。
你还记得你曾经写下的第一行代码吗?
转发也是一种支持。
—————END—————
看更多好文
请长按下方图片扫码关注