新媒体艺术家 Daniel Temkin 将其在 2015 年创立的神秘编程语言 Folders 重新推向极客视野。这门语言没有一行可见的代码文本,没有一个传统意义上的脚本文件,所有逻辑、变量与控制流全部由层层嵌套的空文件夹及其首字母排序来编码。作者甚至在系统中展示了一个极端案例:包含 352,449 个文件夹的目录,在 Windows 文件属性窗口中赫然标注着占用 0 字节。
表面上看,这是一场将程序彻底“去物质化”的极客恶作剧,甚至演变成某种在 finite 硬盘中实现“无限存储”的都市传说。但这绝非免费的午餐。操作系统图形界面呈现的零开销,本质上是上层抽象对底层存储记账的系统性遮蔽;在 NTFS 文件系统的真实物理世界里,每一个空目录都在暗中蚕食着宝贵的元数据表,甚至可能演变成不可逆的磁盘空间灾难。
拿掉所有代码文件后,逻辑如何运转?
计算机学术界向来有探索极端媒介的传统。受经典隐形编程语言 Whitespace(仅用空格、制表符和换行符编码)启发,Temkin 试图寻找一种比空文本更虚无的载体。他的结论是文件系统里的空文件夹。在 Git 等现代版本控制工具眼中,没有内容的文件夹由于毫无意义会被直接忽略;而在 Folders 的规则体系内,嵌套层级成了唯一的逻辑载体。
Folders 本质上是将编译器底层的抽象语法树(AST)直接实体化为文件系统的树状物理结构。在具体语法实现上,它是一个纯粹的命令式语言。指令类型不取决于文件夹的名称,而是由节点下按字典序排在首位的子文件夹所包含的目录数量决定。
0 个文件夹 = if
1 个文件夹 = while
2 个文件夹 = declare
3 个文件夹 = let
4 个文件夹 = print
5 个文件夹 = input
这种规则向下递归延伸至表达式与变量类型。例如,包含 1 个子文件夹代表加法表达式,包含 2 个代表减法;声明变量类型时,1 个子文件夹映射为浮点数,2 个代表字符串,3 个则代表字符。程序的所有临时数据同样被编码为文件夹。在 GitHub 社区中,除了原作者 rottytooth 提供的 C# 官方实现(支持通过 /s 参数直接转译为 C# 源码)之外,开发者还开源了 Python 版本 Folders.py。工程师只需通过简单的命令安装,就能在终端直接运行这种纯目录程序,甚至利用 -l 参数反向还原出可读的 Python 代码。
一个在屏幕上看似空空如也的目录,经过这一套精巧的树状结构递归,便能够具备图灵完备的表达能力。然而,正是这种看似高妙的“纯结构计算”,在底层存储系统层面狠狠撞上了物理现实的硬墙。
致命的“0 字节”与 NTFS 的隐形账单
大量开发者初见 Folders 时,往往被 Windows 属性窗口显示的 0 bytes 所迷惑,误以为找到了操作系统不计入容量统计的存储漏洞。但事实上,这种认知落差来自现代操作系统桌面环境在数据记账上的偷工减料。
Windows 图形界面统计的所谓文件夹大小,指的仅仅是常规文件内部携带的数据流尺寸。如果一个文件夹内部没有存放任何具体文件,其统计计数器就会毫无保留地返回零。然而在存储驱动层,NTFS 文件系统维护目录树的开销是真金白银的物理存在。
操作系统 UI 呈现的完全免费,只是将底层硬件的沉重账单藏进了死角。
在 NTFS 架构中,系统通过主文件表(Master File Table,简称 MFT)管理驱动器内的所有对象。根据微软官方的技术规范,哪怕只是一个名字为空的空文件夹,系统也必须在 MFT 中为其开辟至少一条基础记录。每一条这样的基础记录,通常都需要硬性占用 1024 字节(1 KiB)的物理磁盘空间,用来保存安全描述符、目录索引及基础属性。
算一笔账就会发现这种结构的代价有多大:在硬盘上创建 100 万个空文件夹,单是 MFT 基础记录就需要硬生生吃掉约 0.95 GiB 的底层物理空间。这还没有算上目录索引树(B 树)在层级扩张时所分配的大量索引缓冲区。
更致命的隐患在于文件系统的元数据回收机制。当用户在 Windows 下清空这些用于编写复杂算法的数十万个空文件夹后,NTFS 为了维持后续写入性能,分配给 MFT 的元数据空间通常不会自动收缩释放给普通文件分区。换句话说,运行 Folders 程序不仅不能实现所谓的无限存储,反而在用大量垃圾元数据永久性地污染主文件表,让磁盘性能在不知不觉中退化。
Temkin 本人在 2015 年接受明尼苏达大学采访时便直言不讳:所谓借助文件夹实现无限存储只是一种概念艺术层面的构想,一旦回到工程物理维度,只要创建的目录足够多,存储设备依然会被迅速耗尽。
- 提醒.不要在生产环境的系统盘上运行大规模生成深层目录的 Folders 程序,NTFS 的 MFT 空间膨胀后极难无损压缩,盲目压测可能导致磁盘索引性能出现不可逆的恶化。
现代系统对“物理现实”的过度封装
从 Whitespace 到 Folders,概念黑客与系统艺术家们始终在用极端的方式挑战编程范式。但在这些实验性代码的背后,真正值得软件工程师审视的,是现代操作系统为了追求交互友好,对底层真实资源进行的层层遮蔽。
现代计算设备用漂亮的图形化文件夹图标和“0 字节”的轻巧标签,让终端用户误以为容器本身没有质量。然而计算机的运行没有神话,任何层级关系、指针跳转、属性定义,都由物理介质上的晶体管与磁道状态承载。Folders 语言表面上是一场去物质化的探索,但转译器每一次读取层级,每一次根据字典序遍历目录,都在文件系统的内核驱动中引发海量的 I/O 调度和元数据锁竞争。
- 结论.极端小众语言从来不是用来生产软件的,它们的价值在于充当刺破系统黑盒的探针;当一个荒谬的艺术构想撞上底层驱动的底层逻辑,它照出的恰恰是现代操作系统在抽象封装与物理真相之间的巨大裂痕。
