[博客翻译]任何足够先进的技术都与魔法无异


原文地址:https://pthorpe92.dev/programming/magic/


任何足够先进的技术都与魔法无异。——阿瑟·C·克拉克

这句话不仅适用于非技术人员,同样也适用于开发者,有时甚至更为贴切。我回想起自己在编程之旅的初期(无论是18年前第一次学习编程,还是大约15年后再次开始),导致所谓的“教程地狱”(我个人很讨厌教程,总是选择尝试自己动手构建东西,并认为这正是我取得相对成功的很大原因)的那种感觉。

情况是这样的:

你觉得已经完全掌握了如何正确使用锤子、砌砖、安装石膏板以及如何用锯子测量并切割木梁的方法,但当你看到建筑物和建筑结构时,仍然觉得那些你已经学会的工具竟然被用来建造这些宏伟建筑是一件非常不可思议的事情。你不知道从何开始,只能盯着手里的工具、材料,怀疑他们是不是有某种特别的设备或秘而不宣的知识。你无法理解他人是如何用这些同样的工具达到那样的结果,甚至无法想象应该如何切割第一块木板或铺设第一块砖。

许多人都知道,这就是学习编程的感受,完全掌握了循环、变量、数据结构、树、栈、链表、数组、控制流等概念后,看着编译器、视频游戏、操作系统或Web浏览器时会感到“是啊,怎么可能……”。这些开发者一定都是从小就开始用C语言和x86汇编编程,并且都在斯坦福大学学到了Kern Thompson传授下来的秘密知识,由Brian Kernighan本人亲自教导。

假设你不走严格遵循JS框架和vercel用户的路线:随着时间的推移,你会逐渐发现一些模式。你通过“转到定义”查看你使用的库中的方法实现,并构建了足够的辅助项目,观看了大量的“tsoding daily”、“sphaerophoria” 和“awesomekling”,逐渐解除了网络协议、图像/视频编码或系统调用/文件输入输出操作的一些神秘面纱。如果你现在需要写一个shell或Lisp解释器,你至少会知道首先需要把源文件读到内存中,并将其拆分成标记,再试图解析它以构建所需的语法树,这样你才能遍历并分析它,最后逐步执行代码。之前你觉得理所当然的事情,在此刻感觉就像是一种只有前述编程精英才能掌握的魔法。

我相信我不是唯一有这种感受的人,在揭开每个看起来像“魔法”的面纱时,都会产生这样的想法:

噢哦哦,原来是这样啊。当然,那还能怎么弄呢?真不敢相信我居然没能看出这一点。

随着时间的推移,遇到难以理解的问题越来越少,即使是粗略地从高层次角度去解析,也能对实现的大致情况有一个基本的认识。虽然我不敢说我了解内核内部细节、3D渲染或GPU驱动的工作原理,但大多数事情已经失去了那种模糊的神秘感,变成了我可以充满兴趣去了解的东西,而不是一种令人生畏的禁忌知识。不过对于那些领域来说,这也许是确实如此吧;)

前几天,在管理不同环境/k8s集群工作了一天之后,我习惯性地逛了下Hacker News。我遇到了一篇提及Go的comptime功能的文章,并附链接到github仓库。立即引起了我的注意。虽然我自己并没有使用Zig编写过程序,Andrew Kelly是我敬仰的一位编程偶像,我确实一直关注Zig的发展。Comptime是Zig最令人羡慕的语言特性之一。虽然其他语言通过元编程或constexpr可以实现类似功能,但Zig的直接过程式方法/API使其格外独特并受到称