whitespace 编程语言

简述

WhiteSpace 是一种只用空白字符(空格,TAB和回车)编程的语言,而其它可见字符统统会被当做注释对待。

它本身是个指令式、基于堆栈的语言。其程式运行在上的虚拟机器均有一个堆栈(Stack)和堆(Heap)。程序员可自由将整数推进堆栈中(只可以是整数,因为暂时并无浮点数或实数工具),同时也可以通过堆作为变量和数据结构的暂存区。

借助这种语言,可以在满篇空白的代码中插入一篇文章,从而在看起来完全无关的文章中隐藏一段代码。

语法

命令由一系列空格、制表位和换行符组成。所有其他字符都被忽略,因此可用于注释。例如,tab-space-space-space 执行堆栈顶部两个元素的算术加法。

命令的前一部分将被翻译为指令修改参数(IMP),IMP 后面所跟随的是操作。

IMP 指令集如下:

IMP 相应指令
[Space] 栈操作
[Tab][Space] 算术
[Tab][Tab] 堆操作
[LF] 指令控制
[Tab][LF] I/O

IMP 所对应的操作集如下:

IMP 命令 参数 Meaning
[Space] [Space] 数字 将数字压入栈 (push)
[Space] [LF][Space] - 复制栈顶
[Space] [Tab][Space] 数字 拷贝栈中的第n个(n由参数给出)数据到栈顶
[Space] [LF][Tab] - 交换栈顶的两个值
[Space] [LF][LF] - 丢弃栈顶
[Space] [Tab][LF] 数字 保留栈顶的同时丢弃n个数据
[Tab][Space] [Space][Space] - 加法
[Tab][Space] [Space][Tab] - 减法
[Tab][Space] [Space][LF] - 乘法
[Tab][Space] [Tab][Space] - 除法
[Tab][Space] [Tab][Tab] - 求模
[Tab][Tab] [Space] - 保存到堆
[Tab][Tab] [Tab] - 从堆中取出数据
[LF] [Space][Space] 标签 在该处设定一个跳转标签
[LF] [Space][Tab] 标签 调用子程序 (call)
[LF] [Space][LF] 标签 跳转标签 (goto)
[LF] [Tab][Space] 标签 如果栈顶为0则跳转标签 (jz)
[LF] [Tab][Tab] 标签 如果栈顶不为0则跳转标签 (jnz)
[LF] [Tab][LF] - 结束子程序 (retn)
[LF] [LF][LF] - 结束程序 (exit)
[Tab][LF] [Space][Space] - 输出栈顶字符 (printc)
[Tab][LF] [Space][Tab] - 输出栈顶数字 (printn)
[Tab][LF] [Tab][Space] - 读取字符放置栈顶
[Tab][LF] [Tab][Tab] - 读取数字放置栈顶

数字

数字由空格 (0) 和制表符 (1) 组成,并以换行符终止。数字中的第一个空格/制表符表示数字的符号,如果是空格,则数字为正,如果是制表符,则数字为负。其余的尾随空格和制表符代表二进制数的其余部分。

标签

标签只是以 [LF] 结尾的空格和制表符列表。只有一个全局命名空间,因此所有标签都必须是唯一的。

编辑和运行

我们可以在 https://vii5ard.github.io/whitespace/ 中对 whitespace 进行编辑和运行,同时有着许多示例代码可供参考。

在运行的时候,该网站 IDE 可以查看翻译的伪汇编代码(whitespace 虚拟机字节码),并且可以时刻中断来查看堆栈情况,方便调试程序和观察代码运行。