那本改变了我开发生涯的书现在有了 JavaScript 版本。
从 BASIC 和 C 语言入门的青少年黑客……
我十几岁的时候,经常用 QBasic、汇编语言和 C 语言编程。我玩得非常开心:我坐在电脑前,却创造出了属于自己的世界。
在 QBasic 中,你可以编写程序,运行它,然后立即开始体验(我主要写的是游戏)。因为我们只有一台非常老旧的 DOS 电脑,没有显卡和硬盘,所以我唯一能用的其他编程工具就是一个叫 debug.com 的程序,它允许你操作程序内存,并输入你自己的汇编代码(汇编工作必须自己完成)。那真是痛苦不堪,但我从中了解了 CPU 的工作原理。这也让我发誓再也不把汇编代码翻译成二进制代码了。
当我买得起一台旧的二手奔腾 133 MHz 电脑后,我安装了 Linux 系统并开始学习 C 语言。我想成为一名黑客,在 IRC 上的用户名是 sp0k3 l1k3 th1s,学习编译器、操作系统和内存布局的过程非常有趣。
致有志成为函数式程序员的你……
但在2000年代初期,一次在IRC上的偶然相遇改变了我的开发生涯。一位德国程序员(如果你看到这段话,你好啊,forcer!)推荐我读一本名为《符号程序的构造和解释》(Structure and Interpretation of Symbolic Programs)的书,作者是Abelson、Sussman和Sussman。这本书可以在网上免费获取。它既枯燥又正式,但同时也非常实用,因为每个代码示例都能立即运行。我立刻投入其中,几周后就搭建了一个烦人的IRC机器人来管理我的频道。后来,我在网上找到了一些非常清晰的讲解视频,现在可以在麻省理工学院的YouTube频道上找到。
从 lambda 函数到虚拟机和编译器
本书使用一种名为Scheme的极简语言,引导读者从最简单的数学概念入手构建程序:抽象、求值规则、将小函数组合成大函数。它完全用函数实现,并教会读者如何组合和操作函数。对于从小接触 JavaScript 的人来说,这或许显而易见;但对于一个来自 C 语言的人来说,函数本质上就是一个可以返回值的 goto 语句,因此这绝对是颠覆性的。
第二章就变得非常有趣了,你可以构建各种数学算法。谁能想到,很多微分和积分运算实际上就是对一个相当简单的数据结构进行操作!我以前用的是C语言,连用数组都觉得麻烦又危险,所以这种用函数来实现数据结构的概念简直让我脑洞大开。突然间,代码就是数据,数据就是代码。
到了第三章,你就能用 Scheme 这种极简的函数式语言实现有状态结构、数字电路模拟器、无限惰性流,并在符号层面处理并发问题。第四章,也是我一开始遇到的最大难题,它彻底改变了我的思维方式:你用 Scheme 实现了一个 Scheme 解释器。然后,你用各种有趣的方式操作这个解释器:概率计算、逻辑编程、惰性求值。它向你展示了这些概念实际实现起来有多么容易,以及实践才是学习它们运作原理的最佳途径。这为我打开了一个全新的世界。读完这一章后,我不再畏惧构建自己的语言、编译器、符号程序操作和代码生成。我知道,我可以回到一个非常优雅的基础之上。
在第五章中,你将实现所有这些努力的最终成果:构建虚拟机、垃圾回收器、高效的机器优化解释器,以及最终的 Scheme 编译器。仅用一本书的时间,你就从看似简单的函数构建到了包含编译器和垃圾回收器的完整虚拟机。
这本书改变了我的职业生涯
在精彩的前言中,盖伊·斯蒂尔(Guy Steele)讲述了编程语言的历史,以及JavaScript是如何站在巨人的肩膀上发展起来的。我对此深表赞同。时至今日,在我所有的Web开发工作中,我仍然会在内心深处用Scheme和抽象函数的方式思考。
现在,我不再害怕在混乱的 PHP 代码中编写函数式代码。我也不再害怕将编译器理论、领域特定语言 (DSL)、解释器和虚拟机等概念融入到日常工作中,因为我知道它们可以用多么简洁优雅的方式表达出来。这让我有信心去挑战像 Haskell 这样令人生畏的语言,像 Elm 这样更具实验性的语言,或是像形式化定理证明这样深奥的主题。它让我更深入地了解了许多现代框架的内部运作机制,尤其是 React,它借鉴了大量函数式编程以及本书探讨的概念。
读完这本书后,我成为了一名 Common Lisp Web 开发人员,并编写了最早的 JavaScript 转译器之一。我和我的同事 Hans Hübner 一起,凭借他极具前瞻性的想法(他在 2000 年代初期就开始编写单页应用程序),共同开发了BKNR Web 框架和数据库。我们仅凭两名程序员,就构建了自己的 Web 服务器、数据库、前端框架、XML 导入/导出功能、模板语言、约束驱动的图形布局等等。
我曾为Z80 CPU编写过自己的优化汇编器,我们用它来控制一个语音合成芯片。后来,我又编写了自己的 CAD/CAM 软件来控制 CNC 铣床,自动生成电子电路的前面板。我还写过一个算法电影编辑器(那玩意儿简直一团糟……)。之后,我放弃了 Common Lisp,转而使用更贴近实际的底层 C++、PHP 和 JavaScript,但我从未放弃 Scheme 和函数式编程。直到今天,它们仍然影响着我所做的一切,而且我知道总有一天我会回归它们。
如果没有认真学习《计算机程序的构造和解释》(SICP),这一切都不会发生。
它让我真正领略到编程之美,以及理解精妙的基本原理有多么重要。
现在它也支持 Javascript 了!
在互联网变成如今这般混乱不堪的大漩涡之前,入门 Scheme 语言相当容易(好吧,可以说是非常容易了)。你只需要安装 guile 和 emacs,就可以开始使用了。
如今,我们甚至不再需要这些了。我们浏览器里就拥有如此美妙的编程环境,而 JavaScript 语言能够让你轻松地操控函数。因此,一本探讨编程核心理念、阐述函数之美及其强大功能的书籍,如今也提供了 JavaScript 示例,并且所有示例都可以在其网站上免费获取,也就不足为奇了。
在某种程度上,我怀念 Scheme 的优雅语法,但我相信,转向 Javascript 将有助于把这本精彩的书带给广泛、充满活力、多元化的 Javascript 开发者社区。
还在等什么!打开你的编辑器,访问SICP JS,改变你的人生!
你呢?
有没有哪些书改变了你的职业生涯?你的思维方式是函数式的,但写作风格是命令式的吗?你花了多长时间才理解元循环器求值器?你认为你能用几个函数实现一个垃圾回收器吗?
文章来源:https://dev.to/wesen/the-book-that-changed-my-development-career-now-has-a-javascript-version-33hi



