穿越软件寒冬:探索虚拟机和极简计算系统

本文探讨了在资源受限环境下如何利用虚拟机、极简计算系统和复古硬件进行软件开发与数据保存,分享了从Smalltalk到Forth的多种技术方案及其实际应用。

weathering software winter

本文基于 Devine 在 2022 年 11 月 26 日的演讲记录整理而成。视频版本可在 YouTube 上观看。幻灯片演示使用 Adelie 制作。

感谢 Matt Mascarenhas 提供的自动转录文本,没有它我们可能需要很长时间才能整理出这段文字。

虽然我们很感激有机会进行这次演讲,但 2025 年的一次事件导致我们与主办该演讲的会议保持距离。以下是 Devine 解释情况的文字。

点击展开

2025 年 2 月。几个月前,Handmade Seattle 会议的与会者对 2024 年 11 月的会议表示不满,原因是会议转向包含涉及社会正义意识的演讲,并增加了更多元化的演讲者阵容,而牺牲了通常的“家伙们按正确顺序打包字节”的演讲。作为经常做这种演讲的人,我对此并无异议。

无论如何,会议组织者为演讲者选择不当道歉,称其不符合票务持有者的期望,承诺在次年解决问题,并顺便表示自由和开源软件开发者将不再被欢迎作为演讲者。

道歉信发出时,我碰巧在聊天室,只是质疑选择是否真的与缺乏低层演讲有关,而不是其他原因。很快,各种偏执者开始出现,哀悼会议的美好旧时光,聊天室很快充满了对跨性别者的恶意言论,这种情况持续了数小时无人干预,一如既往。

我没有预料到的是,会议组织者(几个月来一直对我置之不理)终于打破沉默,抨击我发声,并部分归咎于我导致会议组织瓦解,还决定不支付约定的差旅津贴。此后,我要求将演讲视频从他们的 YouTube 频道、Vimeo 和网站上移除。

转载自 xxiivv.com

Weathering Software Winter

我在一个名为 Hundred Rabbits 的小工作室工作,这是一个由两人组成的小型集体,在一艘小型太阳能帆船上运营。我们所有的设备都是捐赠或废弃的设备。我们的理念是,要制作快速的软件,你需要慢速的计算机,我们尽可能倡导这一点。我们花时间航行,并进行关于韧性的实验,涵盖计算机,但也涉及食品安全、保存和研究过去的技术,这些技术可以在危机时期使用。

我们七年前开始航行,穿越了整个太平洋。我们经过墨西哥、法属波利尼西亚、新西兰,向上经过斐济、日本,然后沿着俄罗斯海岸,擦过阿拉斯加,最后返回加拿大西部。我们原以为可以在航行中继续做艺术、音乐和视频游戏,但很快发现,我们理所当然拥有的所有技术都不是为离开西方世界而设计的。

从墨西哥出发的那一刻,我们所有的设备开始故障。在 2022 年 Handmade Seattle 的开幕演讲中,Abner 提到了 Roomba 开始故障的问题。如果你的 Roomba 故障,你可以拿起扫帚,但在帆船上,你依赖设备工作来确定位置、了解天气等。这些东西对你的生存有更直接的影响,而所有这些技术都建立在与 Roomba 相同的技术栈上。

许多我们以为可以依赖的工具都故障了,无论是 Apple 产品,还是需要订阅服务、DRM 等的软件。作为艺术家,你花时间开发技能,成为 Photoshop 插画师。当你的互联网连接失败,软件锁定时,你以为属于自己的技能实际上完全由他人拥有,并可以被剥夺。

尽管我们多年来一直为这类软件付费,但当你无法访问认证时,技能就消失了。我们没有预料到这一点,这让我们感到害怕。

如今,一切都建立在云上。2016 年初沿美国海岸航行时,我们会停靠会议,看看科技界的所有动态。我们会与展台的人交谈,他们会试图向我们推销产品,但我们不得不在他们说话中途打断,问:“它能离线工作吗?” 99% 的时候人们会说:“啊,不行,抱歉。它在云上。”

似乎没有人建造我们可以使用的东西。这是一个悲伤的认识。我热爱编程,有一段时间它似乎与我们的新生活方式完全不相容。

在我继续之前,我会描绘一下在远离西方世界海岸时尝试使用现代技术栈的情景。

想象两个人在热带的小帆船上,比如马克萨斯群岛或南太平洋的另一个岛屿。这些岛屿覆盖着美丽的茂密森林,需要雨水和阳光,仅此而已,然后是我们共享同一空间,忙着将智能手机装在密封袋中举到桅杆上,试图获得一格信号来更新 Xcode,当时是 11 GB。我们有一叠卡片,每张价值 2 GB 移动数据,但 Xcode 在下载失败时无法恢复。我们可以交换卡片的代码,如果我们在 10 秒内完成,它会检测到超时并继续。问题是,如果下载在 1600 前未完成,太阳落山,太阳能电池板不再充电,我们的笔记本电脑就会没电。下载到 7 GB,还有三个小时才能完成更新,它不会完成,我们将白白花费所有数据。

这不理想。我们尝试寻找替代方案…

我们注意到,我们过去编写的所有软件逐渐变得不可用。我们在蒙特利尔长大,许多朋友在 AAA 工作室如 Ubisoft 工作,制作免费游戏,构建寿命为三年的项目。我们过去在 Apple 栈、Electron 或 Unity3D 上制作的项目也有三到四年的寿命,但像 Super Mario 以及那个时代生产的其他游戏今天仍然可玩。我们正处于一个黑暗时代,游戏开发者和艺术家花多年时间构建的游戏很快变得无法播放。我们将再也无法在 PlayStation 上玩 Scott Pilgrim。

在网上,似乎其他人也有这些担忧。

在上图中是四种数字数据保存的哲学,它们都有缺陷。数据保存是一个相对较新的领域,我们不知道一百年后能恢复什么样的数据,但从我们看过的实验来看,情况并不乐观。BBC 有一个项目,他们试图模仿他们最持久的书籍之一,Domesday 书。它是由僧侣几百年前写的。BBC 的想法是,我们今天还有这本书,我们还能读它,我们有没有技术来制作类似的东西?是否可能记录我们今天的生活方式,让一千年后的人能看到我们如何生活?他们创建了 BBC Domesday,一个包含音乐、电影和科学论文的光盘。然后十年后,它变得不可读,人们忘记了如何解密和解编译光盘。似乎没有真正的方法来长期保存数据,因此我们决定尝试我们自己的小实验。

作为免责声明,我现在写的一切都非常天真。我画画和做音乐,当我开始研究时,我没有词汇来找到我想要的东西。我不知道虚拟机是什么,也不知道编译器是什么。我对编程有一个模糊的概念。我写过 Swift 和 Objective C,但不知道它如何与处理器实际联系。这就像我在学习一项服务,就像我在学习“用 Photoshop”一样。这不是学习技能,当你使用 Photoshop 时,你不是学习绘画,你学习在别人游乐场的限制内操作,当那个地毯被从你脚下拉走时,你无话可说或做,你从未真正理解它是如何工作的,因此你无法真正复制它。

我们最终偶然发现了“虚拟机”这个词。有了 Super Mario brothers NES 文件,我知道我可以把它放在计算机上运行,我可以在手机上运行它,我可以在旧计算机上运行它,我可以在 Super Nintendo 上运行它,我也可以在 Nintendo 64 上运行 Super Nintendo 模拟器运行 Mario。这似乎是一种保存数据的好方法。我们决定不完全放弃软件,并看看在虚拟机领域可以做什么。

硬件非常便宜,因为它正在用电子垃圾覆盖世界,所有这些都可以免费获取。每个人抽屉里都装满了旧设备,Super Nintendo、Playstation、Dreamcast,所有这些都被认为是过时的,人们停止为它们开发游戏,但我们认为我们可以给这些设备第二次生命。在研究如何做到这一点时,它带我们去了有趣的地方。我们变得有兴趣看看如何重新利用旧电子产品。似乎没有任何竞争。如果你做和其他人一样的事情,你就在与所有人竞争。例如,如果制作 iOS 10 软件,市场完全饱和,但如果你今天发布 Atari 游戏,它会很大。没有人再给这些设备赋予目的。我们尝试做一些完全左 field 的事情。首先,我们的目标是尝试为 NintendoDS 制作游戏。

所以从外部看虚拟机,没有学术背景,你首先找到的是 JVM。我从未写过任何 Java,但我会到处告诉我的程序员朋友,“我要做 JVM!这似乎能解决我们的问题!”他们的回应是 JVM 如此碎片化,这不是我们想要的。我们找到了很多学术论文,但没有为它们编写的软件。

我涉足 Java 生态系统,但我无法理解它。

我知道我们想制作有趣的小项目,可以在各种设备上运行,在一个不是 Electron 的跨平台上。与其总是针对新的现代事物,我们认为我们可以制作一个虚拟机或其他东西,可以运行到越来越远的过去。

外面有数量惊人的快速计算机。第一次制作 NES 游戏时,我惊讶于我可以在屏幕上以 60 fps 绘制多少东西。我 somehow 被说服现代技术更好、更快,所有八位的东西都是已解决的问题,我认为我们已经完全探索了这个问题的空间。

似乎不是这样。过去有很多被遗忘的想法,我把它作为我的使命来探索这一点。那是 COVID 时期,每个人都被限制在家里,是弄清楚计算机如何工作的完美时间。我们将回顾过去,看看人们是如何做到的,以及哪些想法被遗忘了。

有一段时间计算机非常有趣,但现在它们感觉冰冷,并被武器化对抗人们。你在 Microsoft Bob 中找到的那种趣味性,我今天真的找不到类似的东西。我可以想象如果今天制作 Microsoft Bob 会是什么样子,它会试图卖给你各种垃圾。我认为我们作为一个社会,没有一种系统可以培养像这样有趣的事物的创造。

我在做这样的事情时的一个认识是,定制你的硬件和软件让你关心。

如果你买现成的东西,比如 iPhone,你不能改变它,你不太可能关心它,它最终会躺在抽屉里。那时你可以去 Radio Shack 为你的计算机买零件,可以定制它(例如 Altair),然后你可以完全了解它。被定制或几乎从零构建的设备仍然被喜爱,但至于你的旧 iPhone6,你不知道它在哪里,即使你知道,它可能也无法使用。像 iPhone6 这样的设备无法修复,它们被设计以难以理解的方式故障。

与其试图使事物尽可能广泛 accessible,我们认为我们可以尝试看看如果我们为 just one person 设计它能做什么,一种不是为了扩展而设计的个人计算。

我能看到像 Rust 这样的语言的吸引力,我不会学习它,但如果你相信你可以用计算机解决问题,那么显然这对你无关紧要。我认为如果你被迫使用计算机,它不可能有趣。有一位作家说:“如果你被迫玩,你就不能玩。”

我没有智能手机。在西雅图走路时,我看到街上到处都是 lime 滑板车,要看到菜单被允许使用滑板车,你需要扫描 QR 码。有一层现实被强加于人使用技术。

这不是我在这里谈论的。我们试图做的是更接近你的个人计算机的东西, something that would be designed and tailored to help you play.

当我们开始查看有哪些虚拟机时,我们回顾过去,这带我们到了 Smalltalk。我读了这本名为《What the Dormouse Said》的书,它谈到了斯坦福的历史,以及人们当时对计算机可能是什么的乌托邦想法。这甚至在我对计算机感兴趣之前,学习他们当时的愿景让我对可能做的事情感到乐观。

那是我第一次接触虚拟机或字节码的想法。正如我之前提到的,没有所需的词汇在线查找信息非常困难。我不可能在不花时间学习 Smalltalk 的情况下了解个人计算。

显然,一旦你开始走那条路,会有人告诉你你真的必须尝试 Lisp 机器。我花时间学习 Symbolics 和 LVP。我了解了一种系统,整个系统可以被检查,一种试图以非常个人的方式进行计算。

如今,它类似于浏览器,你可以去你喜欢的网站,右键单击检查。现在越来越少这样,但有一段时间你可以检查网站以查看它是如何组合的。这是赋权,是那个时代的象征。

这在虚拟机上根本不起作用,但它是相关的,因为编写 Oberon 的 Niklaus Wirth 写了一本带有书的整个操作系统。

Oberon 书真的很好,尤其是如果你以开放的心态进入,没有先验知识或对编程的期望。这本书解释了如何从头开始构建操作系统。它使用像 Pascal 这样的语言,非常易读,比其他 ALGOL 语言更美。它教你做的第一件事是如何画画,作为一个非常视觉导向的人,我认为这很有趣。

在书中,Niklaus Wirth 提到了 P-machine。我开始形成虚拟机的想法,他只是简要提到,“哦!顺便说一下,我写了一个针对虚拟机的 Pascal 编译器。”我就像,“一种语言可以针对虚拟机?!什么?”他之所以能如此轻松地在平台之间移植编译器,是因为运行它的操作码极其简单,数量很少。

我当时想,这是一种吸引我的数据保存方式。

我学习了 Pascal。

Pascal 是一种美丽的语言。在上图中,我在 Macintosh 的模拟器中运行它。我喜欢我可以有一个整个操作系统运行在一个小窗口中,不是 Linux,不是一些大的 QEMU 镜像。它是一个小型的自包含系统,我可以破坏或快速重新开始。我可以通过以 128 倍速度运行模拟器来运行它并以 60 fps 做 3D,认为这很酷,证明了计算机如今有多快。

这让我了解了 C 的历史。

我将所有平台迁移到 Plan 9。Plan 9 有自己的 C 编译器,它不是 C89,它是自己的东西,一个不妥协的系统。

建造它的人并不计划用它赚钱,你可以真正看出它是爱的产物。这让我对个人计算可能是什么感到乐观。

Plan 9 不在虚拟机上运行,但它启发了另一个系统。他们在 Plan 9 期间学到的教训导致了一个名为 Inferno 的系统的构建,它在虚拟机上运行。

我想我开始理解虚拟机是什么。如果整个操作系统在虚拟机上运行,这就是我想做的。

像 Inferno 这样的系统的规模相当大,但在一个下午,我可以运行整个虚拟机的 C 代码。上面(图像)是它有的操作码。

它部分受到运行 Apple Newton 的实际硬件的启发。

我可以在一个下午运行它,并确切知道它是如何运行的。我会查看针对 Dis 虚拟机的编译器,并可以看到他们如何将问题空间减少到有限数量的操作。

过去努力摆脱分时系统的人会笑,或者他们会哭,因为我们被欺骗回到了计算机是在墙后完成的情况。你有一个终端,但那就是你的权力结束的地方。

我想要一种没有人能从我这里夺走的做计算机的方式。

我会读那些在周末编写整个操作系统的人,但我甚至无法将这个想法映射到我看到的东西上,缺少一座桥梁。

现代栈对我们真的不起作用,它不适用于我们在船上的限制。我们有 180 瓦的太阳能。我们刚花了整个夏天用两个 6 伏电池,这非常小。当你走那条路时,每次转弯人们都告诉你要增加太阳能电池板,或买更多电池。这是一种非常现代的解决问题的方式。实际上,像这样的技术(尤其是高科技)很少解决问题。它创造了许多其他问题,在帆船上这是非常直接的。增加太阳能意味着更多的风阻,更多东西飞出去切断我们肢体的机会。更多电池意味着船更重,会阻止我们能够逃离风暴。

帆船的限制给了我们创造力的空间,这些限制成了我们的一种游乐场。

我不是那种能构建 Plan 9、Oberon 或 Lisp 机器的程序员,但我知道我可以编写简单的 NES 游戏并移植它们。我无法在 NES 游戏中编写 NES 游戏,这太遗憾了。我想要一些完全自举的东西。

所以在看了 6502 之后,Commodore 64 模拟器极其复杂,超出我能理解的范围。它是我想象中一个人能理解的极限。它似乎是一个简单的系统,只是一个盒子,但为它编写模拟器不止是一个周末项目。我在寻找一些我可以在一个周末搞定的事情。

6502 有很多助记符。当尝试将 6502 实现为虚拟机时,有可能在一周内或一个周末(如果你不做其他事情)做一个幼稚的实现。我的 C 知识非常有限,但幸运的是我有帮助。我想知道这个指令集是否可以进一步减少…

这让我思考复杂性,以及简单性意味着什么。数学家 Kolmogorov 说,任何系统的复杂性指数是能生成特定字符串的程序长度。我真的很喜欢这种看待复杂性和简单性的方式,因为如今它有些 convoluted。如果你真的不了解硬件,似乎每个人都在试图让程序员舒适,而不是专注于制作实际快速的产品。

我认识的大多数业余程序员使用类型系统、内存安全、各种训练轮(我在这里开玩笑,如果你是一个大团队,请务必使用类型系统)。当我独自工作时,我想将问题空间减少到尽可能小的事情。我不太喜欢编程,将来我可能会更讨厌它,所以我希望未来的我能在最多一个周末重新实现我的整个系统。

那么这带我到哪?6502 超出了我希望做的范围,因为已经做了两次,我认为我没有能力再做一次。

回顾贝尔实验室的同一时代,那时人们会构建纸计算机来教孩子理解程序计数器是什么,事物如何在程序中移动,以及如何导航字节码。

没有人能从你那里夺走纸计算机。只要你有纸和笔,你仍然可以解决问题,尽管缓慢和更痛苦,但这是一种可以轻松移植的计算形式。

当我看 BBC 的 Domesday 书时,我注意到 Alan Kay(Smalltalk)也有一个与我想做的事情一致的项目。他认为,“Smalltalk 是一个虚拟机,一个多小的虚拟机可能运行 smalltalk-72。”

他写了一篇名为《2015 年的楔形文字板》的论文,他所有这些关于计算机的词语病毒式传播。他说诸如“Lisp 是编程的麦克斯韦方程”之类的话。作为一个极简主义极客,我很高兴听到这个,这正是我想要的,但然后研究 Lisp,我认为一种设计上产生垃圾的语言并不是我真正想要的。这更接近一点,但它是一个寄存器机器,我没有看到它如何映射到 Smalltalk。

所以 ChifirVM 并不是我真正想要的,但外面有很多其他做计算的方式。立刻,我陷入了一个指令集计算机,如 SUBLEQ。我认为它是一个令人厌恶的

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计