avatar

目录
我所了解的编程

我差不多已经忘了是什么时候第一次见到计算机的了,最早可确认的记录应该是在中班的时候,大概5岁漂泊在上海时购买的,不过印象里我对那台电脑并不好奇。
受制于许多原因,那台电脑并没有联网,所以那台电脑于我而言也并没有多少吸引力,真正让我充满渴望的还是厂里那台能玩摩尔庄园的电脑,正所谓小别胜新婚,常年不能网上冲浪的我摸到它第一个想的肯定不是学习……
让我真正把视线透过浏览器上的小火猴而直面机箱里流动的一切的是一篇科幻小说,2008年科幻世界上长铗所著的小说《屠龙之技》,当然我是几年之后才读到它的。不过很遗憾这并未能第一时间在我心中产生太多的波澜,我只是知道了图灵机,还有Lisp

读到屠龙之技的那个下午就像肥皂泡一样飘走了,我的时光也就一直这么一去不复返。但是高中时的夜来幽梦,将那个肥皂泡吹回我的眼前,“噗”。
不过作为接触不到网络的高中生,我获取知识的途径窄的可怜,兼之又有中二患者的奇妙信仰,我选择了汇编作为筑道之基。王爽的《汇编语言》本就不厚,我很快就面临了第一次冲击,我至今难忘那个读到函数调用约定的夜晚,我先前疑惑的存在意义不明的各种寄存器与指令都有了解答,我第一次窥见了编程作为无数人搭建乌托邦的工具是如何榫卯一般契合。
高中毕业之后预定了成为程序员的我这时大概才算真正开始学习如何编程,我趁着暑假学了C语言与Common Lisp,前者作为汇编的高级抽象带给了我许多新奇的体验,指针这一概念也是颇为怡人。相比之下,后者没能给我过多启示,我没能看清楚为什么这是号称最接近神的语言。

我所了解的编程全面开花大概是在大二上,那时我ACM失利,整个人自闭的跟水獭一样,从此AWA。这时我同时走上了两条互相隔了一个世界的道路,PWN与λ。
我选择打PWN的理由很简单,C0ss4ck一直喊我去打CTF,说是缺个逆向手,我AWA之后也有些闲的发慌,就答应了。但是逆向总是和我想的不太一样,我要做的往往不是研究一个程序的核心代码,而是想办法把核心代码找出来,各种各样的工具实在让我心烦,这时我了解了PWN。
是的,我开始认识到这是我想做的,我渴望着了解裸机始尔的一切细节,程序如何运行?操作系统如何运转?这些在我打PWN之后的一年里陆续得到了解决。
另一条路则是λ,我无意中看到了Y组合子与丘奇编码,这同样让我感到惊叹,我开始认识到我在Common Lisp里遗漏了多少东西。接着我看了两本书,第一本是SICP,第二本则是《计算的本质》。函数式的震撼先不说,来自神之语言的春雷是“一切皆数据”。我在知乎上看到过这样一个问题,冯诺依曼架构计算机和另一个叫啥忘掉总之代码和数据分开的结构孰优孰劣,许多人说冯诺依曼架构较劣,但我不这么认为,这两条南辕北辙的路在最核心的地方相同了,PWN手写了一段ShellCode,接着把它变成了代码;Lisp巫师写了一个列表,接着用eval得到了它的值。这是多么美妙!
如果λ是道,而二进制的奔腾是器,那么将形而上与形而下大一统的Rust,就是我所了解的编程的全部了,所以本文是写给Rust的情书。Rust是一门过度耀眼的语言,我第一次看到了现代语言的飘逸,同时也让我一点点了解了开发的点点滴滴。
但是很不幸,写Rust找不到工作,于是我退而求其次,重新拾起了C++。C++好吗?没有人能精通C++,就是这样,C++提供的抽象能力让我叹为观止,尤其是C++17添加的std::optional和std::variant,“很会抄嘛老东西.jpg”。
那么我这一路都学到了些什么呢?我突然有些说不上来,我在过多的方向上反复横跳,但他们都是编程,他们各自有着不同的意义,那么编程的意义在哪里?

我暂时看不清未来,但我总想试试屠龙之技。
T.B.C