Folders 是一种非文本语言,目录即代码,驱动器空间无限。代码只由嵌套与顺序表达,文件夹名称除字母排序外都被忽略,它们是纯粹的有序树。受 Whitespace 启发,它追求去物质化:空文件夹只是累赘,在 Git 中会被忽略。Folders 最初是 Windows 语言,那里的文件夹完全不占磁盘空间——创建 352,449 个文件夹后查看属性,大小仍是 0 字节。把数据编码进文件夹名,即得无限存储,无须担心空间耗尽。
正文
创建于 2015 年,2026 年更新,是 Forty-Four Esolangs 之一,作者还创造了 Rivulet 和 Velato。
在这里,目录即代码,驱动器空间无限。
关于
Folders 是一种非文本语言,代码仅通过包含关系和顺序来表达。文件夹的名称被忽略,只按字母顺序排序。换句话说,它们是纯粹的有序树。

Folders 受 Whitespace 语言启发,致力于去物质化的代码这一理念。它始于一个问题:还有什么比一个没有可见文本的文件更空?空文件夹是杂乱无用之物,是个没有用途的附属品。在 git 中,它会被完全忽略(因此,建议 Folders 程序在目录最深处放上 .gitignore 文件)。
Folders 最初是一种 Windows 语言。在 Windows 中,文件夹是衡量空无的更极端方式:它们根本不占磁盘空间。证据是:创建 352,449 个文件夹,然后查看其属性。通过这种方式,Folders 不仅提供了一种去物质化的代码方式,还提供了无限的存储容量。把你所有的数据编码进文件夹名称,就再也不用担心空间耗尽。
对于使用其他操作系统的人,下面的模拟器可以让人体验 Folders 如何管理数据和代码。
Folders 模拟器
![]()
模拟器界面有 Load、Open...、Run、Step、Pause、Reset 等按钮,以及 Call Stack、Locals、Constants 面板。Folders Interpreter / FFS Emulator [Version 0.2] 是一个基于 Windows 的文件系统与编程语言,号称能在有限空间内提供无限数据存储(Creative Commons CC-BY-4.0,2020,Daniel Temkin)。
输入 'dir' 可查看预加载程序列表;输入 'cd [路径]' 切换目录,或输入 'cd' 显示当前目录;输入 'load [路径]' 加载本地 Folders 程序;输入 'folders .' 在当前目录运行 Folders。提示符为 FLDR>。
原始实现可在 GitHub 上找到:https://github.com/rottytooth/Folders。
编码
每个命令文件夹至少有一个子文件夹。按字母顺序排列的第一个文件夹中的子文件夹数量表示命令类型;参数放在第二个文件夹里;有些命令需要第三个文件夹。表达式同理:第一个子文件夹中的文件夹数量决定它是哪种表达式。完整语言规范见下文。
临时数据也以文件夹形式存储;与 Folders 代码不同,存储数据的是文件夹的名称。
Folders 文件系统(FS)
Folders 解释器不创建临时文件;任何没有立即保存在内存中的东西都存为一组临时文件夹。与 Folders 代码不同,文件夹的名称本身存储数据。Folders 偏好的 I/O 是另一组文件夹。这意味着你可以把所有数据编码进文件夹,完全绕过文件的“物质领域”,并获得无限的磁盘空间(风险自负)。Folders 语言用于代码,Folders FS 用于数据存储。

可视化
一个 Folders 程序是一个以 nil 结尾的嵌套列表。最简单的形态就是纯粹的包含与顺序,就像下面这个全数组的 JSON:
[[[[],[]],[],[[]]],[[[],[]],[],[[],[]]],[[[],[]],[],[[],[],[]]],[[[],[]],[],[[],[],[],[]]],[[[],[],[]],[[]],[[[],[],[],[],[]],[],[[[],[],[],[]]]]],[[[],[],[]],[[],[]],[[[],[],[],[],[]],[],[[[],[],[],[[]]]]]],[[[],[],[]],[[],[],[],[]],[[[],[],[],[],[]],[],[[[],[],[],[]]]]],[[[]],[[[],[],[],[],[],[],[],[]],[[],[[],[],[],[]]],[[[],[],[],[],[]],[],[[[],[],[],[[]]],[[[]],[[]],[[]],[]]]]],[[[[],[],[],[]],[[],[[]]]],[[[],[],[],[]],[[[],[],[],[],[]],[[],[],[]],[[[[]],[],[[]],[]]]]],[[[],[],[]],[[],[],[]],[[[]],[[],[[]]],[[],[[],[]]]]],[[[],[],[]],[[]],[[],[[],[]]]],[[[],[],[]],[[],[]],[[],[[],[],[]]]],[[[],[],[]],[[],[],[],[]],[[[]],[[[]],[[],[],[],[]]],[[[],[],[],[],[]],[],[[[],[],[],[[]]]]]]]]]]
斐波那契程序
JS 模拟器也是用这种形式来保存和读取 Folders 程序的。
不过,也可以有其他可视化系统。Folders 程序是“作为结构的内容”,可以应用于任何类型的原始数据。这里有一个以等高线图形式呈现的 Truth Machine。较粗的线条是容器,文件夹的顺序从左上角(西北角)开始,按逆时针方向读取。
其他可视化形式还可以是家谱(全部为单亲)、植物分枝结构(像分叉的麦秆),或是迷宫中的路径。
红点表示从容器到单个子文件夹的阈值。
语言规范
这门语言本身是一种非常简单的命令式语言,语义规则很少。
对于命令和表达式,其第一个子文件夹中的文件夹数量决定了它们的用途。类型则直接使用。
命令
| 命令 | 文件夹数量 | 说明 | | --- | --- | --- | | if | 0 个文件夹 | 第二个子文件夹存放表达式,第三个存放命令列表 | | while | 1 个文件夹 | 第二个子文件夹存放表达式,第三个存放命令列表 | | declare | 2 个文件夹 | 第二个子文件夹存放类型,第三个存放变量名(以文件夹数量表示) | | let | 3 个文件夹 | 第二个子文件夹存放变量名(以文件夹数量表示),第三个存放表达式 | | print | 4 个文件夹 | 第二个子文件夹存放表达式 | | input | 5 个文件夹 | 第二个子文件夹存放变量名 |
表达式
| 类型 | 文件夹数量 | 说明 | | --- | --- | --- | | variable | 0 个文件夹 | 第二个子文件夹存放变量名 | | add | 1 个文件夹 | 第二个子文件夹存放要相加的第一个表达式,第三个存放第二个表达式 | | subtract | 2 个文件夹 | 第二个子文件夹存放要相减的第一个表达式,第三个存放第二个表达式 | | multiply | 3 个文件夹 | 第二个子文件夹存放要相乘的第一个表达式,第三个存放第二个表达式 | | divide | 4 个文件夹 | 第二个子文件夹存放要相除的第一个表达式,第三个存放第二个表达式 | | literal value | 5 个文件夹 | 第二个子文件夹存放值的类型(例如两个文件夹表示字符串),第三个存放值 | | equal to | 6 个文件夹 | 第二个和第三个文件夹存放要比较的表达式 | | greater than | 7 个文件夹 | 第二个和第三个文件夹存放要比较的表达式 | | less than | 8 个文件夹 | 第二个和第三个文件夹存放要比较的表达式 |
类型
| 类型 | 文件夹数量 | | --- | --- | | float | 1 个文件夹 | | string | 2 个文件夹 | | char | 3 个文件夹 |
GitHub 上的参考编译器:https://github.com/rottytooth/Folders
评论
社区整体沉浸在荒诞而兴奋的情绪里,多数人把这个以文件系统目录结构为语法的深奥编程语言视为毫无意义却极具魅力的创意,甚至觉得它“美”;少数人则从工程角度指出它写一条语句都极其费劲、且依赖文件系统元数据导致效率低得离谱。分歧主轴是创意上的惊艳与实用性上的生理不适之间的对立。
认为它荒诞、疯狂却充满魅力
- 不少评论被这种脑洞折服:觉得它毫无意义、极其疯狂,但同时又美丽、令人印象深刻,是 AI 也难以产出的创意。(较多人) > 这东西太疯狂、毫无意义……但我爱它,是 AI 绝不可能想出来的东西。(@nunodonato)
对它的语法繁琐和存储低效感到生理不适
- 有人一看到语法就想象出写一条语句要付出的巨大努力,甚至产生生理性反感;也有人指出文件系统元数据本身占用空间,这种表达方式低效到离谱。(少数人) > 看到语法时,我想象了一下写一条语句要花多少功夫,立刻生理性反感。(@anonymous908213)
认为标题让人立刻联想到 Rust
- 有人只读到标题就马上想到了 Rust,属于跑题式的联想。(少数人) > 看到标题我立刻想到了 Rust。(@Surac)
有价值的补充
- 这个深奥编程语言并非首次出现:有人回忆几年前的一次 CTF 中就用过它,当时便让人觉得非常搞笑。
- 有人用 sed 替换命令 “s/directories/folders !” 开玩笑,要把 “directories” 替换成 “folders”,调侃目录与文件夹的叫法差异,体现了社区的玩梗情绪。