可查询的可执行文件:程序即数据库

Queryable Executables

可查询的可执行文件:程序即数据库

我惊喜地发现,将可执行文件设计为 SQLite 数据库的 SELF 格式引发了广泛共鸣。在这个架构中,程序不仅是代码,更是包含自身状态、路由和日志的数据库。通过 binfmt_misc 机制,程序可以直接读写自身文件,实现事务性更新。这意味着我们不再需要 /var 或 /tmp 等文件系统,所有状态都内嵌在单一文件中。self-httpd 演示了这种理念:一个单文件 Web 服务器,其页面内容、访问记录和按钮点击数据都存储在同一个 SQLite 文件中。部署变得像 scp 传输一个文件一样简单,而更新则变成了数据库迁移。这种'可查询的可执行文件'让 SQL 工具链直接作用于程序本身,重新定义了软件分发的边界。

程序就是数据库,数据库就是程序。
  1. larodi

    我对这么多东西最终都坍缩成一个领域——SQL——感到惊讶。

    也许更准确的说法是“所有数据,包括代码,都可以用表格表示,尽管它们本质上是图结构”,或者说“一切最终都回归到表格”,甚至“关系代数就足够了”。但我强烈反对将 SQL 本身视为一个独立的领域,也反对说一切坍缩成了 SQL。

    我想你同样可以把它坍缩成 DATALOG,也就是 PROLOG。所以,这里演示的东西或许是——一切最终都坍缩成了语法……

  2. yjftsjthsd-h

    > 我们不仅能将整个发行版坍缩,还能将每个应用程序的所有状态都坍缩到单个文件中,从而消除对 /var/、/tmp/、/home/ 或其他任何文件系统的需求。程序可以将自己的状态存储在它正在运行的同一个文件中,并且可以事务性地完成这一操作。

    一方面:我不认为我想要这样。将静态内容包含在二进制文件中当然很有意义。然而,将可写的运行时数据存储在那里感觉太乱了;我更喜欢只读的二进制文件,并传入一个可写的状态目录(值得一提的是,我在 Nix 和其他不可变发行版上花了很多时间)。

    另一方面:这是我很久以来见过的最酷、最有趣的东西,我绝对想看到它被进一步发扬光大。当黑客精神弥漫在空气中时,谁还在乎那种完美运营化的不可变部署呢?

    我敢打赌,你可以利用这个来实现 APE 所做的另一件事:胖二进制文件(fat binaries)。如果程序文本存储在数据库中,再多一行数据又算得了什么?只需执行:

    SELECT text FROM executable WHERE arch = $(uname -m)

    然后我们就起飞了:)

    编辑:再仔细想想,这对 Smalltalk 来说简直完美;你可以将虚拟机和镜像都放在一个文件中。

  3. rao-v

    这太疯狂了,而且危险地接近愚蠢,这也让它成为我今年在 Hacker News 上见过的最好的东西之一。

    绝对精彩。

  4. JaumeGreen

    这就好比 Lisp、APL 或 Smalltalk 的程序镜像,只不过以 SQL 为驱动力。

    旧事物以新面貌重现。我这话并非贬义。有很多“老”想法其实是非常棒的主意,只是当时没能胜出,但未来可能会强势回归。

  5. jdub

    与其在二进制文件后处理阶段添加应用程序(非 SELF)模式,不如在提供服务前运行数据库迁移。这样,每次启动进程时,应用程序都会创建或升级自己的模式。

    SELF 升级(哈哈,自我升级)和回滚流程可能需要一些更……花哨的……操作。

    你的示例涉及将旧数据复制到新二进制文件中,但随后你必须将新二进制文件移动到部署位置。这意味着服务中断:停止服务、迁移数据、替换文件、启动服务。

    如果升级过程更像……将新的 SELF 数据写入旧二进制文件,发送 SIGHUP 信号,然后服务通过 fork+exec 自我重启,同时执行类似 haproxy 的零停机文件描述符交接,会怎样?

    目前替换现有文件中的 SELF 数据是安全的,因为你无法将段 mmap 到内存中。但如果你最终能想出一些巧妙的 BLOB 对齐 mmap 技巧,你就可以像数据迁移一样进行 SELF 升级!插入段/符号,fork+exec,然后数据迁移清理掉旧代码。:-D

    更新 SELF 模式以允许多组段和符号可以实现这种升级技巧,还能做其他花哨的事情……比如瘦型多架构二进制文件,其中只有代码段不同。

    BLOB 对齐还应该意味着更高效的静态资源服务以及一大堆其他便利之处……绝对值得深入调查。

    然而——非常强烈的然而——尽管这很有趣,但我永远、永远、永远都不会允许一个 int […]

同日更多故事

2026-08-26